Использование Boto для определения того, какое устройство и объем EBS монтируются
Как узнать, какое устройство монтируется с помощью Python Boto v2.0?
boto.ec2.Volume имеет некоторые интересные свойства, такие как attachment_state
и volume_state
. Но существуют ли какие-либо функции для сопоставления устройств?
boto.manage.volume имеет get_device(self, params)
, но требует CommandLineGetter.
Любые указатели на то, как действовать или некоторые примеры использования boto.manage
?
Ответы
Ответ 1
Я считаю, что attach_data.device - это то, что вы ищете. часть объема.
Вот пример, не уверен, что это лучший способ, но он выводит тома, 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()
Ответ 2
Неясно, запускаете ли вы это из самого экземпляра или извне. Если последнее, вам не понадобится вызов метаданных. Просто укажите идентификатор экземпляра.
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
Обратите внимание, что экземпляр может иметь несколько томов, поэтому надежный код не предполагает наличия одного устройства.
Ответ 3
Если вам также нужны сопоставления блок-устройств (в 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 в качестве значений (из которых вы можете получить всевозможные вещи, такие как идентификатор тома).
Ответ 4
Лучший способ, который я нашел, - получить все ресурсы в одном регионе за раз и связать их самостоятельно:
#!/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()