如何通过Ansible将源JSON字典值动态更新到目标JSON对应条目
解决方案
不要用replace模块做正则文本匹配,很容易因为JSON格式排版变化、字段重复出现匹配错误,直接用JSON结构化处理的方式更稳妥,完整playbook如下:
- hosts: localhost gather_facts: no tasks: # 读取源JSON文件内容并解析 - name: 加载源JSON数据 set_fact: source_json: "{{ lookup('file', 'Source.json') | from_json }}" # 读取目标JSON文件内容并解析 - name: 加载目标JSON数据 set_fact: dest_json: "{{ lookup('file', 'Destination.json') | from_json }}" # 将源JSON的列表转换为键值对字典,方便后续快速查询匹配 - name: 构建源数据键值映射表 set_fact: source_map: "{{ source_map | default({}) | combine({item.key: item.value}) }}" loop: "{{ source_json }}" # 遍历目标JSON的每一项,匹配到对应key就替换value,未匹配就保留原值 - name: 合并更新目标JSON数据 set_fact: updated_dest: "{{ updated_dest | default([]) + [item | combine({'value': source_map[item.key]}) if item.key in source_map else item] }}" loop: "{{ dest_json }}" # 将处理后的结果格式化后写回目标文件 - name: 写入更新后的目标JSON文件 copy: content: "{{ updated_dest | to_nice_json(indent=4) }}" dest: Destination.json
如果你的需求是替换后的value需要前后加**(和你示例的期望输出一致),只需要修改更新步骤的value取值即可,对应修改为:
item | combine({'value': '**' + source_map[item.key] + '**'})
内容的提问来源于stack exchange,提问作者Zeeshan
相关产品推荐
相关产品推荐

