【问题标题】:Search Dictionary Values in Ansible在 Ansible 中搜索字典值
【发布时间】:2017-05-25 16:15:00
【问题描述】:

有这样的字典:

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。

【问题讨论】:

  • 为清楚起见编辑了问题。谢谢。

标签: ansible ansible-playbook ansible-2.x


【解决方案1】:

这是主机名的条件:

when: inventory_hostname not in (ossec_datacenter.values() | map(attribute='hostname') | list)

使用ansible_default_ipv4.address 或有关IP 地址的其他一些事实,并使用map(attribute='ip') 减少您的字典以搜索IP 地址。

【讨论】:

    【解决方案2】:

    如果你想使用 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。

    【讨论】:

    • 不相关,但我需要从复杂的 JSON 结构中获取一个值,然后从同一个列表项中获取另一个值,而 json_query() 是我能够在没有巨大的混乱任务。那谢谢啦!以下是完整文档:docs.ansible.com/ansible/latest/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多