使用Ansible将新键值添加到json文件

时间:2018-06-11 11:07:08

标签: json ansible

我使用Ansible自动执行应用程序VM的某些配置步骤,但很难将新的键值插入远程主机上的现有json文件。

说我有这个json文件:

{
  "foo": "bar"
}

我想插入一个新的键值对来使文件成为:

{
  "foo": "bar",
  "hello": "world"
}

由于json格式不是基于行的,我从我的选项中排除lineinfile模块。此外,我宁愿不使用任何外部模块。谷歌一直给我举例说明如何阅读json文件,但没有关于更改json值并将它们写回文件。非常感谢您的帮助!

4 个答案:

答案 0 :(得分:6)

由于文件是json格式,您可以将文件导入变量,附加您想要的额外键:值对,然后写回文件系统。

这是一种方法:

---
- hosts: localhost
  connection: local
  gather_facts: false
  vars:

  tasks:
  - name: load var from file
    include_vars:
      file: /tmp/var.json
      name: imported_var

  - debug:
      var: imported_var

  - name: append more key/values
    set_fact:
      imported_var: "{{ imported_var | default([]) | combine({ 'hello': 'world' }) }}"

  - debug:
      var: imported_var

  - name: write var to file
    copy: 
      content: "{{ imported_var | to_nice_json }}" 
      dest: /tmp/final.json

<强>更新

随着OP的更新,代码应该适用于远程主机,在这种情况下,我们无法使用included_vars或查找。我们可以使用slurp模块。

远程主机的

代码:

---
- hosts: greenhat
  # connection: local
  gather_facts: false
  vars:

  tasks:
  - name: load var from file
    slurp:
      src: /tmp/var.json
    register: imported_var

  - debug:
      msg: "{{ imported_var.content|b64decode|from_json }}"

  - name: append more key/values
    set_fact:
      imported_var: "{{ imported_var.content|b64decode|from_json | default([]) | combine({ 'hello': 'world' }) }}"

  - debug:
      var: imported_var

  - name: write var to file
    copy: 
      content: "{{ imported_var | to_nice_json }}" 
      dest: /tmp/final.json

希望有所帮助

答案 1 :(得分:1)

ilias-sp's solution很棒!

就我而言,它缺少我们可能必须创建基本json文件的情况。 所以我必须在剧本开头添加此任务:

<img src="{{'data:image/jpg;base64,' + image_path}}" />

答案 2 :(得分:0)

 - name: update log
    copy:
      content: "{{ log | to_nice_json}}"
      dest: "{{ log_file }}"
    vars:
      log: "{{ (lookup('file', log_file) | from_json) + ([{'job': (build_id if build_id != '' else 'dev'), 'keystore': ks, 'timestamp': ansible_date_time.iso8601}]) }}"
      log_file: log/log.json
      build_id: "{{ lookup('ENV', 'BUILD_ID') }}"
    tags: log

答案 3 :(得分:0)

对于那些习惯使用自定义ansible模块的人:https://github.com/ParticleDecay/ansible-jsonpatch很棒!

您可以简单地这样做:

- name: append key/values
  json_patch:
    src: /tmp/var.json
    operations:
      - op: add
        path: "/hello"
        value: "world"
    pretty: yes
    create: yes