簡體   English   中英

在AWS EC2實例中讀取TAG密鑰的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM