我正在尝试读取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 $4}')
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 $3}')
HOSTNAME=$(echo $NAME_TAG | awk '{print tolower($0)}' | sed -e 's/ /-/g' -e 's/[()]//g')
代码太麻烦了。有没有更好的方法来实现同样的目标 提前致谢
答案 0 :(得分:1)
你可以使用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]
")
答案 1 :(得分:1)
这是一个shell函数,它将所有的身份文档导出为env:
get_identity_document() {
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document \
| grep -v "[{}]" \
| sed -e 's/\s*"\([^"]*\)"\s*:\s*"*\([^",]*\)"*,*/export \1=\2/'
}
您只需将输出评估为:
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
然后,一旦有了这些,您可以使用其他将其他misc AWS实例数据提取到shell env中的其他人
这是后续细化的通用数据:
# Query instance data
get_instance_data() {
if [ "$3" ] ; then
query=".$3"
fi
aws ec2 describe-instances --region=$2 --instance-id=$1 --query "Reservations[].Instances[]${query}" \
--output text
}
获取标签数据:
# Get all tags for an instance prefixed by $3 or tag_
get_instance_tag_vars() {
get_instance_data $1 $2 "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 $1 $2 "BlockDeviceMappings[?starts_with(DeviceName, '$3')].Ebs.VolumeId"
}
等。您可以根据需要附加其他JMESpath查询字符串以进行优化。
即:
eval $(get_identity_document)
eval $(get_instance_tag_vars $instanceId $region)
现在你的所有标签都在shell的env中,前缀是tag _