Использование Boto для определения устройства и тома EBS - PullRequest
10 голосов
/ 09 марта 2011

Как узнать, к какому устройству подключен том EBS с Python Boto v2.0?

boto.ec2.Volume имеет несколько интересных свойств, таких как attachment_state и volume_state. Но есть ли функции для сопоставления устройств?

boto.manage.volume имеет get_device(self, params), но требует CommandLineGetter.

Любые указания о том, как действовать, или некоторые примеры использования boto.manage?

Ответы [ 4 ]

12 голосов
/ 12 мая 2011

Я считаю, что 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()
8 голосов
/ 10 марта 2011

Не ясно, запускаете ли вы это из самого экземпляра или извне.Если последнее, вам не понадобится вызов метаданных.Просто укажите идентификатор экземпляра.

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

Обратите внимание, что экземпляр может иметь несколько томов, поэтому надежный код не будет предполагать, что есть одно устройство.

2 голосов
/ 03 апреля 2014

Если вам также нужны сопоставления блочных устройств (в linux - имя локального устройства тома EBS), вы также можете использовать EC2Connection.get_instance_attribute для получения списка имен локальных устройств и соответствующих им объектов EBS:

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

Это вернет словарь с именами локальных устройств в качестве ключей и объектами EBS в качестве значений (из которых вы можете получить всевозможные вещи, такие как идентификатор тома).

1 голос
/ 02 июня 2015

Лучший способ, который я нашел, - это получать все ресурсы в одном регионе и связывать их самостоятельно:

#!/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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...