2011-03-09 33 views
10

Jak znaleźć, do którego urządzenia podłączono wolumin EBS za pomocą Pythona Boto v2.0?Używanie Boto do ustalenia, do którego urządzenia i woluminu EBS jest podłączony

boto.ec2.Volume ma kilka interesujących właściwości, takich jak attachment_state i volume_state. Ale czy są jakieś funkcje mapowania urządzeń?

boto.manage.volume ma get_device(self, params), ale wymaga CommandLineGetter.

Jakieś wskazówki, jak postępować, lub niektóre przykłady użycia boto.manage?

Odpowiedz

8

Nie jest jasne, czy uruchamiasz to z samej instancji, czy z zewnątrz. Jeśli to drugie, nie będziesz potrzebować wywołania metadanych. Po prostu podaj identyfikator instancji.

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 

Należy zauważyć, że instancja może mieć wiele woluminów, więc niezawodny kod nie zakłada, że ​​istnieje jedno urządzenie.

+0

działa jak charm- dzięki! –

+0

@VincentTheeten Jeśli to rozwiązanie było tym, czego szukałeś, powinieneś to zaakceptować. – citruspi

12

Uważam, że attach_data.device jest tym, czego szukasz. część objętości.

Herezje przykład, nie wiem, czy jest to najlepszy sposób, ale wyprowadza volumeid, instanceid i attachment_data coś takiego:

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

Jeśli też chcesz mapowania urządzenia blokowego (w Linuksie, lokalny Nazwa urządzenia objętości EBS), można również wykorzystać EC2Connection.get_instance_attribute aby pobrać listę lokalnych nazw urządzeń i ich odpowiednie obiekty EBS:

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

ten powróci do słownika z lokalnych nazw urządzeń jak klucze i obiektów EBS jako wartości (z których y możesz uzyskać wszystkie rodzaje rzeczy, takie jak id-volume).

1

Najlepszym sposobem znalazłem jest, aby wszystkie środki w jednym regionie w czasie i kojarzy im się:

#!/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()