在 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
我正在尝试使用 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