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

如何编写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模块:
    1. 解码并解析原JSON数据;
    2. 筛选出class为class1的元素,用combine递归合并新的学生信息;
    3. 保留未匹配到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:49:54