Ansible如何在settings.yaml中拼接已定义变量与额外变量?
问题分析
你的settings.yaml有两个核心问题导致报错:
- YAML语法不完整:
cust_sub_int行的Jinja2模板未闭合——缺少了}}和结尾的引号,YAML解析器处理到这里时直接出现逻辑混乱,抛出“未找到预期键”的错误。 - 变量渲染逻辑不对:就算修复了语法问题,
include_vars本身不会解析文件内的Jinja2模板,只会原封不动加载YAML内容,根本不会帮你完成cust_int和cust两个变量的拼接。
解决方案
第一步:修正settings.yaml的语法错误
补全不完整的模板内容,确保YAML能正常解析:
cust_int: 'ens224' cust_sub_int: "{{ cust_int }}.{{ cust }}"
第二步:正确加载并渲染变量
因为include_vars不支持解析Jinja2模板,我们可以用lookup('template')配合from_yaml过滤器,一次性完成模板渲染和变量加载——只需要在playbook里写一次,不用每个playbook都重复添加set_fact:
- name: 加载并渲染配置变量 set_fact: settings: "{{ lookup('template', '../../../settings.yaml') | from_yaml }}" - debug: msg="{{ settings.cust_sub_int }}"
执行时,Ansible会先把settings.yaml里的Jinja2模板渲染成实际值(将cust_int和通过--extra-var传入的cust拼接完成),再把渲染后的内容转换为YAML变量,最终就能得到正确的cust_sub_int值。
完全不用set_fact的替代方案
要是你连一次set_fact都不想用,可以把配置文件改成Jinja2模板(比如命名为settings.j2),先用template模块渲染成临时文件,再用include_vars加载:
- name: 渲染配置模板到临时文件 template: src: ../../../settings.j2 dest: /tmp/rendered_settings.yaml mode: '0644' - name: 加载渲染后的配置变量 include_vars: file: /tmp/rendered_settings.yaml name: settings - debug: msg="{{ settings.cust_sub_int }}"
settings.j2的内容和修正后的settings.yaml完全一致:
cust_int: 'ens224' cust_sub_int: "{{ cust_int }}.{{ cust }}"
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

