当使用另一个标签执行角色时,角色内部带有标签“never”的 ansible 任务将被执行

当使用另一个标签执行角色时,角色内部带有标签“never”的 ansible 任务将被执行

我有一本剧本,其中有三个角色netdatanetdata_masternetdata_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角色中我有一个带有标签的任务neverupdate_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_slaveupdate 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语句)来说,效果不佳。

相关内容