Ansible网桥配置中模板if条件匹配主机库存名的语法问题
原判断逻辑的问题
你编写的判断条件存在两个核心问题:
- 误用了
in字符串匹配规则:在Jinja2中,当in操作符的左右两侧都是字符串时,会执行子串包含判断,而非精确等值匹配。例如值为server2的server.name会误匹配库存主机名server20、server2_backup这类包含该子串的主机,不符合你要求的严格匹配诉求。 - 变量引用冗余:模板渲染的上下文中,Ansible提供的内置变量
inventory_hostname本身就直接存储当前操作目标的库存主机名,不需要通过hostvars[host].inventory_hostname这种冗余路径取值,还容易因变量上下文错配引发取值异常。
正确的判断实现
你确实需要将匹配规则调整为精确等值判断,正确的条件语法为:{% if server.name == inventory_hostname %}
修正后可直接使用的模板
auto br-{{ bridge_network }} iface br-{{ bridge_network }} inet static {% for server in backbone_ip %} {% if server.name == inventory_hostname %} address {{ server.ipv4 }} bridge_ports none bridge_stp off bridge_fd 0 iface br-{{ bridge_network }} inet6 static address {{ server.ipv6 }} {% endif %} {% endfor %}
可选优化:如果你的库存主机名和backbone_ip中定义的
name值存在大小写差异,可以在判断时统一转成小写规避匹配失败,写法为:{% if server.name.lower() == inventory_hostname.lower() %}
内容的提问来源于stack exchange,提问作者pr0j3ctx
相关产品推荐
相关产品推荐

