1

这是我的带有 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" }

它应该只运行带有 commonrules 的标签,但是当我运行 playbook 时,它会运行所有任务。

4

1 回答 1

7

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

默认情况下,ansible 就像--tags all已指定一样运行。

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

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

如果要动态应用任务,最好的方法是使用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_varsor host_varsfiles中,类似:

# group_vars/common.yml
commonrules: True

# group_vars/wsg.yml
wsgrules: True

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

于 2017-07-10T21:40:15.947 回答