我使用Ansible自动执行应用程序VM的某些配置步骤,但很难将新的键值插入远程主机上的现有json文件。
说我有这个json文件:
{
"foo": "bar"
}
我想插入一个新的键值对来使文件成为:
{
"foo": "bar",
"hello": "world"
}
由于json格式不是基于行的,我从我的选项中排除lineinfile
模块。此外,我宁愿不使用任何外部模块。谷歌一直给我举例说明如何阅读json文件,但没有关于更改json值并将它们写回文件。非常感谢您的帮助!
答案 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)
就我而言,它缺少我们可能必须创建基本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