我需要编写一个 bash 脚本,以根据卷的名称标签将 Amazon EBS 卷附加到给定实例。标签的格式为“服务器名称上的设备”,例如“Linux 服务器上的/dev/xvdf”
我可以轻松地执行以下命令来检索所有相关实例,但我无法遍历 json 数组中的每个对象以获取 VolumeId 和名称标签。
aws ec2 describe-volumes --region $region --filter Name=tag-key,Values="Name" Name=tag-value,Values="*$servername" --filter Name="status",Values="available" | jq '.Volumes[]'
示例输出是:
[
{
"AvailabilityZone": "us-east-1d",
"Attachments": [],
"Tags": [
{
"Value": "/dev/xvdg on linuxserver",
"Key": "Name"
}
],
"Encrypted": false,
"VolumeType": "io1",
"VolumeId": "vol-0233d8ec",
"State": "available",
"Iops": 120,
"SnapshotId": "",
"CreateTime": "2015-08-21T04:29:10.157Z",
"Size": 4
},
{
"AvailabilityZone": "us-east-1d",
"Attachments": [],
"Tags": [
{
"Value": "/dev/xvdf on linuxserver",
"Key": "Name"
}
],
"Encrypted": false,
"VolumeType": "io1",
"VolumeId": "vol-433bc8ae",
"State": "available",
"Iops": 120,
"SnapshotId": "",
"CreateTime": "2015-08-21T04:28:23.819Z",
"Size": 4
}
]
理想情况下,我想执行以下操作:
for object in $(aws ec2 describe-volumes --region $region --filter Name=tag-key,Values="Name" Name=tag-value,Values="*$servername" --filter Name="status",Values="available" | jq '.Volumes[]')
do
echo $object.VolumeId
done
但是 bash 将每一行都视为数组中的一个对象。
我会非常感谢一些关于更好的方法来解决这个问题的建议。
谢谢
最佳答案
jq
package可能会在这里帮助你。它的创建是为了填补使用 bash 脚本解析 JSON 的能力的空白。
如何从示例数据中获取卷 ID 的示例:
aws ec2 describe-volumes --region $region --filter Name=tag-key,Values="Name"\
Name=tag-value,Values="*$servername" --filter Name="status",Values="available"\
| jq .[].VolumeId
输出:
"vol-0233d8ec"
"vol-433bc8ae"
您可以拆分它以像这样将其作为数组进行迭代:
#!/bin/bash
volumeIds=$(aws ec2 describe-volumes --region $region --filter Name=tag-key,Values="Name"\
Name=tag-value,Values="*$servername" --filter Name="status",Values="available"\
| jq .[].VolumeId)
for i in `echo "$volumeIds"`
do
echo "$i is a volume ID"
done
# "vol-0233d8ec" is a volume ID
# "vol-433bc8ae" is a volume ID
关于json - 使用 bash 从 json 数组中检索多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32172066/