这是以Yaml格式存储的日志文件。
我的工作是找出属于hostclass ess的主机名,在这种情况下答案是host002。
hostinfo:
'host001':
ip: 192.168.43.10
hostclass: 'puppet'
'host002':
ip: 192.168.43.11
hostclass: 'ess'
'host003':
ip: 192.168.43.21
hostclass: 'mdb'
我从一位朋友那里得到了一个解决方案,但我无法将其与我的安全手册相符。
- debug:
msg: "{{ hostinfo|dictsort|selectattr('1.hostclass', 'equalto', 'ess')|first|first }}"
我正在写剧本,这是错的,但我无法弄清楚如何在我的剧本中使用该代码。任何人都可以帮我修改我的代码。
---
- hosts: somehost
gather_facts: no
vars_files:
file: sometext.yaml
name: sometext
- debug:
msg: "{{ hostinfo|dictsort|selectattr('1.hostclass', 'equalto', 'ess')|first|first }}"
答案 0 :(得分:1)
您正在以错误的方式使用Ansible。可以编写一个复杂的查询(你可以使用json_query过滤器),但是阅读和维护起来非常困难。
您需要做什么:不使用hostclass: something
,而是使用群组。
小组就是为此而设计的。
您的广告资源应如下所示:
[puppet]
host001 ip=192.168.43.10
[ess]
host002 ip=192.168.43.11
[mdb]
host003 ip=192.168.43.21
[hostinfo:children]
puppet
ess
mdb
之后,如果您需要它们(例如groups.puppet
),查询组是微不足道的,并且可以轻松访问其变量:(hostvars[groups.puppet][0]).ip
答案 1 :(得分:0)
这是您一直在寻找的代码:
(在查询顶部,您还遇到vars_files
问题)
tasks:
- include_vars:
file: ./sometext.yaml
name: sometext
- debug:
msg: "{{ sometext.hostinfo | dict2items | json_query('[?value.hostclass==`ess`] | [0].key') }}"
查询中的最后一个过滤器返回一个字符串,如果有多个hostclass
等于ess
的主机,则需要对其进行更改并生成一个列表。