boto3 - 如何判断 AMI 是 Ubuntu 还是 Amazon Linux?
问题描述
我需要一种方法来自动找出实例的 SSH 用户名。它需要知道 AMI 是 Amazon Linux 还是 Ubuntu(Amazon Linux 的 ec2-user@ vs Ubuntu 映像上的 ubuntu@)
有人可以看到获取此信息的方法吗?
我一直在使用image.root_device_name
它似乎在 Ubuntu/dev/xvda
上的 Amazon Linux/dev/sda1
上,但我想知道这有多可靠以及是否有替代方法。
解决方案
正如 Shivam 所提到的,您可以从“描述图像”API 调用中的描述中获取操作系统。如果它不包含在此处,那么您可能不得不恢复检查/dev/xvda1
and /dev/sda1
。您可以使用以下内容传递实例 id 并使用 boto3 获取用户名
import boto3
ec2=boto3.client('ec2')
instance_id = 'i-0defb5cd304ca2d7a'
def find_username(instance_id):
image_id = ec2.describe_instances(InstanceIds=[instance_id])["Reservations"][0]['Instances'][0]['ImageId']
image_type = ec2.describe_images(ImageIds=[image_id])['Images'][0]['Description']
elif 'Amazon Linux' in image_type:
return 'Username is ec2-user'
elif 'Ubuntu' in image_type:
return 'Username is ubuntu'
else:
return 'OS is not Amazon Linux or Ubuntu'
或使用 aws cli(结合 jq)
get_username () {
IMAGE_ID=$(aws ec2 describe-instances --instance-ids $1 | jq -r '.Reservations[].Instances[].ImageId');
IMAGE_TYPE=$(aws ec2 describe-images --image-ids $IMAGE_ID | jq '.Images[].Description');
if [[ $IMAGE_TYPE == *"Amazon Linux"* ]]; then
echo "Username is ec2-user"
elif [[ $IMAGE_TYPE == *"Ubuntu"* ]]; then
echo "Username is ubuntu"
else ;
echo "OS is not Amazon Linux or Ubuntu"
fi
}
您可以通过将实例 id 作为 arg 传递来运行 shell 函数,例如get_username i-xxxxxxxxx
推荐阅读
- accelerometer - 压缩来自 MEMS 加速度计的数据并使用 NBIoT 进行传输
- reactjs - 使用 TypeScript,带有 React 的 JSS 会为某些 css 属性抛出 `type is unassignable`
- javascript - How to change value on Map?
- algorithm - 对于以下问题,是否有时间复杂度更高的解决方案:
- javascript - Formatting a new array with existing data - problem
- python - 将 numpys 花式索引与切片相结合
- php - place content after id using functions.php
- azure-data-factory-2 - 在 Azure 数据工厂 V2 中重新运行活动
- shell - 如何从 shell 获取 YAML 文件中关键图像下的值内容
- excel - Excel PowerQuery 可以使用 IdentityServer4 进行身份验证吗?