Add a new key-value to a json file using Ansible Add a new key-value to a json file using Ansible json json

Add a new key-value to a json file using Ansible


since the file is of json format, you could import the file to a variable, append the extra key:value pairs you want, and then write back to the filesystem.

here is a way to do it:

---- 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

UPDATE:

as OP updated, the code should work towards remote host, in this case we cant use included_vars or lookups. We could use the slurp module.

NEW code for remote hosts:

---- 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

hope it helps


ilias-sp's solution is great!

In my case, it lacked the case when we may have to create a base json file.So I had to add this task in the beginning of the play:

- name: Ensure json file existscopy:  content: "{}"  dest: /tmp/var.json  force: false


For people who are OK with custom ansible modules: https://github.com/ParticleDecay/ansible-jsonpatch works great!

With this you can simply do:

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