Если вы начали изучать Ansible, в какой-то момент времени, вы придете к модулю deploy_helper. При первом изучении могут возникнуть вопросы и недопонимания. Причина заключается в скудной информации на русскоязычных порталах. Оригинальный сайт не объясняет многие моменты и их приходиться изучать с нуля.
Давайте попробуем разобраться, что делает deploy_helper. Для этого посещаем официальный сайт:
docs.ansible.com/ansible/latest/modules/deploy_helper_module.html
Внимание: Сразу проговорим: настройку Ansible и некоторые моменты я опускаю. Так как это не статья по первоначальному обучению Ansible.
Скопируем основную часть сюда, это будет инструкция для нас:
# Typical usage - name: Initialize the deploy root and gather facts deploy_helper: path: /path/to/root - name: Clone the project to the new release folder git: repo: git://foosball.example.org/path/to/repo.git dest: '{{ deploy_helper.new_release_path }}' version: v1.1.1 - name: Add an unfinished file, to allow cleanup on successful finalize file: path: '{{ deploy_helper.new_release_path }}/{{ deploy_helper.unfinished_filename }}' state: touch - name: Perform some build steps, like running your dependency manager for example composer: command: install working_dir: '{{ deploy_helper.new_release_path }}' - name: Create some folders in the shared folder file: path: '{{ deploy_helper.shared_path }}/{{ item }}' state: directory with_items: - sessions - uploads - name: Add symlinks from the new release to the shared folder file: path: '{{ deploy_helper.new_release_path }}/{{ item.path }}' src: '{{ deploy_helper.shared_path }}/{{ item.src }}' state: link with_items: - path: app/sessions src: sessions - path: web/uploads src: uploads - name: Finalize the deploy, removing the unfinished file and switching the symlink deploy_helper: path: /path/to/root release: '{{ deploy_helper.new_release }}' state: finalize
1. name: Initialize ...
Начнем с самого начала, и запустим первую часть "Initialize the deploy...". Для этого создадим простой playbook "dh.yml", который инициализирует каталог и отразит содержимое переменных:
--- - name: deploy hosts: all become: yes tasks: - name: Initialize the deploy root and gather facts deploy_helper: path: /tmp/deploy/depdirDEL - debug: var: deploy_helper - debug: var: deploy_helper.new_release_path
Запускаем:
ansible-playbook dp.yml
Смотрим на результат. Начнем с удаленного сервера:
root@debi:/tmp/deploy# pwd /tmp/deploy root@debi:/tmp/deploy# tree . └── depdirDEL ├── releases └── shared 3 directories, 0 files
Создался каталог depdirDEL, его название можете прописать как вам угодно. Мы написали в коде "depdirDEL". Проверяем вывод запуска playbook:
ok: [debi] => { "deploy_helper": { "current_path": "/tmp/deploy/depdirDEL/current", "new_release": "20191029131720", "new_release_path": "/tmp/deploy/depdirDEL/releases/20191029131720", "previous_release": null, "previous_release_path": null, "project_path": "/tmp/deploy/depdirDEL", "releases_path": "/tmp/deploy/depdirDEL/releases", "shared_path": "/tmp/deploy/depdirDEL/shared", "unfinished_filename": "DEPLOY_UNFINISHED" } }
И вторая переменная:
ok: [debi] => { "deploy_helper.new_release_path": "/tmp/deploy/depdirDEL/releases/20191029131720" }
2. name: Clone...
Тут надо пояснить: для простоты понимания, мы упростим данный пункт. Просто заменим на копирование (предварительно создадим файл 777del.py) и назначим права:
--- - name: deploy hosts: all become: yes tasks: - name: Initialize the deploy root and gather facts deploy_helper: path: /tmp/deploy/depdirDEL - debug: var: deploy_helper - debug: var: deploy_helper.new_release_path - name: Create directory mode become: yes file: path: "{{ deploy_helper.new_release_path }}" owner: debiuser group: debiuser mode: 0775 state: directory - name: Clone the project to the new release folder (COPY FILE) copy: src=./777del.py dest={{ deploy_helper.new_release_path }}/
Проверяем результат на сервере:
root@debi:/tmp/deploy# tree . └── depdirDEL ├── releases │ └── 20191029133200 │ └── 777del.py └── shared 4 directories, 1 file
3. name: Add an unfinished...
Добавим в наш файл следующие строчки:
- name: Add an unfinished file, to allow cleanup on successful finalize file: path: '{{ deploy_helper.new_release_path }}/{{ deploy_helper.unfinished_filename }}' state: touch
Запускаем и проверяем результат:
root@debi:/tmp/deploy# tree . └── depdirDEL ├── releases │ ├── 20191029133200 │ │ └── 777del.py │ └── 20191029133539 │ ├── 777del.py │ └── DEPLOY_UNFINISHED └── shared 5 directories, 3 files
4. name: Finalize the deploy ...
Дополняем наш код, который делает финальную часть deploy:
- name: Finalize the deploy, removing the unfinished file and switching the symlink deploy_helper: path: /tmp/deploy/depdirDEL release: '{{ deploy_helper.new_release }}' state: finalize
Проверяем:
root@debi:/tmp/deploy# tree . └── depdirDEL ├── current -> /tmp/deploy/depdirDEL/releases/20191029133736 ├── releases │ ├── 20191029133200 │ │ └── 777del.py │ └── 20191029133736 │ └── 777del.py └── shared 6 directories, 2 files
5. name: Add symlinks...
В завершении добавляем код с symlinks:
- name: Add symlinks from the new release to the shared folder file: path: /opt/deploy/depdirDEL src: '{{ deploy_helper.new_release_path }}' state: link
*ВНИМАНИЕ: путь указан другой "path: /opt/deploy/depdirDEL"! Обратите на это внимание! Предварительно нужно создать каталог "/opt/deploy", иначе схватите ошибку!
Проверяем:
root@debi:/tmp/deploy# tree . └── depdirDEL ├── current -> /tmp/deploy/depdirDEL/releases/20191029134325 ├── releases │ ├── 20191029133200 │ │ └── 777del.py │ ├── 20191029133736 │ │ └── 777del.py │ └── 20191029134325 │ └── 777del.py └── shared 7 directories, 3 files
Так же смотрим и другой каталог:
root@debi:/tmp/deploy# tree /opt/deploy/ /opt/deploy/ └── depdirDEL -> /tmp/deploy/depdirDEL/releases/20191029134325 1 directory, 0 files
6. Проверяем итоговый файл
По этим шагам, можно просмотреть, что происходит на каждом этапе. Надо отметить, что некоторые данные не точные, так как мы каждый раз запускали файл "dh.yml" с новым добавленным кодом, к уже существующему. При этом на выводе создались лишние данные. Поэтому, мы очистим все каталоги и запустим код ниже с самого начала:
--- - name: deploy hosts: all become: yes tasks: - name: Initialize the deploy root and gather facts deploy_helper: path: /tmp/deploy/depdirDEL - debug: var: deploy_helper - debug: var: deploy_helper.new_release_path - name: Create directory mode become: yes file: path: "{{ deploy_helper.new_release_path }}" owner: debiuser group: debiuser mode: 0775 state: directory - name: Clone the project to the new release folder (COPY FILE) copy: src=./777del.py dest={{ deploy_helper.new_release_path }}/ - name: Add an unfinished file, to allow cleanup on successful finalize file: path: '{{ deploy_helper.new_release_path }}/{{ deploy_helper.unfinished_filename }}' state: touch - name: Finalize the deploy, removing the unfinished file and switching the symlink deploy_helper: path: /tmp/deploy/depdirDEL release: '{{ deploy_helper.new_release }}' state: finalize - name: Add symlinks from the new release to the shared folder file: path: /opt/deploy/depdirDEL src: '{{ deploy_helper.new_release_path }}' state: link
Запускаем "dh.yml":
ansible-playbook dp.yml PLAY [deploy] ************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************** ok: [debi] TASK [Initialize the deploy root and gather facts] ************************************************************* changed: [debi] TASK [debug] *************************************************************************************************** ok: [debi] => { "deploy_helper": { "current_path": "/tmp/deploy/depdirDEL/current", "new_release": "20191029135617", "new_release_path": "/tmp/deploy/depdirDEL/releases/20191029135617", "previous_release": null, "previous_release_path": null, "project_path": "/tmp/deploy/depdirDEL", "releases_path": "/tmp/deploy/depdirDEL/releases", "shared_path": "/tmp/deploy/depdirDEL/shared", "unfinished_filename": "DEPLOY_UNFINISHED" } } TASK [debug] *************************************************************************************************** ok: [debi] => { "deploy_helper.new_release_path": "/tmp/deploy/depdirDEL/releases/20191029135617" } TASK [Create directory mode] *********************************************************************************** changed: [debi] TASK [Clone the project to the new release folder (COPY FILE)] ************************************************* changed: [debi] TASK [Add an unfinished file, to allow cleanup on successful finalize] ***************************************** changed: [debi] TASK [Finalize the deploy, removing the unfinished file and switching the symlink] ***************************** changed: [debi] TASK [Add symlinks from the new release to the shared folder] ************************************************** changed: [debi] PLAY RECAP ***************************************************************************************************** debi : ok=9 changed=6 unreachable=0 failed=0
Проверяем сервер:
root@debi:~# tree /tmp/deploy /tmp/deploy └── depdirDEL ├── current -> /tmp/deploy/depdirDEL/releases/20191029135617 ├── releases │ └── 20191029135617 │ └── 777del.py └── shared 5 directories, 1 file root@debi:~# tree /opt/deploy /opt/deploy └── depdirDEL -> /tmp/deploy/depdirDEL/releases/20191029135617 1 directory, 0 files
7. Проверка работы:
Вносим какие-то данные в наш испытуемый файл, сохраняем и запускам playbook повторно:
tree /tmp/deploy /tmp/deploy └── depdirDEL ├── current -> /tmp/deploy/depdirDEL/releases/20191029140359 ├── releases │ ├── 20191029135617 │ │ └── 777del.py │ └── 20191029140359 │ └── 777del.py └── shared 6 directories, 2 files root@debi:~# tree /opt/deploy /opt/deploy └── depdirDEL -> /tmp/deploy/depdirDEL/releases/20191029140359 1 directory, 0 files
Не будем ничего менять, запустим еще раз playbook:
tree /tmp/deploy /tmp/deploy └── depdirDEL ├── current -> /tmp/deploy/depdirDEL/releases/20191029140626 ├── releases │ ├── 20191029135617 │ │ └── 777del.py │ ├── 20191029140359 │ │ └── 777del.py │ └── 20191029140626 │ └── 777del.py └── shared 7 directories, 3 files root@debi:~# tree /opt/deploy /opt/deploy └── depdirDEL -> /tmp/deploy/depdirDEL/releases/20191029140626 1 directory, 0 files
Теперь намного проще проанализировать работу данного модуля Ansible. Спасибо за что, что читали нашу статью)
Источник: http://linuxsql.ru