如何动态读取配置文件标签并替换为Ansible Vault对应变量值
方案1:使用Ansible template模块(最推荐)
这是Ansible原生支持的配置变量替换方案,无需手写正则匹配,维护成本最低:
- 将原配置文件重命名为
application.properties.j2作为Jinja2模板,把其中<%=@xxx%>格式的占位符替换为Jinja2变量格式{{ xxx }},模板内容示例:
mongo.uri={{ dbruchost }} mongo.replica.set=set0 mongo.database={{ dbrucdb }} mongo.user={{ dbrucuser }} mongo.password={{ dbrucpass }}
- Playbook中直接调用template模块完成渲染,Ansible会自动加载包括Vault在内的所有变量完成替换:
- name: 渲染配置文件 template: src: 模板文件存放路径/application.properties.j2 dest: /tmp/artifacts/surveyMonkey/application.properties
方案2:保留原有标签格式,动态正则替换
如果不想修改原有配置的占位符格式,可以先提取配置中所有占位符的变量名,再循环匹配Vault变量完成替换:
- name: 读取目标配置文件内容 slurp: path: /tmp/artifacts/surveyMonkey/application.properties register: config_content - name: 提取所有待替换的变量名 set_fact: replace_vars: "{{ config_content.content | b64decode | regex_findall('<%=@([a-zA-Z0-9_.]+)%>') | unique }}" - name: 动态替换所有匹配的变量 replace: path: /tmp/artifacts/surveyMonkey/application.properties regexp: "<%=@{{ item }}%>" replace: "{{ vars[item] }}" loop: "{{ replace_vars }}" when: item in vars # 变量不存在时自动跳过,可按需添加失败告警逻辑
注意事项
- 两种方案均支持带特殊字符(比如点)的变量名,匹配时会严格校验和Vault中变量名的大小写、字符一致性
- 方案2可通过修改
regex_findall的正则规则,适配其他格式的占位符
内容的提问来源于stack exchange,提问作者Dalio141
相关产品推荐
相关产品推荐

