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

Dhe*_*raj 1 ansible ansible-2.x ansible-facts ansible-inventory

这是我的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'
Run Code Online (Sandbox Code Playgroud)

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

- hosts: iptables
  roles:
    - { role: "Iptables", tags: "commonrules" }
Run Code Online (Sandbox Code Playgroud)

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

zig*_*arn 6

标签仅在ansible-playbook带有--tags/--skip-tags选项的命令行上激活(de).
playbooks和roles中的标签声明仅用于声明激活这些任务和角色的标签.

默认情况下,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)
Run Code Online (Sandbox Code Playgroud)

然后,在group_varshost_vars文件中,类似于:

# group_vars/common.yml
commonrules: True

# group_vars/wsg.yml
wsgrules: True
Run Code Online (Sandbox Code Playgroud)

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