如何编写Ansible Playbook修改JSON中class1的pupil的name与age值
编写Ansible Playbook修改指定JSON字段
需求说明
需要修改目标JSON文件中,school数组里class为class1的对象下,properties.pupil的name和age字段值,其余内容保持不变。
实现Playbook(通用兼容版)
- name: 修改指定JSON字段 hosts: localhost tasks: - name: 读取目标JSON文件内容 ansible.builtin.slurp: src: /path/to/your/target.json # 替换为实际文件路径 register: raw_json - name: 处理JSON数据,更新class1的学生信息 ansible.builtin.set_fact: updated_data: > {{ raw_json.content | b64decode | from_json | combine({ 'school': (raw_json.content | b64decode | from_json).school | map('combine', {'properties': {'pupil': {'name': 'Jane', 'age': '9'}}}, recursive=True) | selectattr('class', 'equalto', 'class1') | list + ((raw_json.content | b64decode | from_json).school | selectattr('class', 'ne', 'class1') | list) }, recursive=True) }} - name: 将更新后的数据写入文件 ansible.builtin.copy: content: "{{ updated_data | to_nice_json }}" dest: /path/to/your/target.json # 替换为实际文件路径
代码说明
- slurp模块:读取JSON文件并返回base64编码内容,后续需解码解析为Ansible可处理的字典结构。
- set_fact模块:
- 解码并解析原JSON数据;
- 筛选出
class为class1的元素,用combine递归合并新的学生信息; - 保留未匹配到
class1的原元素,重新组合成完整的school数组;
- copy模块:将格式化后的JSON数据写入目标文件。
简洁实现(依赖community.general集合)
若已安装community.general集合,可使用jsonpatch模块直接定位修改:
- name: 使用JSON补丁修改指定字段 hosts: localhost collections: - community.general tasks: - name: 更新class1的学生信息 community.general.jsonpatch: src: /path/to/your/target.json dest: /path/to/your/target.json patches: - op: replace path: "/school/0/properties/pupil/name" value: "Jane" - op: replace path: "/school/0/properties/pupil/age" value: "9"
注意:此方法要求
class1在school数组的第0位(索引从0开始),若数组顺序可能变动,优先使用通用版方案。
内容的提问来源于stack exchange,提问作者Hà Hoàng gadichoi
相关产品推荐
相关产品推荐

