如何在ansible剧本中的when条件下使用主机变量

Sta*_*ner 3 yaml ansible ansible-2.x ansible-inventory

我仅在主机名具有变量时才尝试执行我的任务servers=admin

我正在尝试执行下面的剧本,但遇到错误。
我正在尝试这个,因为它类似于对我有用的东西inventory_hostname in groups['production']。我想仅当服务器变量包含admin在其中时才运行该任务。

我的主机文件:

[production]
host1 servers=admin,server1
host2 servers=server2
host3 servers=admin,server3
host4 servers=server4
host5 servers=server5
host6 servers=admin,server6
Run Code Online (Sandbox Code Playgroud)

我的任务:

[production]
host1 servers=admin,server1
host2 servers=server2
host3 servers=admin,server3
host4 servers=server4
host5 servers=server5
host6 servers=admin,server6
Run Code Online (Sandbox Code Playgroud)

host1我的任务应该只在、host3和 上运行host6

Zei*_*tor 5

servers是一个包含您在每个主机上声明的字符串的变量。如果你在eg上运行任务,host3它将等于admin,server3。您正在寻找的条件是

when: "'admin' in servers"
# or
when: servers is search('admin')
Run Code Online (Sandbox Code Playgroud)

现在,我认为您只是在重新发明轮子,因为正如您自己指出的那样,您可以通过团体更轻松、更清晰地实现这一目标。例如,与仅寻址组名称相比,上述解决方案将使获取变量admin中某个位置的所有服务器的列表变得更加困难。servers

my_admin_servers: "{{ groups['prod'] | map('extract', hostvars) | selectattr('servers', 'search', 'admin') | map(attribute='inventory_hostname') | list }}"
Run Code Online (Sandbox Code Playgroud)

我就是这样做的:

您的库存

[production]
host1
host2
host3
host4
host5
host6

[admin]
host1
host3
host6
Run Code Online (Sandbox Code Playgroud)

还有你的新条件:

when: inventory_hostname in groups['admin']
Run Code Online (Sandbox Code Playgroud)