【问题标题】:How to use host variables in when condition in ansible playbook如何在ansible playbook中的条件下使用主机变量
【发布时间】:2020-09-07 20:18:06
【问题描述】:

仅当主机名具有变量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

我的任务:

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

我的任务应该只在host1host3host6 上运行。

【问题讨论】:

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


    【解决方案1】:

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

    when: "'admin' in servers"
    # or
    when: servers is search('admin')
    

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

    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 groups['admin']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多