[英]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 $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')
代碼太麻煩了。 有沒有更好的方法來實現相同的效果?
這是一個將所有身份文檔導出到一個env中的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 \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
然后,一旦有了,您就可以使用這些其他提取其他雜項AWS實例數據到您的外殼環境中。
這是通用的實例數據,隨后的數據將進行細化:
# 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)
現在,所有標簽都位於您的外殼的env中,並帶有tag_前綴
您可以使用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]
")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.