Ansible 运行 所有任务,即使使用了标签

Ansible running all task even if tags are used

这是我的任务,有 2 个标签

- name: Set custom iptables rules
  iptables_raw:
    name: 'iptables_custom_rules'
    rules: '{{ iptables_custom_rules }}'
  tags: 'commonrules'


- name: Set XXX iptable rules
  iptables_raw:
    name: 'iptables_wsg_rules'
    rules: '{{ iptables_wsg_rules }}'
  tags: 'wsgrules'

在 iptable.yml 文件中,我包含了带有标签的角色

- hosts: iptables
  roles:
    - { role: "Iptables", tags: "commonrules" }

它应该 运行 只标记通用规则,但是当我 运行 剧本时它 运行 包含所有任务。

标签仅在 ansible-playbook 的命令行上使用 --tags/--skip-tags options.
激活(取消)激活 剧本和角色中的标签声明仅用于声明激活这些任务和角色的标签。

By default ansible runs as if --tags all had been specified.

因此,如果您只想 运行 带有 'commonrules' 标签的任务,您必须:

  1. 从角色部分删除标签(否则它将应用于该角色的所有任务)
  2. 使用选项 --tags commonrules
  3. 调用 ansible-playbook

如果要动态应用任务,最好的方法是使用基于标志的when条件,该标志仅为需要应用任务的主机定义。

- name: Set custom iptables rules
  iptables_raw:
    name: 'iptables_custom_rules'
    rules: '{{ iptables_custom_rules }}'
  when: commonrules | default(False)

- name: Set XXX iptable rules
  iptables_raw:
    name: 'iptables_wsg_rules'
    rules: '{{ iptables_wsg_rules }}'
  when: wsgrules | default(False)

然后,在 group_vars or host_vars files 中,类似于:

# group_vars/common.yml
commonrules: True

# group_vars/wsg.yml
wsgrules: True

或者更好的是,您甚至可以在 when 条件下测试 iptables_XXX_rules 变量是否存在,因此任务只会对定义了这些变量的主机执行。