Variables Ansible变量字典键未被替换
我知道以前也有人问过类似的问题,但我仍然无法在我的场景中得到我想要的结果。我的Variables Ansible变量字典键未被替换,variables,ansible,Variables,Ansible,我知道以前也有人问过类似的问题,但我仍然无法在我的场景中得到我想要的结果。我的group\u vars文件夹中有以下代码片段。有两个BGP邻居(1.1.1.1和1.1.1.2),在集团级别列出。但是,我希望能够列出一个或多个额外的邻居,我希望在host_vars级别覆盖这些邻居。对变量{{bgp_neighbor_01}}的替换不起作用,因为据我所知,Ansible不会对字典键执行变量替换。有没有办法在组级别保留前两个IP地址,但在主机级别定义其他IP地址?先谢谢你 bgp_neighbor
group\u vars
文件夹中有以下代码片段。有两个BGP邻居(1.1.1.1和1.1.1.2)
,在集团级别列出。但是,我希望能够列出一个或多个额外的邻居,我希望在host_vars级别覆盖这些邻居。对变量{{bgp_neighbor_01}}
的替换不起作用,因为据我所知,Ansible不会对字典键执行变量替换。有没有办法在组级别保留前两个IP地址,但在主机级别定义其他IP地址?先谢谢你
bgp_neighbors:
1.1.1.1:
peer_group: EVPN-OVERLAY-PEERS
description: SPINE1_EVPN_ADDRESS_FAMILY
1.1.1.2:
peer_group: EVPN-OVERLAY-PEERS
description: SPINE2_EVPN_ADDRESS_FAMILY
'{{ bgp_neighbor_01 }}': <-- this variable does not get substituted
peer_group: '{{ peer_group_name }}'
description: '{{ description }}'
然后,在我的每个主机文件中,我创建了特定于主机的bgp邻居字典,然后使用组合过滤器组合组级和主机级字典
underlay_bgp_neighbors:
192.168.1.0:
peer_group: IPv4-UNDERLAY-PEERS
description: SPINE1_IPv4_ADDRESS_FAMILY
192.168.1.128:
peer_group: IPv4-UNDERLAY-PEERS
description: SPINE2_IPv4_ADDRESS_FAMILY
my_bgp_neighbors: "{{ evpn_bgp_neighbors | combine(underlay_bgp_neighbors) }}"
最后,在我的group\u vars
文件中,我引用了组合字典:
router_bgp:
neighbors: "{{ my_bgp_neighbors }}"
我不需要对我的剧本做任何修改。我只更改了组变量和主机变量文件。为什么不将组变量更改为
bgp_neighbour:
- neighbour:
ip: 1.1.1.1:
peer_group: EVPN-OVERLAY-PEERS
description: SPINE1_EVPN_ADDRESS_FAMILY
- neighbour:
ip: 1.1.1.2:
peer_group: EVPN-OVERLAY-PEERS
description: SPINE2_EVPN_ADDRESS_FAMILY
- neighbour:
ip: '{{ bgp_neighbor_01 | default('empty')}}'
peer_group: '{{ peer_group_name }}'
description: '{{ description }}'
在for循环中循环,当ip为空时停止?
另请选中Q:在组级别保留前两个IP地址,但也在主机级别定义其他IP地址”
A:在主机变量中合并字典。例如,给定库存
shell>cat主机
[第一组]
srv1
和组_vars
shell>cat组变量/group1.yml
bgp_邻居:
1.1.1.1:
对等组:EVPN-OVERLAY-PEERS
描述:SPINE1\u EVPN\u地址\u系列
1.1.1.2:
对等组:EVPN-OVERLAY-PEERS
描述:SPINE2\u EVPN\u地址\u系列
将字典bgp_neights与bgp_neighter_01组合起来,并在主机变量中创建变量my_bgp_neights
shell>cat主机变量/srv1.yml
bgp__01:
对等组:“{{peer\u group\u name}”
说明:“{description}}”
my_-bgp_邻居:{{bgp_邻居}默认({})|
组合({“bgp_近邻_01”:bgp_近邻_01})}
然后是剧本
shell>cat playbook.yml
-主持人:srv1
变量:
对等组名称:我的对等组名称
描述:我的描述
任务:
-调试:
我的邻居
给予
ok:[srv1]=>
我的邻居:
1.1.1.1:
描述:SPINE1\u EVPN\u地址\u系列
对等组:EVPN-OVERLAY-PEERS
1.1.1.2:
描述:SPINE2\u EVPN\u地址\u系列
对等组:EVPN-OVERLAY-PEERS
bgp__01:
描述:我的描述
对等组:我的对等组名称
不幸的是,不可能在主机变量中递归地组合字典
shell>cat主机变量/srv1.yml
bgp__01:
对等组:“{{peer\u group\u name}”
说明:“{description}}”
bgp_邻居:{{bgp_邻居}默认({})|
组合({“bgp_近邻_01”:bgp_近邻_01})}
会崩溃
错误是,原始消息:在模板字符串中检测到递归循环:{{bgp_邻居{124;默认({})}组合({“bgp_邻居{u 01”:bgp_邻居{u 01})}'
实际上,我使用了您建议的这个选项,但使用了我自己的Jinja模板,它允许我按照您建议的方式重新构造yaml定义。问题是,我使用的是Ansible角色(由其他人创建),它需要一个预定义的yaml结构(在我的示例中),我不确定如何解决它。嗨,Sambo9,我会咬紧牙关,将角色重构为有效的;)。祝你好运
bgp_neighbour:
- neighbour:
ip: 1.1.1.1:
peer_group: EVPN-OVERLAY-PEERS
description: SPINE1_EVPN_ADDRESS_FAMILY
- neighbour:
ip: 1.1.1.2:
peer_group: EVPN-OVERLAY-PEERS
description: SPINE2_EVPN_ADDRESS_FAMILY
- neighbour:
ip: '{{ bgp_neighbor_01 | default('empty')}}'
peer_group: '{{ peer_group_name }}'
description: '{{ description }}'