首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不可替换变量字典键

不可替换变量字典键
EN

Stack Overflow用户
提问于 2021-04-21 21:08:06
回答 2查看 336关注 0票数 0

我知道以前也有人问过类似的问题,但我仍然无法在我的场景中得到我想要的结果。我的group_vars文件夹中有以下代码片段。有两个BGP邻居(1.1.1.1 and 1.1.1.2),它们在组级别上列出。但是,我希望能够列出更多的邻居,我希望在host_vars级别覆盖这些邻居。变量{{ bgp_neighbor_01 }}的替换不起作用,因为据我了解,Ansible不执行字典键的变量替换。是否有办法将我的前两个IP地址保持在组级,但也可以在主机级别上定义其他IP地址?提前谢谢你。

代码语言:javascript
复制
  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文件中创建了以下字典变量。

代码语言:javascript
复制
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邻居字典,然后我使用组合过滤器来组合组级和主机级的字典。

代码语言:javascript
复制
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文件中,我引用了合并的字典:

代码语言:javascript
复制
router_bgp:
  neighbors: "{{ my_bgp_neighbors }}"

我不需要对我的剧本做任何修改。我只更改了group_vars和host_vars文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-22 03:28:30

问:“将我的前两个IP地址保留在组级,但也在主机级别上定义额外的IP地址。”

A:将字典合并到host_vars中。例如,给定库存

代码语言:javascript
复制
shell> cat hosts
[group1]
srv1

和group_vars

代码语言:javascript
复制
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

代码语言:javascript
复制
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}) }}'

然后是剧本

代码语言:javascript
复制
shell> cat playbook.yml
- hosts: srv1
  vars:
    peer_group_name: my-peer-group-name
    description: my-description
  tasks:
    - debug:
        var: my_bgp_neighbors

给出

代码语言:javascript
复制
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中递归地组合字典

代码语言:javascript
复制
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}})}‘

票数 0
EN

Stack Overflow用户

发布于 2021-04-21 22:39:52

为什么不将group_vars更改为

代码语言:javascript
复制
  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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67203515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档