如何用Ansible 2.7动态将file2对应键值覆盖file1中的值?
用Ansible 2.7动态替换多格式文件中的键值对
核心思路
先把file2里的所有键值对解析成字典,再根据file1的格式(文本类键值/JSON)做针对性替换,全程动态匹配键,无需硬编码。
场景1:处理文本类文件(.txt、.js里的key: value或key=value格式)
下面的playbook会先读取file2生成键值映射,再循环映射项用正则动态替换file1中对应键的值:
- name: 动态替换文本文件键值 hosts: localhost vars: file1_path: "./file1" file2_path: "./file2" tasks: - name: 读取file2内容 slurp: src: "{{ file2_path }}" register: file2_content - name: 解析file2为键值字典 set_fact: key_value_map: > {{ dict( file2_content.content | b64decode | split('\n') | select('match', '^\\s*\\w+\\s*[:=]\\s*.+$') | map('regex_replace', '^\\s*(\\w+)\\s*[:=]\\s*(.+)$', '\\1=\\2') | map('split', '=', 1) ) }} - name: 循环替换file1对应键值 replace: path: "{{ file1_path }}" regexp: "^(\\s*{{ item.key }}\\s*[:=]\\s*).*$" replace: "\\1{{ item.value }}" loop: "{{ key_value_map | dict2items }}" when: item.value | length > 0
说明:
- 解析逻辑兼容
key: value和key=value两种格式,自动过滤空行与无效行 - 正则替换会保留键前后的空格,仅替换值部分,尽量贴合原文件格式
when条件跳过file2中值为空的行
场景2:处理JSON格式文件
如果file1是JSON,需先转成Ansible字典,修改对应键值后再写回文件:
- name: 动态替换JSON文件键值 hosts: localhost vars: file1_path: "./file1.json" file2_path: "./file2" tasks: - name: 读取file2并解析为键值字典 slurp: src: "{{ file2_path }}" register: file2_content - set_fact: key_value_map: > {{ dict( file2_content.content | b64decode | split('\n') | select('match', '^\\s*\\w+\\s*[:=]\\s*.+$') | map('regex_replace', '^\\s*(\\w+)\\s*[:=]\\s*(.+)$', '\\1=\\2') | map('split', '=', 1) ) }} - name: 读取file1的JSON内容 slurp: src: "{{ file1_path }}" register: file1_json - name: 修改JSON字典中的对应键值 set_fact: updated_json: "{{ file1_json.content | b64decode | from_json | combine(key_value_map, recursive=True) }}" - name: 将修改后的JSON写回文件 copy: content: "{{ updated_json | to_nice_json }}" dest: "{{ file1_path }}"
说明:
- Ansible 2.7自带的
combine模块会用file2的键值覆盖file1对应键,递归合并支持嵌套JSON结构 to_nice_json保证输出JSON格式美观,贴近原文件风格
适配提示
你可以根据file1的实际格式选择对应片段,若需同时处理多种格式,可通过文件后缀加条件判断来分支执行不同逻辑。
内容的提问来源于stack exchange,提问作者ChuckB0ris
相关产品推荐
相关产品推荐

