如果任务失败,是否可以运行处理程序,但是
ignore_errors
?
如果您有一个任务在循环中运行,并且循环中的一个元素失败,则通知将被忽略。
如果我的至少一个元素发生了变化,我想执行处理程序。
- name: Test handlers
ansible.builtin.command: ls "{{ item }}"
loop:
- "/bin"
- "/wrongFolder"
ignore_errors: true
notify: Reboot serve
在这种情况下,我将对项目
bin
进行更改,并在 wrongFolder
上失败,因此,在这种情况下,处理程序不会执行。
如果一项发生变化,是否可以更改并执行处理程序?
谢谢
简短回答:将
ignore_errors: true
替换为 failed_when: false
详细信息:属性changed和failed如何循环工作?
例如,
- command: "{{ item }}"
loop: ['true', 'true']
register: out
ignore_errors: true
notify: Reboot
- debug:
msg: |
out.changed: {{ out.changed }}
out.failed: {{ out.failed | d('UNDEF') }}
out.results[].rc: {{ out.results | json_query('[].rc') }}
out.results[].changed: {{ out.results | json_query('[].changed') }}
out.results[].failed: {{ out.results | json_query('[].failed') }}
结果改变并通知 处理程序
out.changed: True
out.failed: UNDEF
out.results[].rc: [0, 0]
out.results[].changed: [True, True]
out.results[].failed: [False, False]
如果有任何项目失败
- command: "{{ item }}"
loop: ['true', 'false']
register: out
ignore_errors: true
notify: Reboot
结果改变了,但是处理程序没有被通知,因为结果失败了
out.changed: True
out.failed: True
out.results[].rc: [0, 1]
out.results[].changed: [True, True]
out.results[].failed: [False, True]
如果您想通知处理程序,您必须设置
failed_when: false
(而不是 ignore_errors: true
)
- command: "{{ item }}"
loop: ['true', 'false']
register: out
failed_when: false
notify: Reboot
结果改变,failed未定义,并通知处理程序
out.changed: True
out.failed: UNDEF
out.results[].rc: [0, 1]
out.results[].changed: [True, True]
out.results[].failed: [False, False]
您可以在
ansible.cfg
文件中包含以下内容1:
[defaults]
# ... some other stuff ...
force_handlers = true
# ... rest of the file
或者,使用
--force-handlers
标志运行您的剧本,如下所示:
ansible-playbook --force-handlers playbook.yml