1

我想将允许的 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.金贾方式

匹配的项目中提取并通过ipaddr ()过滤器映射它们。my_subnets allowed_vlansansible_all_ipv4_addresses

2.JSON查询方式

我试过了:

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

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

4

1 回答 1

0

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

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
于 2018-11-06T05:27:29.820 回答