如果一个循环项发生更改,如何运行处理程序?

问题描述 投票:0回答:2

如果任务失败,是否可以运行处理程序,但是

ignore_errors

如果您有一个任务在循环中运行,并且循环中的一个元素失败,则通知将被忽略。

如果我的至少一个元素发生了变化,我想执行处理程序。

- name: Test handlers
  ansible.builtin.command: ls "{{ item }}"
  loop:
    - "/bin"
    - "/wrongFolder"
  ignore_errors: true
  notify: Reboot serve

在这种情况下,我将对项目

bin
进行更改,并在
wrongFolder
上失败,因此,在这种情况下,处理程序不会执行。

如果一项发生变化,是否可以更改并执行处理程序?

ansible handler
2个回答
1
投票

简短回答:将

ignore_errors: true
替换为
failed_when: false

详细信息:属性changedfailed如何循环工作?

  • 属性 changedfailed 存在于所有项目中
  • 如果任何项目更改了聚合属性changedTrue
  • 如果任何项目失败,则聚合属性failedTrue
  • 如果任何项目失败(聚合属性failedTrue)并且不会通知处理程序
  • 如果没有项目失败,则聚合属性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]

0
投票

您可以在

ansible.cfg
文件中包含以下内容1

[defaults]

# ... some other stuff ...

force_handlers = true

# ... rest of the file

或者,使用

--force-handlers
标志运行您的剧本,如下所示:

ansible-playbook --force-handlers playbook.yml
© www.soinside.com 2019 - 2024. All rights reserved.