Ansible ipaddr过滤器不支持网段列表参数的解决方案
解决方案
ipaddr过滤器本身只支持传入单个CIDR网段做匹配,要适配多网段列表,直接遍历网段列表逐一匹配即可,只要命中任意一个网段就判定归属,不需要写自定义过滤器或者装额外插件。
直接改判断逻辑就行,你现在已经把生产网段改成列表了,下面的写法兼容单网段、多网段配置,后续QA、开发环境要加新网段直接往对应列表里追加就行,不用动判断代码:
vars: testip0: 10.160.30.20 testip1: 10.190.2.25 ip_range_live: [ 10.160.0.0/22, 10.190.0.0/22 ] ip_range_qa: [ 10.170.0.0/22 ] ip_range_devel: [ 10.180.0.0/22 ] filter: datacenter: >- {% set target_ip = ansible_default_ipv4.address %} {% if ip_range_live | select('ipaddr', target_ip) %}live {% elif ip_range_qa | select('ipaddr', target_ip) %}qa {% elif ip_range_devel | select('ipaddr', target_ip) %}devel {% else %}INVALID{% endif %}
逻辑说明
select('ipaddr', target_ip)会遍历传入的网段列表,自动筛出和目标IP匹配的网段- Jinja2中空迭代对象会被判定为布尔假,只要存在匹配项,
select返回的结果就为真,不需要额外统计结果长度 - 写法完全兼容旧配置:如果某个环境暂时只有一个网段,变量值直接写字符串(比如
ip_range_qa: 10.170.0.0/22)也能正常运行
踩坑提醒
你原来配置里的ip_range_qa: 10.170.0/22不是标准CIDR格式,缺了第四段的0,建议改成10.170.0.0/22,避免不同Ansible版本下出现匹配不准的问题。
内容的提问来源于stack exchange,提问作者Johannes Arlt
相关产品推荐
相关产品推荐

