【问题标题】:Combining JSON items using JMESPath and/or Ansible使用 JMESPath 和/或 Ansible 组合 JSON 项
【发布时间】:2020-10-18 14:29:08
【问题描述】:

我有一个 Ansible playbook,它查询设备清单 API 并返回一个 JSON 结果,其中包含许多遵循这种格式的记录:

{
    "service_level": "Test", 
    "tags": [
        "Application:MyApp1"
    ], 
    "fqdn": "matestsvcapp1.vipcustomers.com", 
    "ip": "172.20.11.237", 
    "name": "matestsvcapp1.vipcustomers.com"
}

然后我遍历这些 ansible 任务以查询我关心的每个 IP 地址的 JSON 结果:

- 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 中做其他任务,将这些数据推送到其他系统中,一切正常。

但是,我刚刚收到管理层的请求,他们希望在我将这些数据推送到的某些系统中看到“服务级别”表示为标签。因此,我需要将 '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 将结果连接在一起,并尝试使用 combine or map 以“ansible”方式进行操作,但我无法让其中任何一个工作.

对处理这个问题的正确方法有什么想法吗?提前致谢!

注意:'tags' 是一个字符串列表,尽管它是用 key:value 格式编写的,但它实际上只是一个字符串。

【问题讨论】:

  • 我不清楚您的数据到底是什么样的。您能否发布一个包含示例数据的最小剧本,以完全重现您尝试解决的问题?

标签: json ansible jmespath


【解决方案1】:

要添加两个数组,请使用 + 运算符,如下所示:

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

【讨论】:

  • 这不是确切的答案,但引导我走下去。我基本上了解到您不能更新现有项目,但需要注册一个新项目。稍后在我的剧本中,我组合了多个值,并将tags + ["service_level:" ~ service_level ] 部分添加到其中允许我组合我需要的项目。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多