如何在Ansible Playbook中的when条件中使用主机变量

时间:2020-05-21 08:37:03

标签: ansible yaml ansible-2.x ansible-inventory

仅当主机名具有变量server = admin 时,我才尝试执行我的任务。我正在尝试执行以下剧本,但遇到错误。有人可以帮我这个忙吗,我正在尝试类似于对我有用的东西,例如-groups ['production'] 中的stocking_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中运行。

1 个答案:

答案 0 :(得分:3)

servers是一个变量,其中包含您在每个主机上声明的字符串。如果您在host3上运行taks,则它将等于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']