我有一本剧本,其中有三个角色netdata
:netdata_master
netdata_slaves
---
- hosts: netdata_master
become: yes
roles:
- role: netdata
- role: netdata_master
tags: ['netdata_master']
- hosts: netdata_slaves
become: yes
roles:
- role: netdata
- role: netdata_slave
tags: ['netdata_slave']
在netdata
角色中我有一个带有标签的任务never
,update_netdata
只有当我传递标签时才会执行update_netdata
:
- name: Generating Netdata prebuilt script
template:
src: kickstart-static64.sh.j2
dest: /tmp/kickstart-static64.sh
mode: 0744
- name: update netdata
shell: /opt/netdata/usr/libexec/netdata/netdata-updater.sh
tags: ['never', 'update_netdata']
问题是,当我执行没有标签的 ansible playbook 时,一切都正常并且update netdata
没有执行,但是当我运行带有netdata_slave
标签的 ansible playbook 时,update netdata
任务也会执行。
我正在使用 ansible 2.9.2
我怎样才能解决这个问题?
答案1
问:“当我运行带有标签的 ansible playbook 时
netdata_slave
,update netdata
任务也会被执行。”
答:这正如预期的那样。引用自标签继承:
添加标签:向剧本或静态导入的任务和角色添加这些标签到所有包含的任务中。
指令tags: ['netdata_slave']
将此标签添加到所有包含的任务的role: netdata
roles:
- role: netdata
tags: ['netdata_slave']
这使得任务看起来有效
- name: update netdata
shell: /opt/netdata/usr/libexec/netdata/netdata-updater.sh
tags: ['never', 'update_netdata', 'netdata_slave']
答案2
不幸的是,您不能使用 来做到这一点tags:
,因为标签继承将覆盖never
。
但是,您可以通过一种偷偷摸摸的方式来做到这一点,通过检查所需的标签是否存在ansible_run_tags
:
- name: Generating Netdata prebuilt script
template:
src: kickstart-static64.sh.j2
dest: /tmp/kickstart-static64.sh
mode: 0744
- name: update netdata
shell: /opt/netdata/usr/libexec/netdata/netdata-updater.sh
when: "'update_netdata' in ansible_run_tags"
或者你可以测试布尔变量(不是标签),例如
- name: update netdata
shell: /opt/netdata/usr/libexec/netdata/netdata-updater.sh
when: update_netdata | d() | bool
如果未定义,过滤d()
器将确保返回 false 。update_netdata
这种技术的缺点是,与缺失标签不同,错误条件仍将显示为“跳过”。对于您的情况来说,这还不算太糟,但对于常见用例(隐藏debug
语句)来说,效果不佳。