jq:使用上下文对象作为根查询中的键

jq: Use context object as key in query from root

我有一个 JSON 对象,其中相关部​​分的形式为

{
  "_meta": {
    "hostvars": {
      "name_1": {
        "ansible_host": "10.0.0.1"
      },
      "name_2": {
        "ansible_host": "10.0.0.2"
      },
      "name_3": {
        "ansible_host": "10.0.0.3"
      }
    }
  },
  ...
  "nodes": {
    "hosts": [
      "name_1",
      "name_2"
    ]
  }
} 

ansible-inventory --list的输出,供参考)

我想使用 jq 通过查找 ._meta.hostvars 中的名称来生成 nodes 主机的 IP 列表。在示例中,输出应为:

10.0.0.1
10.0.0.2

请注意,不应包含 10.0.0.3,因为 name_3 不在 .nodes.hosts 列表中。所以只做 jq -r '._meta.hostvars[].ansible_host' 是行不通的。

我试过 jq '.nodes.hosts[] | ._meta.hostvars[.].ansible_host' 但失败了,因为 ._meta 没有从管道后的根开始扫描。

您可以在更改上下文之前将根存储在变量中:

jq -r '. as $root | .nodes.hosts[] | $root._meta.hostvars[.].ansible_host'

但更好的解决方案是直接内联“主机”查询:

jq -r '._meta.hostvars[.nodes.hosts[]].ansible_host'