首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JQ交叉引用或如何用输入的另一部分替换一个值

JQ交叉引用或如何用输入的另一部分替换一个值
EN

Stack Overflow用户
提问于 2018-07-19 15:50:02
回答 0查看 295关注 0票数 2

我想解析terraform.tfstate (使用openstack提供程序),以返回实例名称和它的内部+浮动IP (如果已分配)。

首先选择我们感兴趣的内容:

代码语言:javascript
代码运行次数:0
运行
复制
jq -r '.modules?[]|.resources[]?|select(.type == "openstack_compute_floatingip_v2", .type == "openstack_compute_instance_v2")' < terraform.tfstate

为简单起见,使用上述部分的预解析示例(一个FIP和一个实例):

代码语言:javascript
代码运行次数:0
运行
复制
{
  "type": "openstack_compute_floatingip_v2",
  "depends_on": [
    "openstack_networking_router_interface_v2.management"
  ],
  "primary": {
    "id": "48b039fc-a9fa-4672-934a-32d6d267f280",
    "attributes": {
      "address": "209.66.89.143",
      "fixed_ip": "10.10.10.5",
      "id": "48b039fc-a9fa-4672-934a-32d6d267f280",
      "instance_id": "597e75e8-834d-4f05-8408-e2e6e733577e",
      "pool": "public",
      "region": "RegionOne"
    },
    "meta": {},
    "tainted": false
  },
  "deposed": [],
  "provider": "provider.openstack"
}
{
  "type": "openstack_compute_instance_v2",
  "depends_on": [
    "openstack_compute_floatingip_v2.management",
    "openstack_compute_secgroup_v2.ssh_only",
    "openstack_networking_network_v2.management"
  ],
  "primary": {
    "id": "597e75e8-834d-4f05-8408-e2e6e733577e",
    "attributes": {
      "access_ip_v4": "10.10.10.5",
      "access_ip_v6": "",
      "all_metadata.%": "1",
      "all_metadata.habitat": "sup",
      "availability_zone": "nova",
      "flavor_id": "eb36e84e-17c1-42ab-b359-4380f6f524ae",
      "flavor_name": "m1.large",
      "force_delete": "false",
      "id": "597e75e8-834d-4f05-8408-e2e6e733577e",
      "image_id": "c574aeed-e47c-4fb7-9da0-75550b76ee56",
      "image_name": "ubuntu-16.04",
      "key_pair": "vault-etcd_test_tf",
      "metadata.%": "1",
      "metadata.habitat": "sup",
      "name": "ctl01",
      "network.#": "1",
      "network.0.access_network": "false",
      "network.0.fixed_ip_v4": "10.10.10.5",
      "network.0.fixed_ip_v6": "",
      "network.0.floating_ip": "",
      "network.0.mac": "02:c6:61:f9:ee:7e",
      "network.0.name": "management",
      "network.0.port": "",
      "network.0.uuid": "f2468669-e321-4eb4-9ede-003e362a8988",
      "region": "RegionOne",
      "security_groups.#": "1",
      "security_groups.1845949017": "vault-etcd_test_ssh_only",
      "stop_before_destroy": "false"
    },
    "meta": {
      "e2bfb730-ecaa-11e6-8f88-34363bc7c4c0": {
        "create": 1800000000000,
        "delete": 1800000000000,
        "update": 1800000000000
      }
    },
    "tainted": false
  },
  "deposed": [],
  "provider": "provider.openstack"
}

需要的是从"type": "openstack_compute_floatingip_v2"获取替换.primary.attributes.address.fixed_ip,并从相应的.instance_id获取.name

所以,像这样:

代码语言:javascript
代码运行次数:0
运行
复制
{"address": "209.66.89.143",
"fixed_ip": "10.10.10.5",
"name": "ctl01"}

好吧,我在使用walk的时候有了一个想法,但我错过了如何从相应的实例id中实际分配适当的值:

代码语言:javascript
代码运行次数:0
运行
复制
jq -r "$(cat floating.jq)" terraform.tfstate

floating.jq:

代码语言:javascript
代码运行次数:0
运行
复制
def walk(f):
      . as $in
      | if type == "object" then
          reduce keys[] as $key
            ( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
      elif type == "array" then map( walk(f) ) | f
      else f
      end;
.modules?[]|.resources[]?|select(.type == 
    "openstack_compute_floatingip_v2", .type == 
    "openstack_compute_instance_v2")|
    .primary|walk( if  type == "object" and .attributes.address then 
    .attributes.instance_id |= "REFERRED VALUE HERE") else . end)
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51417144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档