过滤地址匹配条件

时间:2018-11-05 18:24:47

标签: ansible jinja2 jmespath json-query

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

Ansible剧本应该能够基于此VLAN过滤服务器的IP地址。

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

  • 我有一个全局变量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。 Jinja方式

my_subnets匹配 allowed_vlans中提取 的东西,并通过ansible_all_ipv4_addresses通过映射 ipaddr()过滤器。

2。 JSON查询方式

我尝试过:

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

但是似乎json_query没有使用python语法来评估数组中是否有东西。

1 个答案:

答案 0 :(得分:0)

contains()函数是JMESPath检查成员资格的方式,但是尽我所知,它无法在对象树中引用 upup ,也不能像内部变量那样将表达式分配给内部变量jq语言。但是,您可以作弊并将表达式序列化为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