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