我需要编写一个bash脚本,根据卷的Name标签将Amazon EBS卷附加到给定实例。标签的格式为"服务器名称上的设备"例如" / dev / xvdf on linuxserver"
我可以轻松执行以下命令来检索所有相关实例,但是我无法遍历json数组中的每个对象以获取VolumeId和Name标记。
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将每一行视为数组中的一个对象。
我非常感谢有关更好地解决这个问题的一些建议。
由于
答案 0 :(得分:1)
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