根据标签查找启动模板



我试图根据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'

最新更新