如何在Jinja2模板中跨组访问Ansible组级变量?
按组名直接访问Ansible组级变量的方法
你的清单和组变量配置如下:
清单文件:
leaf: hosts: leaf-01a: leaf-01b: spine: hosts: spine-01: spine-02: spine-03:
group_vars/spine.yml中的变量:
offset: 100
目前你在leaf组主机的模板里通过{{ hostvars[groups["spine"][0]]["offset"] }}获取spine组的变量,确实可以实现需求,但可以用更简洁的方式模拟你想要的group_vars["spine"]["offset"]效果:
方法1:定义全局变量封装组变量
在playbook中定义一个变量,把spine组任意主机的hostvars赋值给它,之后在模板里就可以直接通过这个变量访问组级变量:
- name: 处理leaf主机 hosts: leaf vars: spine_group_vars: "{{ hostvars[groups.spine.0] }}" tasks: - name: 生成配置文件 template: src: your_template.j2 dest: /path/to/config
然后在模板中使用:
{{ spine_group_vars.offset }}
方法2:直接简化现有写法
你可以把原写法简化为更易读的形式:
{{ hostvars[groups.spine.0].offset }}
说明
Ansible本身没有提供直接按组名访问的group_vars全局字典,因为组级变量本质上是附加到组内每台主机的hostvars中的,组内所有主机的组变量默认是一致的(除非被主机级变量覆盖),所以通过组内任意主机的hostvars获取是最可靠的方式。
内容的提问来源于stack exchange,提问作者chrixm
相关产品推荐
相关产品推荐

