考虑以下(为简洁起见,减少了)剧本,其中有一个方块和一个救援方块
- 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
答案 0 :(得分:2)
在精简版剧本中的“错误”是debug
永远不会报告为changed
,因此处理程序不会触发。
在这本剧本中,我将rescue
的{{1}}替换为debug
,处理程序称为
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
答案 1 :(得分:0)
仅在发生更改时调用处理程序,任务meta: flush_handlers
仅在首先要刷新的处理程序时才执行处理程序,而不是您的情况。 >
我们已经提到过,模块应该是幂等的,并且可以在远程系统上进行更改后进行中继。剧本认识到这一点,并具有基本的事件系统,可用于响应更改。
为了使其正常工作,您将不得不以某种方式创建更改后的状态。可以通过使用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