如何用Jinja2模板提取匹配ansible_host的接口MAC地址生成DHCP预留文件?
从Ansible库存中提取匹配ansible_host的MAC地址(Jinja2实现)
核心需求
从库存的interfaces数组里,找到IP地址与ansible_host匹配的接口,提取对应的mac_address值。注意库存中IP地址带子网掩码(如192.171.130.8/32),需要先剥离子网部分再做匹配。
实现代码
{% set target_ip = hostvars[host].ansible_host %} {% set matching_interface = hostvars[host].interfaces | selectattr('ip_addresses', 'any', lambda ip_entry: ip_entry.address.split('/')[0] == target_ip) | first %} {{ matching_interface.mac_address }}
代码解释
- 先把目标IP(
ansible_host的值)存入target_ip变量,方便后续复用。 - 用
selectattr过滤interfaces数组:- 检查每个接口的
ip_addresses列表,通过lambda函数剥离IP的子网部分(split('/')[0]),和target_ip做匹配。 any表示只要ip_addresses里有一个IP匹配就符合条件。
- 检查每个接口的
| first取第一个匹配的接口(默认一个IP对应唯一接口)。- 最后输出该接口的MAC地址。
边界处理(可选)
如果担心出现无匹配接口的情况,可以添加默认值:
{{ matching_interface.mac_address | default('unknown') }}
示例验证
针对你提供的库存数据:
ansible_host为192.171.130.8,会匹配到第一个接口,输出结果为:C8-F1-13-78-9E-E7
内容的提问来源于stack exchange,提问作者Damien Dye
相关产品推荐
相关产品推荐

