当使用Ansible的when
条件与run_once
结合时,可能会导致一些任务被意外跳过。这是因为run_once
关键字会使任务只在第一个匹配的主机上运行,而when
条件在其他主机上不匹配时会跳过任务。
为了解决这个问题,可以使用delegate_to
关键字将任务委托给特定的主机来执行。通过这种方式,可以避免使用run_once
关键字,并确保任务在所有主机上都执行。
下面是一个使用delegate_to
关键字解决这个问题的示例代码:
- name: Run task on all hosts
hosts: all
tasks:
- name: Task with when condition
command: echo "This task should not be skipped"
when: inventory_hostname == groups['all'][0]
- name: Task delegated to first host
command: echo "This task should not be skipped"
delegate_to: "{{ groups['all'][0] }}"
在上面的示例中,第一个任务使用了when
条件,只有在当前主机为第一个匹配的主机时才会执行。第二个任务使用了delegate_to
关键字,将任务委托给了第一个匹配的主机来执行。这样,无论当前主机是否匹配when
条件,都可以确保任务在所有主机上都执行。
请注意,delegate_to
关键字可以指定一个主机名称、一个组名称或一个模板表达式,以动态选择委托的目标主机。
上一篇:Ansible的问题