在 Ansible 中搜索字典值
Search Dictionary Values in Ansible
有这样的字典:
ossec_datacenter:
atlanta:
hostname: 'server1.fakedomain.net'
ip: '192.168.12.170'
port: '1515'
miami:
hostname: 'server2.fakedomain.net'
ip: '192.168.20.31'
port: '1514'
dallas:
hostname: 'server2.fakedomain.net'
ip: '192.168.20.20'
port: '1515'
如何在我的 when
子句中搜索该词典中的所有值?
我可以使用 ossec_datacenter[ossec_dc]['hostname']
访问变量
但我希望搜索所有值以确保不存在匹配项。
换句话说,我不希望在该数据结构中的任何地方找到 inventory_hostname
或 IP。
这是主机名的条件:
when: inventory_hostname not in (ossec_datacenter.values() | map(attribute='hostname') | list)
使用 ansible_default_ipv4.address
或其他一些关于 IP 地址的事实,并使用 map(attribute='ip')
减少你的字典来搜索 IP 地址。
如果你想使用 json_query(需要 ansible 2.2),你可以这样做来搜索 ip 和主机名:
- name: find inventory_hostname
set_fact:
found: True
with_items:
- "{{ ossec_datacenter | json_query('*.ip') }}"
- "{{ ossec_datacenter | json_query('*.hostname') }}"
when: "inventory_hostname == item"
或者如果您想搜索数据中心中的任何键(ip、主机名或端口):
- name: find inventory_hostname
set_fact:
found: True
with_items: "{{ ossec_datacenter | json_query('*.*') }}"
when: "inventory_hostname == item"
然后测试 found
var.
有这样的字典:
ossec_datacenter:
atlanta:
hostname: 'server1.fakedomain.net'
ip: '192.168.12.170'
port: '1515'
miami:
hostname: 'server2.fakedomain.net'
ip: '192.168.20.31'
port: '1514'
dallas:
hostname: 'server2.fakedomain.net'
ip: '192.168.20.20'
port: '1515'
如何在我的 when
子句中搜索该词典中的所有值?
我可以使用 ossec_datacenter[ossec_dc]['hostname']
但我希望搜索所有值以确保不存在匹配项。
换句话说,我不希望在该数据结构中的任何地方找到 inventory_hostname
或 IP。
这是主机名的条件:
when: inventory_hostname not in (ossec_datacenter.values() | map(attribute='hostname') | list)
使用 ansible_default_ipv4.address
或其他一些关于 IP 地址的事实,并使用 map(attribute='ip')
减少你的字典来搜索 IP 地址。
如果你想使用 json_query(需要 ansible 2.2),你可以这样做来搜索 ip 和主机名:
- name: find inventory_hostname
set_fact:
found: True
with_items:
- "{{ ossec_datacenter | json_query('*.ip') }}"
- "{{ ossec_datacenter | json_query('*.hostname') }}"
when: "inventory_hostname == item"
或者如果您想搜索数据中心中的任何键(ip、主机名或端口):
- name: find inventory_hostname
set_fact:
found: True
with_items: "{{ ossec_datacenter | json_query('*.*') }}"
when: "inventory_hostname == item"
然后测试 found
var.