Python 使用Boto查找安装到哪个设备和EBS卷

Python 使用Boto查找安装到哪个设备和EBS卷,python,amazon-ec2,boto,amazon-ebs,Python,Amazon Ec2,Boto,Amazon Ebs,如何找到使用Python Boto v2.0将EBS卷装载到哪个设备 具有一些有趣的属性,如附件\u状态和卷\u状态。但是有没有用于设备映射的功能 具有get\u设备(self,params),但需要CommandLineGetter 关于如何继续的任何指针或使用boto.manage的一些示例?不清楚您是从实例本身还是从外部运行它。如果是后者,则不需要元数据调用。只需提供实例id from boto.ec2.connection import EC2Connection from boto.u

如何找到使用Python Boto v2.0将EBS卷装载到哪个设备

具有一些有趣的属性,如
附件\u状态
卷\u状态
。但是有没有用于设备映射的功能

具有
get\u设备(self,params)
,但需要CommandLineGetter


关于如何继续的任何指针或使用
boto.manage
的一些示例?

不清楚您是从实例本身还是从外部运行它。如果是后者,则不需要元数据调用。只需提供实例id

from boto.ec2.connection import EC2Connection
from boto.utils import get_instance_metadata

conn = EC2Connection()
m = get_instance_metadata()
volumes = [v for v in conn.get_all_volumes() if v.attach_data.instance_id == m['instance-id']]

print volumes[0].attach_data.device

请注意,一个实例可能有多个卷,因此健壮的代码不会假设只有一个设备。

我相信attach_data.device就是您要找的。卷的一部分

下面是一个示例,不确定这是否是最佳方式,但它输出volumeid、instanceid和附件_数据,如下所示:

Attached Volume ID - Instance ID - Device Name
vol-12345678 - i-ab345678 - /dev/sdp
vol-12345678 - i-ab345678 - /dev/sda1
vol-12345678 - i-cd345678 - /dev/sda1


import boto
ec2 = boto.connect_ec2()
res = ec2.get_all_instances()
instances = [i for r in res for i in r.instances]
vol = ec2.get_all_volumes()
def attachedvolumes():
    print 'Attached Volume ID - Instance ID','-','Device Name'
    for volumes in vol:
        if volumes.attachment_state() == 'attached':
            filter = {'block-device-mapping.volume-id':volumes.id}
            volumesinstance = ec2.get_all_instances(filters=filter)
            ids = [z for k in volumesinstance for z in k.instances]
            for s in ids:
                 print volumes.id,'-',s.id,'-',volumes.attach_data.device
# Get a list of unattached volumes           
def unattachedvolumes():
   for unattachedvol in vol:
       state = unattachedvol.attachment_state()
   if state == None:
        print unattachedvol.id, state
attachedvolumes()
unattachedvolumes()

如果还需要块设备映射(在linux中,EBS卷的本地设备名称),还可以使用
EC2Connection.get\u instance\u属性
检索本地设备名称及其相应EBS对象的列表:

def get_block_device_mapping(instance_id):
    return conn.get_instance_attribute(
            instance_id=instance_id,
            attribute='blockDeviceMapping'
            )['blockDeviceMapping']

这将返回一个字典,其中本地设备名称作为键,EBS对象作为值(从中可以获取各种内容,如卷id)。

我发现的最佳方法是一次获取一个区域中的所有资源,并自己关联它们:

#!/usr/bin/env python2
import boto.ec2

REGION = 'us-east'
CONN = boto.ec2.connect_to_region(REGION)

def main():
    volumes = conn.get_all_volumes()

    for volume in volumes:
        print volume

        # Match to an instance id
        print volume.attach_data.instance_id

        # # Object attributes:
        # print volume.__dict__

        # # Object methods:
        # print(dir(volume))

if __name__ == '__main__':
    main()

@如果这个解决方案是你想要的,你应该接受它。