我试图根据deployment_version标签获得启动模板VersionNumber。
aws ec2 describe-launch-template-versions --launch-template-id lt-1234
将返回类似
的内容{
"LaunchTemplateVersions": [
{
"LaunchTemplateId": "lt-1234",
"LaunchTemplateName": "api",
"VersionNumber": 16,
"LaunchTemplateData": {
"TagSpecifications": [
{
"ResourceType": "instance",
"Tags": [
{
"Key": "deployment_version",
"Value": "release/6.1"
},
{
"Key": "server_type",
"Value": "api"
}
]
}
]
}
},
{
"LaunchTemplateId": "lt-1234",
"LaunchTemplateName": "api",
"VersionNumber": 15,
"LaunchTemplateData": {
"TagSpecifications": [
{
"ResourceType": "instance",
"Tags": [
{
"Key": "deployment_version",
"Value": "release/5.7"
},
{
"Key": "server_type",
"Value": "api"
}
]
}
]
}
}
]
}
我试着用jq构建像这样的东西
aws ec2 describe-launch-template-versions --launch-template-id lt-1234 | jq '.LaunchTemplateVersions[] | select(.LaunchTemplateData.TagSpecifications.Tags[].Value=="release/6.1")'
但是它不工作,错误:
jq: error (at <stdin>:848): Cannot index array with string "Tags"
我能找到的大多数jq选择示例都是为单级对象制作的,有人知道如何使用上面的示例数据返回标记值(release/6.1)上的VersionNumber(16)吗?
当TagSpecifications
数组中有几个元素时,不清楚您想要发生什么(我假设可以有不同的资源类型)。如果您想在任何标记规范匹配的情况下获得所有版本号的流,您可以使用以下命令,利用Tags
数组可以转换为对象的事实:
.LaunchTemplateVersions[]
| select(any(.LaunchTemplateData.TagSpecifications[].Tags|from_entries; .deployment_version == "release/6.1"))
| .VersionNumber
to_entries
将数组(如[{"Key":"a", "Value":1}, {"Key":"b", "Value":2}]
)转换为对象(本例中为{"a":1, "b":2}
)。
如果您只对第一个标签感兴趣,则select
变为:
select(.LaunchTemplateData.TagSpecifications[0].Tags|from_entries.deployment_version == "release/6.1")
由于您的示例输入只包含一个规格,因此两者的输出是相同的:
16
如果您需要有效的JSON作为输出,您必须生成一个数组。要做到这一点,将模式.x[] | select(f) | g
替换为.x | map(select(f) | g)
。这应该输出[16]
。
但是可能有其他更适合你的解决方案。也许您只对"实例"类型的标签规格感兴趣。(只有一个项目具有该类型)?
aws ec2 describe-launch-template-versions --launch-template-id lt-1234 | jq '.LaunchTemplateVersions[] | select(.LaunchTemplateData.TagSpecifications[].Tags[] | select(.Key == "deployment_version" and .Value == "release/6.1")) | .VersionNumber'