web-dev-qa-db-fra.com

Ajouter une nouvelle valeur-clé à un fichier json à l'aide d'Ansible

J'utilise Ansible pour automatiser certaines étapes de configuration pour ma machine virtuelle d'application, mais j'ai du mal à insérer une nouvelle valeur-clé dans un fichier json existant sur l'hôte distant.

Disons que j'ai ce fichier json:

{
  "foo": "bar"
}

Et je veux insérer une nouvelle paire de valeurs clés pour que le fichier devienne:

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

Comme le format json n'est pas basé sur les lignes, j'exclus le module lineinfile de mes options. De plus, je préférerais ne pas utiliser de modules externes. Google continue de me donner des exemples pour montrer comment lire le fichier json, mais rien sur la modification des valeurs json et leur réécriture dans le fichier. Appréciez vraiment votre aide s'il vous plaît!

9
fengye87

comme le fichier est au format json, vous pouvez importer le fichier dans une variable, ajouter la paire clé/valeur supplémentaire que vous souhaitez, puis réécrire dans le système de fichiers.

voici une façon de le faire:

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

MISE À JOUR :

comme OP mis à jour, le code devrait fonctionner vers l'hôte distant, dans ce cas, nous ne pouvons pas utiliser included_vars ou recherches. Nous pourrions utiliser le module Slurp.

NOUVEAU code pour les hôtes distants:

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

j'espère que cela aide

8
ilias-sp
 - 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
0
Rich Nahra