在 Jinja2 中创建动态变量

Create dynamic variables in Jinja2

我正在尝试使用 Ansible 和 Jinja2 模板自动创建路由器配置。我的变量在两个不同的文件中:一个对所有路由器有效(all.yml),另一个对每个路由器有效(router.yml)。我想创建一个变量来查找 router.yml 中的 IP 地址,但似乎我可以找到它:

all.yml:

vlans:
- { id: 2001, name: TRUSTED-NET }
- { id: 2002, name: UNTRUSTED-NET }

router.yml:

2001_ip: 10.200.2.1 255.255.255.0
2002_ip: 10.168.28.1 255.255.255.0

makeconfig.j2

{% for vlan in vlans %}
 interface Vlan{{ vlan.id }}
  description {{ vlan.name }}
  ip address {{ vlan.ip+'_ip' }} -> TypeError: unsupported operand type(s) for +: 'int' and 'str'
  ip address {{ vlan.id|string+'_ip' }} -> output is: ip address 2001_ip

如何正确指定变量才能用 router.yml 中的值替换它?

您也可以使用 Jinja 中的经典字典键访问,例如router[vlan.id ~ '_ip']tilde operator 用于字符串连接。

{% set vlans = [{'id': 2001, 'name': 'LAN 1'},
                {'id': 2002, 'name': 'LAN 1'}] %}
{% set router = {'2001_ip': '10.200.2.1 255.255.255.0',
                 '2002_ip': '10.168.28.1 255.255.255.0'} %}

{% for vlan in vlans %}
 interface Vlan{{ vlan.id }}
  description {{ vlan.name }}
  ip address {{ router[vlan.id ~ '_ip'] }}
{% endfor %}

输出:

 interface Vlan2001
  description LAN 1
  ip address 10.200.2.1 255.255.255.0

 interface Vlan2002
  description LAN 1
  ip address 10.168.28.1 255.255.255.0