在 AWS EC2 实例中读取 TAG Key 的值
Read a TAG Key's value within AWS EC2 instance
我正在尝试读取 ec2 实例的 Name 标签,并使用用户数据自动将其设置为主机名。目前我正在使用
#!/bin/bash
apt update && apt-get install -y awscli
DOMAIN=domain.com
EC2_REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print }')
INSTANCE_ID=$(/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id)
NAME_TAG=$(aws ec2 describe-instances --region=$EC2_REGION --instance-id=$INSTANCE_ID --output text | grep TAGS | grep Name | awk -F"\t" '{print }')
HOSTNAME=$(echo $NAME_TAG | awk '{print tolower([=10=])}' | sed -e 's/ /-/g' -e 's/[()]//g')
代码太繁琐了。有没有更好的方法来实现同样的目标
提前致谢
您可以使用 Python 来解析您的 JSON(我不确定您认为这更简单还是更麻烦......现在我已经努力输入看来我 可读性不强?!):
HOSTNAME=$(aws ec2 describe-instances --instance-id=$INSTANCE_ID | python -c"
import sys
import json
ec2_info = json.loads(''.join(sys.stdin.readlines()))
print [t['Value']
for t in ec2_info['Reservations'][0]['Instances'][0]['Tags']
if t['Key'] == 'Name'][0]
")
这是一个 shell 函数,可以将所有身份文档导出到一个环境中:
get_identity_document() {
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document \
| grep -v "[{}]" \
| sed -e 's/\s*"\([^"]*\)"\s*:\s*"*\([^",]*\)"*,*/export =/'
}
您只需评估输出即可得到如下内容:
export devpayProductCodes=null
export privateIp=xx.xx.xx.xx
export availabilityZone=us-west-2a
export version=2010-08-31
export instanceId=i-XXXXXXXXXXXXXXXX
export billingProducts=null
export instanceType=t2.large
export accountId=XXXXXXXXXX
export imageId=ami-63ac5803
export pendingTime=2016-04-08T17:55:53Z
export architecture=x86_64
export kernelId=null
export ramdiskId=null
export region=us-west-2
然后一旦你有了它,你就可以使用这些其他人将其他杂项 AWS 实例数据提取到你的 shell env
这是通用的实例数据,后续会提炼:
# Query instance data
get_instance_data() {
if [ "" ] ; then
query="."
fi
aws ec2 describe-instances --region= --instance-id= --query "Reservations[].Instances[]${query}" \
--output text
}
获取标签数据:
# Get all tags for an instance prefixed by or tag_
get_instance_tag_vars() {
get_instance_data "Tags[]" \
| tr '\t' '=' \
| sed -e "s/^/export ${3:-tag_}/"
}
获取卷 ID
# Get instance volume ID from block device
# eg: get_instance_volume_id $instanceId $region /dev/sda
get_instance_volume_id() {
get_instance_data "BlockDeviceMappings[?starts_with(DeviceName, '')].Ebs.VolumeId"
}
等您可以附加其他 JMESpath 查询字符串以根据需要进行优化。
即:
eval $(get_identity_document)
eval $(get_instance_tag_vars $instanceId $region)
现在你所有的标签都在你的 shell 的环境中,前缀为 tag_
我正在尝试读取 ec2 实例的 Name 标签,并使用用户数据自动将其设置为主机名。目前我正在使用
#!/bin/bash
apt update && apt-get install -y awscli
DOMAIN=domain.com
EC2_REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print }')
INSTANCE_ID=$(/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id)
NAME_TAG=$(aws ec2 describe-instances --region=$EC2_REGION --instance-id=$INSTANCE_ID --output text | grep TAGS | grep Name | awk -F"\t" '{print }')
HOSTNAME=$(echo $NAME_TAG | awk '{print tolower([=10=])}' | sed -e 's/ /-/g' -e 's/[()]//g')
代码太繁琐了。有没有更好的方法来实现同样的目标 提前致谢
您可以使用 Python 来解析您的 JSON(我不确定您认为这更简单还是更麻烦......现在我已经努力输入看来我 可读性不强?!):
HOSTNAME=$(aws ec2 describe-instances --instance-id=$INSTANCE_ID | python -c"
import sys
import json
ec2_info = json.loads(''.join(sys.stdin.readlines()))
print [t['Value']
for t in ec2_info['Reservations'][0]['Instances'][0]['Tags']
if t['Key'] == 'Name'][0]
")
这是一个 shell 函数,可以将所有身份文档导出到一个环境中:
get_identity_document() {
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document \
| grep -v "[{}]" \
| sed -e 's/\s*"\([^"]*\)"\s*:\s*"*\([^",]*\)"*,*/export =/'
}
您只需评估输出即可得到如下内容:
export devpayProductCodes=null
export privateIp=xx.xx.xx.xx
export availabilityZone=us-west-2a
export version=2010-08-31
export instanceId=i-XXXXXXXXXXXXXXXX
export billingProducts=null
export instanceType=t2.large
export accountId=XXXXXXXXXX
export imageId=ami-63ac5803
export pendingTime=2016-04-08T17:55:53Z
export architecture=x86_64
export kernelId=null
export ramdiskId=null
export region=us-west-2
然后一旦你有了它,你就可以使用这些其他人将其他杂项 AWS 实例数据提取到你的 shell env
这是通用的实例数据,后续会提炼:
# Query instance data
get_instance_data() {
if [ "" ] ; then
query="."
fi
aws ec2 describe-instances --region= --instance-id= --query "Reservations[].Instances[]${query}" \
--output text
}
获取标签数据:
# Get all tags for an instance prefixed by or tag_
get_instance_tag_vars() {
get_instance_data "Tags[]" \
| tr '\t' '=' \
| sed -e "s/^/export ${3:-tag_}/"
}
获取卷 ID
# Get instance volume ID from block device
# eg: get_instance_volume_id $instanceId $region /dev/sda
get_instance_volume_id() {
get_instance_data "BlockDeviceMappings[?starts_with(DeviceName, '')].Ebs.VolumeId"
}
等您可以附加其他 JMESpath 查询字符串以根据需要进行优化。
即:
eval $(get_identity_document)
eval $(get_instance_tag_vars $instanceId $region)
现在你所有的标签都在你的 shell 的环境中,前缀为 tag_