之前有一个需求,ansible-playbook中需要某一步单步执行,也就是说在有多台服务器时,某个任务只能一台服务器执行完后,另一台服务器才能执行,否者对应集群的服务会出问题
这是一个很简单的需求,ansible中也有对应的实现, --fork 1
或者 使用 serial
但是如果有人忘记加 --fork 1
了呢,而且该任务是在子任务中,使用 include 加载, serial
关键字无法在某一特定任务中使用,只能与 hosts 同级
所幸,在这里 https://www.bountysource.com/issues/26342862-support-for-serial-on-an-individual-task 找到了解决办法,使用 delegate_to
- name: service restart # serial: 1 would be the proper solution here, but that can only be set on play level # upstream issue: https://github.com/ansible/ansible/issues/12170 run_once: true with_items: '{{play_hosts}}' delegate_to: "{{ item }}" command: "/bin/service restart"