首页 > 解决方案 > 如何判断 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上,但我想知道这有多可靠以及是否有替代方法。

标签: boto3aws-cli

解决方案


正如 Shivam 所提到的,您可以从“描述图像”API 调用中的描述中获取操作系统。如果它不包含在此处,那么您可能不得不恢复检查/dev/xvda1and /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


推荐阅读