ansible - 使用 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 的错误跟踪器中得到部分回答:
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
推荐阅读
- mysql - 使用原始 SQL 表达式回滚 knex 事务
- java - 检索秘密 Azure 保管库 AAD 身份验证
- sql - 特定年份不同列中每个项目的总销售额
- php - 在将帖子保存到数据库之前编辑帖子分类
- php - 在更改内部值的同时插入文件的内容
- postgresql - `不能删除表“globalLinks”,因为其他对象依赖它`尽管没有模型或对象依赖它。Sequelize 和 Postgres
- docker - 在 docker 中切换到 Linux 容器时出错
- uwp - 如何像我们从 Windows Server 做 WPF 一样部署 UWP 应用程序?
- python - 使用函数生成数字
- typescript - Typescript 后续变量声明必须有相同类型错误