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 exists
copy:
  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

Tags:

Json

Ansible