2

考虑以下(为简洁起见而简化)带有块和救援块的剧本

- name: deploy block
  block:
  - name: debug meta
    debug: var=meta

  
  - name: create/update configmap with new data
    k8s:
      state: present
      namespace: "{{ namespace }}"
      definition: "{{ lookup('template', 'configmap.tpl.yml') }}"
      kind: ConfigMap
    notify:
      - successfull_deployment_slack_handler
  rescue:
    - name: Something went wrong handler
      debug:
        msg: "Something has failed in the playbook"
      notify: failure_deployment_slack_handler
- meta: flush_handlers

在快乐的路径中测试它可以正常工作并按预期调用处理程序。
但是当我在测试中的任务失败时,我确实看到了预期的调试消息,但没有调用实际的处理程序(我已经将它换成调试消息来验证)。

是的,我试过添加meta: flush_handlers.

我怎样才能使这项工作?

Ansible 版本:2.9.9

4

2 回答 2

2

您的剧本的精简版本中的“错误”是debug永远不会向 ansible 报告,changed因此,处理程序不会触发。

在这个我rescue debug用 a替换你的剧本中shell,处理程序被称为

---
- hosts: all
  handlers:
    - name: handler
      debug:
        msg: handler
  tasks:
    - name: deploy block
      block:
      - name: debug meta
        debug:
          msg: in the block

      - fail:
          msg: failing
      rescue:
        - name: Something went wrong handler
          shell: date
          notify: handler

结果是

TASK [debug meta] **************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "in the block"
}

TASK [fail] ********************************************************************************************************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "failing"}

TASK [Something went wrong handler] ********************************************************************************************************************************************************************************************************************************************
changed: [localhost]

RUNNING HANDLER [handler] ******************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "handler"
}
于 2020-07-28T17:57:51.267 回答
0

仅在更改时调用处理程序,仅当首先要刷新处理程序时,任务meta: flush_handlers才会执行处理程序,这不是您的情况。

正如我们所提到的,模块应该是幂等的,并且可以在它们对远程系统进行更改时进行中继。剧本认识到这一点,并有一个可用于响应变化的基本事件系统。

来源:https ://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#handlers-running-operations-on-change ,强调,我的

为了让它工作,你必须以某种方式创建一个改变的状态。这可能是通过使用changed_when

- name: deploy block
  block:
  - name: debug meta
    debug: var=meta

  
  - name: create/update configmap with new data
    k8s:
      state: present
      namespace: "{{ namespace }}"
      definition: "{{ lookup('template', 'configmap.tpl.yml') }}"
      kind: ConfigMap
    notify:
      - successfull_deployment_slack_handler
  rescue:
    - name: Something went wrong handler
      debug:
        msg: "Something has failed in the playbook"
      changed_when: true
      notify: failure_deployment_slack_handler
- meta: flush_handlers

相关:https ://stackoverflow.com/a/62183353/2123530

于 2020-07-28T17:57:12.713 回答