使用 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 将这个新数组放入一个变量中供以后使用。