如何判断AMI是Ubuntu还是Amazon Linux?

时间:2019-07-09 15:25:44

标签: boto3 aws-cli

我需要一种自动找出实例的SSH用户名的方法。它需要知道AMI是Amazon Linux还是Ubuntu(Amazon Linux上为ec2-user @,而Ubuntu映像上为ubuntu @)

有人可以看到获取此信息的方法吗?

我一直在使用image.root_device_name,在Ubuntu上的Amazon Linux /dev/xvda上似乎是/dev/sda1,但我想知道这有多可靠,是否还有其他方法。

2 个答案:

答案 0 :(得分:0)

您可以从以下位置获取ImageId:

ec2=boto3.client('ec2') ec2.describe_instances()

然后在ec2.describe_images(ImageIds=[ImageId1,ImageId2])

中使用ImageId

答案 1 :(得分:0)

如Shivam所述,您可以从“描述图像” API调用中的描述中获取操作系统。尽管此处未包含该操作系统,但您可能不得不恢复到/dev/xvda1和{{ 1}}。 您可以使用以下内容传递实例ID并使用boto3获取用户名

/dev/sda1

或使用aws cli(与jq结合使用)

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'

您可以通过仅将实例ID作为参数传递来运行Shell函数,例如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 }