如何在ansible playbook的when条件中使用主机变量?

问题描述 投票:0回答:1

我正试图执行 我的任务只有当主机名有变量server=admin时才会执行。 . 我试图执行下面的剧本,但我面临着错误。谁能帮帮我,我正在尝试类似的东西,这对我来说是有效的。像 - groups['production'] 中的 inventory_hostname。 . 我想只有当服务器变量中有admin时才运行任务。

我的主机文件 :

[production]
host1 servers=admin,server1
host2 servers=server2
host3 servers=admin,server3
host4 servers=server4
host5 servers=server5
host6 servers=admin,server6

我的任务:

- name: run cmd
      shell: hostname
      register: op
      when:
        - inventory_hostvars in servers['admin']

我的任务应该只在host1,host3和host6中运行。

ansible yaml ansible-2.x ansible-inventory
1个回答
2
投票

servers 是一个变量,包含一个字符串,你在每个主机上声明。如果你在e.g上运行一个taks host3 它将等于 admin,server3. 你要找的条件是

when: "'admin' in servers"

when: servers is search('admin')

现在,我认为你只是在重新发明轮子,因为正如你自己所指出的,你可以通过组来更容易和更清晰地实现这个目标。上面的解决方案会让你更难得到所有服务器的列表,比如说,你要得到一个有 admin 在...中 servers 变量,而不是只写一个组名。

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

我是这样做的。

你的清单

[production]
host1
host2
host3
host4
host5
host6

[admin]
host1
host3
host6

还有你的新条件。

when: inventory_hostname in group['admin']
© www.soinside.com 2019 - 2024. All rights reserved.