Ansible:开启ignore_errors时,如何在循环项变更时触发Handler?
问题1解答:启用ignore_errors参数时,任务执行失败能否触发Handler?
- 当设置
ignore_errors: true时,只有任务执行成功且产生变更(状态为changed),才会触发对应的Handler; - 如果任务执行失败(哪怕
ignore_errors忽略了失败),该任务不会被标记为changed,因此无法触发Handler。
问题2解答:循环任务中单个项变更但其他项失败,如何实现只要有一个变更就触发Handler?
原示例中,循环任务作为一个整体存在,只要有执行失败的项(即使ignore_errors: true),任务的整体状态不会被判定为changed,导致notify无法触发。可以通过以下两种方案解决:
方案一:捕获循环结果,手动判断触发Handler
通过register获取每个循环项的执行结果,新增一个任务用changed_when判断是否有至少一个项产生变更,从而触发Handler:
- name: Test handlers ansible.builtin.command: ls "{{ item }}" loop: - "/bin" - "/wrongFolder" ignore_errors: true register: cmd_results - name: Trigger reboot if any item changed ansible.builtin.debug: msg: "Detected changed item, triggering reboot" changed_when: cmd_results.results | selectattr('changed') | list | length > 0 notify: Reboot serve
原理
cmd_results.results存储了每个循环项的执行状态,通过过滤器筛选出changed状态的项,只要数量大于0,就标记当前任务为changed,进而触发Handler。
方案二:拆分循环为独立任务(适合少量循环项)
将每个循环项拆成单独的任务,每个任务独立判断状态,只要其中一个任务执行成功且变更,就会触发Handler:
- name: Check /bin directory ansible.builtin.command: ls "/bin" ignore_errors: true notify: Reboot serve - name: Check wrongFolder directory ansible.builtin.command: ls "/wrongFolder" ignore_errors: true
原理
每个独立任务的状态互不影响,失败的任务不会干扰其他任务的notify逻辑,只要有任务产生变更,就会触发Handler。
内容的提问来源于stack exchange,提问作者Acexiis
相关产品推荐
相关产品推荐

