Получил доступную роль, которая состоит из множества задач. Поэтому эти задачи разделены на отдельные файлы для лучшей прослеживаемости.
папка роли / myrole / tasks /:
step1.yml
step2.yml
...
step10.yml
main.yml
Основная задача состоит только из включенных задач.
роли / myrole / tasks / main.yml:
- include_tasks: step1.yml
- include_tasks: step2.yml
...
- include_tasks: step10.yml
site.yml
- name: Deploy myrole
hosts: rolehosts
remote_user: roleuser
roles:
- myrole
Во время развертывания сервер необходимо перезагрузить несколько раз. На данный момент каждый файл задачи содержит такие задачи:
- name: Step 10 - reboot
become: true
shell: sleep 2 && shutdown -r now
async: 1
poll: 0
- name: Step 10 - wait for server to return after reboot
wait_for: >
host={{ ansible_default_ipv4.address }}
port=22
delay=10
timeout=120
delegate_to: localhost
Поэтому вместо того, чтобы переписывать эти задачи снова и снова в каждом stepX.yml
кажется практичным использовать handler
вместо. Но обработчики запускаются только в конце игры, что непрактично в этом случае, когда сервер должен быть перезагружен, например, в середине шага 5. Чтобы избежать этого, я мог бы использовать flush_handlers
задача на каждом шагу.
Я не вижу здесь прибыли. Вместо того, чтобы переписывать задачи перезагрузки на каждом шаге, я бы переписал задачу flus_handlers на каждом шаге.
Есть лучший способ сделать это?
Сервер необходимо надежно перезагружать в определенные моменты на каждом этапе. Плейбук должен продолжить выполнение, когда сервер снова будет в сети.
Что-то вроде этого?
Имейте в виду, что это своего рода псевдокод, просто чтобы указать последовательность событий.
step_and_reboot.yml
- import_tasks: "{{ step_name }}.yml"
- shell: shutdown -r now
- local_action: wait_for
main.yml
- include_tasks: step_and_reboot.yml
with_items:
- step1
- step2
- step3
loop_control:
loop_var: step_name