【问题标题】:Filtering addresses matching condition过滤地址匹配条件
【发布时间】:2018-11-05 18:24:47
【问题描述】:

我想将允许的 VLAN 列表作为变量提供给我的服务器。

Ansible playbook 应该能够根据此 VLAN 过滤服务器的 IP 地址。

  • 我有一个服务器上所有可用 IP 地址的列表(ansible_all_ipv4_addresses 来自 ansible 事实)

  • 我有一个全局变量my_subnets

    my_subnets:
      - vlan: 2
        subnet: "192.168.2.0/24"
        gateway: "192.168.2.10"
      - vlan: 3
        subnet: "192.168.3.0/24"
        dns: "192.168.3.12"
      - vlan: 4
        subnet: "192.168.4.0/24"
      - vlan: 5
        subnet: "192.168.5.0/24"
    
  • 我有每个服务变量allowed_vlans

    allowed_vlans:
      - 2
      - 5
    

我正在寻找一种方法来模板化 "192.168.2.0/24""192.168.5.0/24"


我在想:

1。神社方式

类似 extractmy_subnets 项目 匹配 allowed_vlansmap 它们与 ansible_all_ipv4_addresses 通过 ipaddr() 过滤器。

2。 JSON查询方式

我试过了:

{{ my_subnets | json_query('[?vlan in allowed_vlans].subnet') }}

但似乎 json_query 没有使用 python 语法来评估数组中是否存在某些内容。

【问题讨论】:

    标签: ansible jinja2 jmespath json-query


    【解决方案1】:

    contains() 函数是 JMESPath 检查成员资格的方式,但据我所知,它无法在对象树中向上 引用,也无法像 @ 那样将表达式分配给内部变量987654324@语言。但是,可以作弊并将表达式序列化为 JSON,然后使用 JMESPath 的literal expression 语法:

    tasks:
    - debug:
        verbosity: 0
        msg: |
          {{ my_subnets | json_query(jq) }}
      vars:
        # this "vars" trick was recommended by the json_query docs, but isn't required
        jq: |
          [? contains(`{{ allowed_subnets | to_json }}`, vlan) ].subnet
    

    【讨论】:

    • 谢谢你,它工作完美。明显的要求是在控制机器上安装jmespathjq
    • "和 jq 安装在控制机器上" 我不知道 ansible 中有任何需要甚至使用 jq 的东西。而且,AFAIK,jmespath 附带 ansible——或者至少我不记得采取步骤安装它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2020-08-27
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    相关资源
    最近更新 更多