我想将允许的VLAN列表作为变量提供给我的服务器。
不可用的剧本应该能够过滤服务器的IP地址基于这个VLAN的。
ansible_all_ipv4_addresses
)my_subnets
:
my_subnets:- vlan: 2个子网:"192.168.2.0/24“网关:"192.168.2.10”- vlan: 3个子网:"192.168.3.0/24“dns:"192.168.3.12”- vlan: 4个子网:"192.168.4.0/24“- vlan: 5个子网:"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
匹配的项,并通过ipaddr()筛选器将它们与ansible_all_ipv4_addresses
映射。
2. JSON查询方式
我试过:
{{ my_subnets | json_query('[?vlan in allowed_vlans].subnet') }}
但是,json_query似乎没有使用python语法来计算是否存在数组。
发布于 2018-11-06 05:27:29
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
https://stackoverflow.com/questions/53160078
复制相似问题