You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:31:00