我想将允许的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"
我在想:
从my_subnets
项匹配 allowed_vlans
中提取 的东西,并通过ansible_all_ipv4_addresses
通过映射 ipaddr()过滤器。
我尝试过:
{{ my_subnets | json_query('[?vlan in allowed_vlans].subnet') }}
但是似乎json_query没有使用python语法来评估数组中是否有东西。
答案 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