【问题标题】:How to Skip Ansible Host if member of a group如果是组成员,如何跳过 Ansible 主机
【发布时间】:2020-09-30 20:14:48
【问题描述】:

我正在编写一本剧本(用于 AWX)来处理我们的一个网络应用程序的一些后端处理。 通过对 AWX 的 REST 调用传递给 playbook 的额外变量之一用于传递主机
到剧本

hosts: {{target}}

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

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

这仅在仅将一个服务器作为目标 var 发送时才有效,但是如果使用列表调用它会失败。

【问题讨论】:

  • 当您有多个主机时,您的target 是什么样的?
  • @Benoit 感谢您的回答。更改主机列表以使用冒号而不是逗号有效。我确实更新了我的剧本以替换主机中的逗号hosts: "{{target|replace(',', ':')}}:!staging"
  • 更新:我只需将分隔符更改为所有冒号或所有逗号 如果我的 playbook 调用时使用逗号分隔的服务器列表 {{ target }},!staging),这现在可以工作了,感谢 @Benoit 和 @Zeitounator您对此的帮助

标签: ansible ansible-awx


【解决方案1】:

如果您确实使用: 作为主机的分隔符而不是,,这应该可以工作。


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"

【讨论】:

  • 这绝对不是错误:您可以使用逗号或冒号作为分隔符,但不能同时使用两者。请注意,在任何地方使用 coma 也可以解决您的问题(即{{ target }},!staging),而反过来混合分隔符会再次破坏一切(即{{target|replace(',', ':')}},!staging
  • 感谢@Zeitounator 我将其全部更改为使用',' ({{ target }},!staging),效果很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多