有一个完美的angular色,它由许多任务组成。 因此,这些任务被拆分为单独的文件以实现更好的可追溯性。
文件夹angular色/ myrole / tasks /:
step1.yml step2.yml ... step10.yml main.yml
主要任务只包括包含的任务。
angular色/ myrole /任务/ 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重写这些任务,而是在每个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