10

Python Boto v2.0 で EBS ボリュームがマウントされているデバイスを見つけるにはどうすればよいですか?

boto.ec2.Volumeには、 や などの興味深いプロパティがいくつかattachment_stateありvolume_stateます。しかし、デバイスマッピングのための機能はありますか?

boto.manage.volumeにはget_device(self, params)CommandLineGetter がありますが必要です。

続行する方法または使用のいくつかのサンプルに関する指針はありますboto.manageか?

4

4 に答える 4

12

attach_data.device はあなたが探しているものだと思います。ボリュームの一部。

以下に例を示します。これが最善の方法かどうかはわかりませんが、次のように volumeid、instanceid、および attachment_data を出力します。

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()
于 2011-05-11T20:57:44.593 に答える
8

これをインスタンス自体から実行しているのか、外部から実行しているのかは明らかではありません。後者の場合、メタデータ呼び出しは必要ありません。インスタンス 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

インスタンスには複数のボリュームがある場合があるため、堅牢なコードは単一のデバイスがあると想定しないことに注意してください。

于 2011-03-10T03:11:13.280 に答える
1

私が見つけた最善の方法は、一度に 1 つのリージョンのすべてのリソースを取得し、それらを自分で関連付けることです。

#!/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()
于 2015-06-01T23:20:23.417 に答える