首页 > 解决方案 > 使用 import_tasks 时如何触发处理程序(通知)?

问题描述

在使用处理程序notify的任务上使用import_tasks时不会触发。我想知道为什么。tags正在按预期工作。

如何触发导入任务的处理程序?

例子:

剧本测试.yml:

- hosts: all
  gather_facts: no

  handlers:
  - name: restart service
    debug: 
      msg: restart service

  tasks:
  - import_tasks: test_imports.yml
    notify: restart service
    tags: test

test_imports.yml

- name: test
  debug:
    msg: test
  changed_when: yes

- name: test2
  debug:
    msg: test2
  changed_when: yes

预期的:

> ansible-playbook -i localhost, test.yml

PLAY [all] *************************************************************************************************************

TASK [test] ************************************************************************************************************
changed: [localhost] => {
    "msg": "test"
}

TASK [test2] ***********************************************************************************************************
changed: [localhost] => {
    "msg": "test2"
}

RUNNING HANDLER [restart service] **************************************************************************************
ok: [localhost] => {
    "msg": "restart service"
}

...

实际的:

> ansible-playbook -i localhost, test.yml        

PLAY [all] *************************************************************************************************************

TASK [test] ************************************************************************************************************
changed: [localhost] => {
    "msg": "test"
}

TASK [test2] ***********************************************************************************************************
changed: [localhost] => {
    "msg": "test2"
}

...

标签: ansible

解决方案


这个问题已在 Ansible 的错误跟踪器中得到部分回答:

import_tasks在解析时处理并被它导入的任务有效地替换。因此,import_tasks在处理程序中使用时,您需要通知其中的任务名称。

来源:mkrizek 评论:https ://github.com/ansible/ansible/issues/59706#issuecomment-515879321


这里也进一步解释了这一点:

import_tasks导入不像任务那样工作,并且它们实际上在任务和导入文件中的任务之间没有关联。import_tasks是一个预处理触发器,在剧本解析期间处理。当解析器遇到它时,将检索其中的任务,并将其插入import_tasks任务所在的位置。在 ansible /proposals#136中有一个“taskify”的建议,但我认为不会很快实施。

来源:sivel 评论:https ://github.com/ansible/ansible/issues/64935#issuecomment-573062042


对于它的大部分内容,它似乎最近已修复:https ://github.com/ansible/ansible/pull/73572


但是,就目前而言,可行的方法是:

- hosts: all
  gather_facts: no

  handlers:
  - name: restart service
    debug: 
      msg: restart service

  tasks:
  - import_tasks: test_imports.yml
    tags: test

还有一个test_imports.yml文件,例如:

- name: test
  debug:
    msg: test
  changed_when: yes
  notify: restart service

- name: test2
  debug:
    msg: test2
  changed_when: yes
  notify: restart service

这一切都会产生:

PLAY [all] *******************************************************************************************************

TASK [test] ******************************************************************************************************
changed: [localhost] => 
  msg: test

TASK [test2] *****************************************************************************************************
changed: [localhost] => 
  msg: test2

RUNNING HANDLER [restart service] ********************************************************************************
ok: [localhost] => 
  msg: restart service

PLAY RECAP *******************************************************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

然后,如果您想在未定义此处理程序的某处导入这些任务,您可以使用环境变量ERROR_ON_MISSING_HANDLER 来帮助您将缺少处理程序时引发的错误转换为“简单”警告。

例如

$ ANSIBLE_ERROR_ON_MISSING_HANDLER=false ansible-playbook play.yml -i inventory.yml

PLAY [all] *******************************************************************************************************

TASK [test] ******************************************************************************************************
[WARNING]: The requested handler 'restart service' was not found in either the main handlers list nor in the
listening handlers list
changed: [localhost] => 
  msg: test

TASK [test2] *****************************************************************************************************
changed: [localhost] => 
  msg: test2

PLAY RECAP *******************************************************************************************************
localhost                  : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

推荐阅读