获得了一个包含许多任务的 ansible 角色。因此,这些任务被拆分到单独的文件中,以便更好地进行跟踪。
文件夹角色/myrole/tasks/:
step1.yml
step2.yml
...
step10.yml
main.yml
主任务仅由包含任务组成。
角色/myrole/任务/main.yml:
- include_tasks: step1.yml
- include_tasks: step2.yml
...
- include_tasks: step10.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 任务。
有一个更好的方法吗?
服务器需要在每个步骤的某些点可靠地重新启动。当服务器再次上线时,剧本应该继续执行。
答案1
像这样吗?
请记住,这是一种伪代码,只是为了指出事件的顺序。
步骤和重启.yml
- import_tasks: "{{ step_name }}.yml"
- shell: shutdown -r now
- local_action: wait_for
主目录
- include_tasks: step_and_reboot.yml
with_items:
- step1
- step2
- step3
loop_control:
loop_var: step_name