如果是组成员,如何跳过Ansible主机

问题描述

我正在研究一本剧本(用于AWX),以处理我们其中一个Web应用程序的某些后端处理。 通过REST调用AWX传递给剧本的额外变量之一用于传递主机
到剧本

hosts: {{target}}

目标可以是单个服务器或服务器列表。
问题:如果主机不是清单组的成员,如何使用模式跳过主机
例如,如果我希望剧本在清单的暂存组中,则跳过服务器
我尝试了以下方法

hosts: "{{target}}:!staging"

这仅在仅将一台服务器作为目标var发送时起作用,但是如果用列表调用则失败。

解决方法

如果您确实使用:作为主机的分隔符而不是,,则此方法应该起作用。


host1:host2:host3:!staging语法可行,但另一方面,host1,host2,host3:!staging确实会产生警告

[警告]:无法匹配提供的主机模式,忽略:host3:!staging

这也很可能是您面临的问题。
The two syntaxes are documented here

给出库存:

all:
  hosts:
    host1:
    host2:
    host3:

  children:
    staging:
      hosts:
        host2:

还有剧本:

- hosts: host1:host2:host3:!staging
  gather_facts: no
      
  tasks:
    - debug:
        msg: "{{ inventory_hostname  }}"

这产生了回顾:

PLAY [host1:host2:host3:!staging] *********************************************************************************

TASK [debug] ******************************************************************************************************
ok: [host1] => {
    "msg": "host1"
}
ok: [host3] => {
    "msg": "host3"
}

PLAY RECAP ********************************************************************************************************
host1                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host3                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

使用剧本时,它给出的内容完全相同:

- hosts: "{{ target }}:!staging"
  gather_facts: no
      
  tasks:
    - debug:
        msg: "{{ inventory_hostname  }}"

运行方式:

ansible-playbook play.yml -i inventory.yml -e "target=host1:host2:host3"