使用Ansible修改/添加JSON文件



我有下面的JSON

{
"ServerConfigs": [{
"Name": "test1",
"ServerConfig": {
"HostUrl": "ws://127.0.0.1:9439",
"DataUrl": "ws://127.0.0.1:9809",
"ResultUrl": "ws://127.0.0.1:9949"
}
},
{
"Name": "test2",
"ServerConfig": {
"HostUrl": "ws://127.0.0.1:9460",
"DataUrl": "ws://127.0.0.1:9863",
"ResultUrl": "ws://127.0.0.1:9961"
}
},
{
"Name": "test4",
"ServerConfig": {
"HostUrl": "ws://127.0.0.1:8754",
"DataUrl": "ws://127.0.0.1:25778",
"ResultUrl": "ws://127.0.0.1:7312"
}
}
]
}

我想添加另一个名为test3的部分,该部分具有类似的参数,但在中间
我想使用Ansible来实现这一点。

使用set_facts,我可以在文件末尾(方括号之后(附加,所以我需要一个不同的解决方案

- name: append more key/values
set_fact:
imported_var: "{{ imported_var | default([]) | combine({ 'hello': 'world' }) }}"

我想有两条前进的路径:一条是您确切地知道插入位置,另一条是只希望项目按其Name排序

已知插入位置

- debug:
msg: >-
{{ server_configs[0:insert_at]
+ [{"Name": "test3", "ServerConfig": {}}]
+ server_configs[insert_at:] }}
vars:
# this just makes the expression less verbose
server_configs: '{{ imported_var.ServerConfigs }}'
insert_at: 2

产生

[
{
"Name": "test1",
"ServerConfig": {
"DataUrl": "ws://127.0.0.1:9809",
"HostUrl": "ws://127.0.0.1:9439",
"ResultUrl": "ws://127.0.0.1:9949"
}
},
{
"Name": "test2",
"ServerConfig": {
"DataUrl": "ws://127.0.0.1:9863",
"HostUrl": "ws://127.0.0.1:9460",
"ResultUrl": "ws://127.0.0.1:9961"
}
},
{
"Name": "test3",
"ServerConfig": {}
},
{
"Name": "test4",
"ServerConfig": {
"DataUrl": "ws://127.0.0.1:25778",
"HostUrl": "ws://127.0.0.1:8754",
"ResultUrl": "ws://127.0.0.1:7312"
}
}
]

按某个键排序

在这里,| sort过滤器将确保在该操作结束时一切如您所愿,而不必考虑特定的插入位置

- debug:
msg: >-
{{ (server_configs + [{"Name": "test3", "ServerConfig": {}}])
| sort(attribute="Name") }}
vars:
server_configs: '{{ imported_var.ServerConfigs }}'

产生与上述相同的输出

最新更新