我知道以前也有人问过类似的问题,但我仍然无法在我的场景中得到我想要的结果。我的group_vars文件夹中有以下代码片段。有两个BGP邻居(1.1.1.1 and 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 }}'这就是我如何根据弗拉基米尔的建议解决我的问题。我在group_vars文件中创建了以下字典变量。
evpn_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邻居字典,然后我使用组合过滤器来组合组级和主机级的字典。
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_vars文件中,我引用了合并的字典:
router_bgp:
neighbors: "{{ my_bgp_neighbors }}"我不需要对我的剧本做任何修改。我只更改了group_vars和host_vars文件。
发布于 2021-04-22 03:28:30
问:“将我的前两个IP地址保留在组级,但也在主机级别上定义额外的IP地址。”
A:将字典合并到host_vars中。例如,给定库存
shell> cat hosts
[group1]
srv1和group_vars
shell> cat group_vars/group1.yml
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_neighbors与bgp_neighbor_01组合起来,并在host_vars中创建变量my_bgp_neighbors
shell> cat host_vars/srv1.yml
bgp_neighbor_01:
peer_group: '{{ peer_group_name }}'
description: '{{ description }}'
my_bgp_neighbors: '{{ bgp_neighbors|default({})|
combine({"bgp_neighbor_01": bgp_neighbor_01}) }}'然后是剧本
shell> cat playbook.yml
- hosts: srv1
vars:
peer_group_name: my-peer-group-name
description: my-description
tasks:
- debug:
var: my_bgp_neighbors给出
ok: [srv1] =>
my_bgp_neighbors:
1.1.1.1:
description: SPINE1_EVPN_ADDRESS_FAMILY
peer_group: EVPN-OVERLAY-PEERS
1.1.1.2:
description: SPINE2_EVPN_ADDRESS_FAMILY
peer_group: EVPN-OVERLAY-PEERS
bgp_neighbor_01:
description: my-description
peer_group: my-peer-group-name不幸的是,不可能在host_vars中递归地组合字典
shell> cat host_vars/srv1.yml
bgp_neighbor_01:
peer_group: '{{ peer_group_name }}'
description: '{{ description }}'
bgp_neighbors: '{{ bgp_neighbors|default({})|
combine({"bgp_neighbor_01": bgp_neighbor_01}) }}'会崩溃
错误是,原始消息:在模板字符串中检测到的递归循环:{bgp_neighbors|default({})\复合({“bgp_neighbor_01”:bgp_neighbor_01}})}‘
’
发布于 2021-04-21 22:39:52
为什么不将group_vars更改为
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为空时停止?也可以检查https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable
https://stackoverflow.com/questions/67203515
复制相似问题