2011-03-09 7 views
10

¿Cómo puedo averiguar a qué dispositivo se monta un Volumen de EBS con Python Boto v2.0?Usando Boto para encontrar a qué dispositivo y se monta el Volumen de EBS

tiene propiedades interesantes como attachment_state y volume_state. Pero, ¿hay alguna función para el mapeo de dispositivos?

boto.manage.volume tiene get_device(self, params) pero requiere un CommandLineGetter.

¿Alguna sugerencia sobre cómo proceder o algunas muestras del uso de boto.manage?

Respuesta

8

No está claro si está ejecutando esto desde la propia instancia o externamente. Si es este último, no necesitará la llamada de metadatos. Solo proporcione el ID de instancia.

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 

Tenga en cuenta que una instancia puede tener varios volúmenes, por lo código robusto no asumirá que hay un solo dispositivo.

+0

funciona como un Charm gracias! –

+0

@VincentTheeten Si esta solución era lo que estaba buscando, debería aceptarla. – citruspi

12

Creo que attach_data.device es lo que estás buscando. parte del volumen.

Aquí está un ejemplo, no estoy seguro si esta es la mejor manera, pero da salida a VolumeID, instanceid, y algo attachment_data como:

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

Si también desea que las asignaciones de dispositivo de bloque (en Linux, lo local nombre del dispositivo del volumen EBS), también se puede utilizar EC2Connection.get_instance_attribute para recuperar una lista de los nombres de los dispositivos locales y sus correspondientes objetos de EBS:

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

Esto devolverá un diccionario con los nombres de dispositivos locales como llaves y objetos de EBS como valores (de los cuales Puedes obtener todo tipo de cosas como el id. de volumen.

1

La mejor manera que he encontrado es conseguir todos los recursos de una región a la vez y les asociar a sí mismo:

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