You are here

Разбираем построчно модуль deploy_helper от Ansible

Linux: 

Если вы начали изучать Ansible, в какой-то момент времени, вы придете к модулю deploy_helper. При первом изучении могут возникнуть вопросы и недопонимания. Причина заключается в скудной информации на русскоязычных порталах. Оригинальный сайт не объясняет многие моменты и их приходиться изучать с нуля.

Разбираем построчно deploy_helper от Ansible

Давайте попробуем разобраться, что делает deploy_helper. Для этого посещаем официальный сайт:
docs.ansible.com/ansible/latest/modules/deploy_helper_module.html

Внимание: Сразу проговорим: настройку Ansible и некоторые моменты я опускаю. Так как это не статья по первоначальному обучению Ansible.

Скопируем основную часть сюда, это будет инструкция для нас:

  1. # Typical usage
  2. - name: Initialize the deploy root and gather facts
  3. deploy_helper:
  4. path: /path/to/root
  5. - name: Clone the project to the new release folder
  6. git:
  7. repo: git://foosball.example.org/path/to/repo.git
  8. dest: '{{ deploy_helper.new_release_path }}'
  9. version: v1.1.1
  10. - name: Add an unfinished file, to allow cleanup on successful finalize
  11. file:
  12. path: '{{ deploy_helper.new_release_path }}/{{ deploy_helper.unfinished_filename }}'
  13. state: touch
  14. - name: Perform some build steps, like running your dependency manager for example
  15. composer:
  16. command: install
  17. working_dir: '{{ deploy_helper.new_release_path }}'
  18. - name: Create some folders in the shared folder
  19. file:
  20. path: '{{ deploy_helper.shared_path }}/{{ item }}'
  21. state: directory
  22. with_items:
  23. - sessions
  24. - uploads
  25. - name: Add symlinks from the new release to the shared folder
  26. file:
  27. path: '{{ deploy_helper.new_release_path }}/{{ item.path }}'
  28. src: '{{ deploy_helper.shared_path }}/{{ item.src }}'
  29. state: link
  30. with_items:
  31. - path: app/sessions
  32. src: sessions
  33. - path: web/uploads
  34. src: uploads
  35. - name: Finalize the deploy, removing the unfinished file and switching the symlink
  36. deploy_helper:
  37. path: /path/to/root
  38. release: '{{ deploy_helper.new_release }}'
  39. state: finalize

1. name: Initialize ...
Начнем с самого начала, и запустим первую часть "Initialize the deploy...". Для этого создадим простой playbook "dh.yml", который инициализирует каталог и отразит содержимое переменных:

  1. ---
  2. - name: deploy
  3. hosts: all
  4. become: yes
  5.  
  6. tasks:
  7. - name: Initialize the deploy root and gather facts
  8. deploy_helper:
  9. path: /tmp/deploy/depdirDEL
  10.  
  11. - debug:
  12. var: deploy_helper
  13.  
  14. - debug:
  15. var: deploy_helper.new_release_path

Запускаем:

  1. ansible-playbook dp.yml

Смотрим на результат. Начнем с удаленного сервера:

  1. root@debi:/tmp/deploy# pwd
  2. /tmp/deploy
  3. root@debi:/tmp/deploy# tree
  4. .
  5. └── depdirDEL
  6. ├── releases
  7. └── shared
  8.  
  9. 3 directories, 0 files

Создался каталог depdirDEL, его название можете прописать как вам угодно. Мы написали в коде "depdirDEL". Проверяем вывод запуска playbook:

  1. ok: [debi] => {
  2. "deploy_helper": {
  3. "current_path": "/tmp/deploy/depdirDEL/current",
  4. "new_release": "20191029131720",
  5. "new_release_path": "/tmp/deploy/depdirDEL/releases/20191029131720",
  6. "previous_release": null,
  7. "previous_release_path": null,
  8. "project_path": "/tmp/deploy/depdirDEL",
  9. "releases_path": "/tmp/deploy/depdirDEL/releases",
  10. "shared_path": "/tmp/deploy/depdirDEL/shared",
  11. "unfinished_filename": "DEPLOY_UNFINISHED"
  12. }
  13. }

И вторая переменная:

  1. ok: [debi] => {
  2. "deploy_helper.new_release_path": "/tmp/deploy/depdirDEL/releases/20191029131720"
  3. }

2. name: Clone...
Тут надо пояснить: для простоты понимания, мы упростим данный пункт. Просто заменим на копирование (предварительно создадим файл 777del.py) и назначим права:

  1. ---
  2. - name: deploy
  3. hosts: all
  4. become: yes
  5.  
  6. tasks:
  7. - name: Initialize the deploy root and gather facts
  8. deploy_helper:
  9. path: /tmp/deploy/depdirDEL
  10.  
  11. - debug:
  12. var: deploy_helper
  13.  
  14. - debug:
  15. var: deploy_helper.new_release_path
  16.  
  17. - name: Create directory mode
  18. become: yes
  19. file:
  20. path: "{{ deploy_helper.new_release_path }}"
  21. owner: debiuser
  22. group: debiuser
  23. mode: 0775
  24. state: directory
  25.  
  26. - name: Clone the project to the new release folder (COPY FILE)
  27. copy: src=./777del.py dest={{ deploy_helper.new_release_path }}/

Проверяем результат на сервере:

  1. root@debi:/tmp/deploy# tree
  2. .
  3. └── depdirDEL
  4. ├── releases
  5. │   └── 20191029133200
  6. │   └── 777del.py
  7. └── shared
  8.  
  9. 4 directories, 1 file

3. name: Add an unfinished...
Добавим в наш файл следующие строчки:

  1. - name: Add an unfinished file, to allow cleanup on successful finalize
  2. file:
  3. path: '{{ deploy_helper.new_release_path }}/{{ deploy_helper.unfinished_filename }}'
  4. state: touch

Запускаем и проверяем результат:

  1. root@debi:/tmp/deploy# tree
  2. .
  3. └── depdirDEL
  4. ├── releases
  5. │   ├── 20191029133200
  6. │   │   └── 777del.py
  7. │   └── 20191029133539
  8. │   ├── 777del.py
  9. │   └── DEPLOY_UNFINISHED
  10. └── shared
  11.  
  12. 5 directories, 3 files

4. name: Finalize the deploy ...
Дополняем наш код, который делает финальную часть deploy:

  1. - name: Finalize the deploy, removing the unfinished file and switching the symlink
  2. deploy_helper:
  3. path: /tmp/deploy/depdirDEL
  4. release: '{{ deploy_helper.new_release }}'
  5. state: finalize

Проверяем:

  1. root@debi:/tmp/deploy# tree
  2. .
  3. └── depdirDEL
  4. ├── current -> /tmp/deploy/depdirDEL/releases/20191029133736
  5. ├── releases
  6. │   ├── 20191029133200
  7. │   │   └── 777del.py
  8. │   └── 20191029133736
  9. │   └── 777del.py
  10. └── shared
  11.  
  12. 6 directories, 2 files

5. name: Add symlinks...
В завершении добавляем код с symlinks:

  1. - name: Add symlinks from the new release to the shared folder
  2. file:
  3. path: /opt/deploy/depdirDEL
  4. src: '{{ deploy_helper.new_release_path }}'
  5. state: link

*ВНИМАНИЕ: путь указан другой "path: /opt/deploy/depdirDEL"! Обратите на это внимание! Предварительно нужно создать каталог "/opt/deploy", иначе схватите ошибку!

Проверяем:

  1. root@debi:/tmp/deploy# tree
  2. .
  3. └── depdirDEL
  4. ├── current -> /tmp/deploy/depdirDEL/releases/20191029134325
  5. ├── releases
  6. │   ├── 20191029133200
  7. │   │   └── 777del.py
  8. │   ├── 20191029133736
  9. │   │   └── 777del.py
  10. │   └── 20191029134325
  11. │   └── 777del.py
  12. └── shared
  13.  
  14. 7 directories, 3 files

Так же смотрим и другой каталог:

  1. root@debi:/tmp/deploy# tree /opt/deploy/
  2. /opt/deploy/
  3. └── depdirDEL -> /tmp/deploy/depdirDEL/releases/20191029134325
  4.  
  5. 1 directory, 0 files

6. Проверяем итоговый файл
По этим шагам, можно просмотреть, что происходит на каждом этапе. Надо отметить, что некоторые данные не точные, так как мы каждый раз запускали файл "dh.yml" с новым добавленным кодом, к уже существующему. При этом на выводе создались лишние данные. Поэтому, мы очистим все каталоги и запустим код ниже с самого начала:

  1. ---
  2. - name: deploy
  3. hosts: all
  4. become: yes
  5.  
  6. tasks:
  7. - name: Initialize the deploy root and gather facts
  8. deploy_helper:
  9. path: /tmp/deploy/depdirDEL
  10.  
  11. - debug:
  12. var: deploy_helper
  13.  
  14. - debug:
  15. var: deploy_helper.new_release_path
  16.  
  17. - name: Create directory mode
  18. become: yes
  19. file:
  20. path: "{{ deploy_helper.new_release_path }}"
  21. owner: debiuser
  22. group: debiuser
  23. mode: 0775
  24. state: directory
  25.  
  26. - name: Clone the project to the new release folder (COPY FILE)
  27. copy: src=./777del.py dest={{ deploy_helper.new_release_path }}/
  28.  
  29. - name: Add an unfinished file, to allow cleanup on successful finalize
  30. file:
  31. path: '{{ deploy_helper.new_release_path }}/{{ deploy_helper.unfinished_filename }}'
  32. state: touch
  33.  
  34. - name: Finalize the deploy, removing the unfinished file and switching the symlink
  35. deploy_helper:
  36. path: /tmp/deploy/depdirDEL
  37. release: '{{ deploy_helper.new_release }}'
  38. state: finalize
  39.  
  40. - name: Add symlinks from the new release to the shared folder
  41. file:
  42. path: /opt/deploy/depdirDEL
  43. src: '{{ deploy_helper.new_release_path }}'
  44. state: link

Запускаем "dh.yml":

  1. ansible-playbook dp.yml
  2.  
  3. PLAY [deploy] **************************************************************************************************
  4.  
  5. TASK [Gathering Facts] *****************************************************************************************
  6. ok: [debi]
  7.  
  8. TASK [Initialize the deploy root and gather facts] *************************************************************
  9. changed: [debi]
  10.  
  11. TASK [debug] ***************************************************************************************************
  12. ok: [debi] => {
  13. "deploy_helper": {
  14. "current_path": "/tmp/deploy/depdirDEL/current",
  15. "new_release": "20191029135617",
  16. "new_release_path": "/tmp/deploy/depdirDEL/releases/20191029135617",
  17. "previous_release": null,
  18. "previous_release_path": null,
  19. "project_path": "/tmp/deploy/depdirDEL",
  20. "releases_path": "/tmp/deploy/depdirDEL/releases",
  21. "shared_path": "/tmp/deploy/depdirDEL/shared",
  22. "unfinished_filename": "DEPLOY_UNFINISHED"
  23. }
  24. }
  25.  
  26. TASK [debug] ***************************************************************************************************
  27. ok: [debi] => {
  28. "deploy_helper.new_release_path": "/tmp/deploy/depdirDEL/releases/20191029135617"
  29. }
  30.  
  31. TASK [Create directory mode] ***********************************************************************************
  32. changed: [debi]
  33.  
  34. TASK [Clone the project to the new release folder (COPY FILE)] *************************************************
  35. changed: [debi]
  36.  
  37. TASK [Add an unfinished file, to allow cleanup on successful finalize] *****************************************
  38. changed: [debi]
  39.  
  40. TASK [Finalize the deploy, removing the unfinished file and switching the symlink] *****************************
  41. changed: [debi]
  42.  
  43. TASK [Add symlinks from the new release to the shared folder] **************************************************
  44. changed: [debi]
  45.  
  46. PLAY RECAP *****************************************************************************************************
  47. debi : ok=9 changed=6 unreachable=0 failed=0

Проверяем сервер:

  1. root@debi:~# tree /tmp/deploy
  2. /tmp/deploy
  3. └── depdirDEL
  4. ├── current -> /tmp/deploy/depdirDEL/releases/20191029135617
  5. ├── releases
  6. │   └── 20191029135617
  7. │   └── 777del.py
  8. └── shared
  9.  
  10. 5 directories, 1 file
  11. root@debi:~# tree /opt/deploy
  12. /opt/deploy
  13. └── depdirDEL -> /tmp/deploy/depdirDEL/releases/20191029135617
  14.  
  15. 1 directory, 0 files

7. Проверка работы:
Вносим какие-то данные в наш испытуемый файл, сохраняем и запускам playbook повторно:

  1. tree /tmp/deploy
  2. /tmp/deploy
  3. └── depdirDEL
  4. ├── current -> /tmp/deploy/depdirDEL/releases/20191029140359
  5. ├── releases
  6. │   ├── 20191029135617
  7. │   │   └── 777del.py
  8. │   └── 20191029140359
  9. │   └── 777del.py
  10. └── shared
  11.  
  12. 6 directories, 2 files
  13. root@debi:~# tree /opt/deploy
  14. /opt/deploy
  15. └── depdirDEL -> /tmp/deploy/depdirDEL/releases/20191029140359
  16.  
  17. 1 directory, 0 files

Не будем ничего менять, запустим еще раз playbook:

  1. tree /tmp/deploy
  2. /tmp/deploy
  3. └── depdirDEL
  4. ├── current -> /tmp/deploy/depdirDEL/releases/20191029140626
  5. ├── releases
  6. │   ├── 20191029135617
  7. │   │   └── 777del.py
  8. │   ├── 20191029140359
  9. │   │   └── 777del.py
  10. │   └── 20191029140626
  11. │   └── 777del.py
  12. └── shared
  13.  
  14. 7 directories, 3 files
  15. root@debi:~# tree /opt/deploy
  16. /opt/deploy
  17. └── depdirDEL -> /tmp/deploy/depdirDEL/releases/20191029140626
  18.  
  19. 1 directory, 0 files

Теперь намного проще проанализировать работу данного модуля Ansible. Спасибо за что, что читали нашу статью)

Источник: http://linuxsql.ru