首页 > 解决方案 > 带有 if 条件库存名称的 ansible 模板

问题描述

实际上,我尝试为网桥创建网络配置。为此,我在 group_vars 中有以下内容。

---
backbone_ip:
- name: server2
  ipv4: 111.111.111.2/24
  ipv6: 2001:111:111:1::2/64
- name: server3
  ipv4: 111.111.111.3/24
  ipv6: 2001:111:111:1::3/64
- name: server5
  ipv4: 111.111.111.5/24
  ipv6: 2001:111:111:1::5/64

使用模板模块我编写配置。模板:

auto br-{{ bridge_network }}
iface br-{{ bridge_network }} inet static
{% for server in backbone_ip %}
{% if server.name in hostvars[host].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 %}

现在我的问题是,如果 server.name 是实际连接到的服务器 ansible 的库存名称,我只想写这些行。

hostvars[host].inventory_hostname 似乎是错误的。应该更改为 = 或语法如何?

谢谢 pr0

标签: templatesansible

解决方案


此用例的列表结构错误。将其更改为字典,例如

  backbone_dict:
    server2:
      ipv4: 111.111.111.2/24
      ipv6: 2001:111:111:1::2/64
    server3:
      ipv4: 111.111.111.3/24
      ipv6: 2001:111:111:1::3/64
    server5:
      ipv4: 111.111.111.5/24
      ipv6: 2001:111:111:1::5/64

然后属性的寻址是微不足道的,例如

    - debug:
        msg: "{{ backbone_dict[inventory_hostname].ipv4 }}"

如果您无法更改数据的结构,请先转换它,例如

    - set_fact:
        backbone_dict: "{{ dict(_keys|zip(backbone_ip)) }}"
      vars:
        _keys: "{{ backbone_ip|map(attribute='name')|list }}"
      run_once: true

推荐阅读