使用 JMESPath and/or Ansible 组合 JSON 个项目
Combining JSON items using JMESPath and/or Ansible
我有一个查询设备清单的 Ansible 剧本 API 并返回一个 JSON 结果,其中包含大量遵循此格式的记录:
{
"service_level": "Test",
"tags": [
"Application:MyApp1"
],
"fqdn": "matestsvcapp1.vipcustomers.com",
"ip": "172.20.11.237",
"name": "matestsvcapp1.vipcustomers.com"
}
然后我循环执行这些 ansible 任务以查询 JSON 我关心的每个 IP 地址的结果:
- name: Set JMESQuery
set_fact:
jmesquery: "Devices[?ip_addresses[?ip.contains(@,'{{ ip_to_query }}' )]].{ip: '{{ ip_to_query }}', tags: tags[], , service_level: service_level }"
- name: Store values
set_fact:
inven_results: "{{ (inven_results| default([])) + (existing_device_info.json | to_json | from_json | json_query(jmesquery)) }}"
然后我继续在 ansible 中执行其他任务,将这些数据推送到其他系统,一切正常。
但是,我刚刚收到管理层的请求,他们希望在我将这些数据推送到的某些系统中看到 'service level' 表示为标签。因此,我需要组合 'tags' 和 'service_level' 项目,结果如下所示:
{
"tags": [
"Application:MyApp1",
"service_level:Test"
],
"fqdn": "matestsvcapp1.vipcustomers.com",
"ip": "172.20.11.237",
"name": "matestsvcapp1.vipcustomers.com"
}
我已经尝试修改 JMESPath 查询以使用 join function, and tried doing it the 'ansible' way, using the combine or map 将结果连接在一起,但我也无法使其中任何一个起作用。
对处理这个问题的正确方法有什么想法吗?提前致谢!
注意:'tags'是一个字符串列表,虽然写成key:value格式,但实际上只是一个字符串。
要添加两个数组,您可以像这样使用 +
运算符:
ansible localhost -m debug -a 'msg="{{ b + ["String3"] }}"' -e '{"b":["String1", "String2"]}'
结果:
localhost | SUCCESS => {
"msg": [
"String1",
"String2",
"String3"
]
}
所以如果我把你的 json 代码当作 test.json
你可以 运行
ansible localhost -m debug -a 'msg="{{ tags + ["service_level:" ~ service_level ] }}"' -e @test.json
结果:
localhost | SUCCESS => {
"msg": [
"Application:MyApp1",
"service_level:Test"
]
}
有了这些知识,您可以使用 set_fact 将这个新数组放入一个变量中供以后使用。
我有一个查询设备清单的 Ansible 剧本 API 并返回一个 JSON 结果,其中包含大量遵循此格式的记录:
{
"service_level": "Test",
"tags": [
"Application:MyApp1"
],
"fqdn": "matestsvcapp1.vipcustomers.com",
"ip": "172.20.11.237",
"name": "matestsvcapp1.vipcustomers.com"
}
然后我循环执行这些 ansible 任务以查询 JSON 我关心的每个 IP 地址的结果:
- name: Set JMESQuery
set_fact:
jmesquery: "Devices[?ip_addresses[?ip.contains(@,'{{ ip_to_query }}' )]].{ip: '{{ ip_to_query }}', tags: tags[], , service_level: service_level }"
- name: Store values
set_fact:
inven_results: "{{ (inven_results| default([])) + (existing_device_info.json | to_json | from_json | json_query(jmesquery)) }}"
然后我继续在 ansible 中执行其他任务,将这些数据推送到其他系统,一切正常。
但是,我刚刚收到管理层的请求,他们希望在我将这些数据推送到的某些系统中看到 'service level' 表示为标签。因此,我需要组合 'tags' 和 'service_level' 项目,结果如下所示:
{
"tags": [
"Application:MyApp1",
"service_level:Test"
],
"fqdn": "matestsvcapp1.vipcustomers.com",
"ip": "172.20.11.237",
"name": "matestsvcapp1.vipcustomers.com"
}
我已经尝试修改 JMESPath 查询以使用 join function, and tried doing it the 'ansible' way, using the combine or map 将结果连接在一起,但我也无法使其中任何一个起作用。
对处理这个问题的正确方法有什么想法吗?提前致谢!
注意:'tags'是一个字符串列表,虽然写成key:value格式,但实际上只是一个字符串。
要添加两个数组,您可以像这样使用 +
运算符:
ansible localhost -m debug -a 'msg="{{ b + ["String3"] }}"' -e '{"b":["String1", "String2"]}'
结果:
localhost | SUCCESS => {
"msg": [
"String1",
"String2",
"String3"
]
}
所以如果我把你的 json 代码当作 test.json
你可以 运行
ansible localhost -m debug -a 'msg="{{ tags + ["service_level:" ~ service_level ] }}"' -e @test.json
结果:
localhost | SUCCESS => {
"msg": [
"Application:MyApp1",
"service_level:Test"
]
}
有了这些知识,您可以使用 set_fact 将这个新数组放入一个变量中供以后使用。