2011-03-09 12 views
10

Come individuare su quale dispositivo EBS Volume è montato con Python Boto v2.0?Utilizzo di Boto per trovare a quale dispositivo e volume EBS è montato

boto.ec2.Volume ha alcune proprietà interessanti come attachment_state e volume_state. Ma ci sono delle funzioni per la mappatura dei dispositivi?

boto.manage.volume ha get_device(self, params) ma richiede un CommandLineGetter.

Eventuali indicazioni su come procedere o alcuni esempi di utilizzo di boto.manage?

risposta

8

Non è chiaro se si sta eseguendo questo dall'istanza stessa o esternamente. Se quest'ultimo, non avrai bisogno della chiamata ai metadati. Basta fornire l'id di istanza.

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 

Si noti che un'istanza può avere più volumi, quindi il codice robusto non presupporrà che ci sia un singolo dispositivo.

+0

funziona come un il fascino, grazie! –

+0

@VincentTheeten Se questa soluzione era quello che stavi cercando, si dovrebbe accettarlo. – citruspi

12

Credo che attach_data.device sia quello che stai cercando. parte del volume.

Ecco un esempio, non so se questo è il modo migliore, ma uscite volumeid, InstanceID e attachment_data qualcosa come:

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

Se si desidera anche le mappature dispositivo a blocchi (in linux, locale nome del dispositivo del volume EBS), è anche possibile utilizzare EC2Connection.get_instance_attribute per recuperare un elenco dei nomi dei dispositivi locali e le loro corrispondenti oggetti EBS:

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

Ciò restituirà un dizionario con i nomi dei dispositivi locali come chiavi e oggetti EBS come valori (da cui y Puoi ottenere tutti i tipi di cose come l'id del volume).

1

Il modo migliore che ho trovato è quello di ottenere tutte le risorse in una regione alla volta e associare voi stessi:

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