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 }}'