2011-03-09 28 views
10

Làm cách nào để tìm thiết bị EBS được lắp với Python Boto v2.0?Sử dụng Boto để tìm thiết bị và Ổ đĩa EBS nào được lắp

boto.ec2.Volume có một số tính năng thú vị như attachment_statevolume_state. Nhưng có chức năng nào cho bản đồ thiết bị không?

boto.manage.volumeget_device(self, params) nhưng yêu cầu CommandLineGetter.

Bất kỳ con trỏ nào về cách tiến hành hoặc một số mẫu sử dụng boto.manage?

Trả lời

8

Nó không rõ ràng nếu bạn đang chạy điều này từ bản thân cá thể hoặc bên ngoài. Nếu sau này, bạn sẽ không cần cuộc gọi siêu dữ liệu. Chỉ cần cung cấp id cá thể.

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 

Lưu ý rằng một thể hiện có thể có nhiều tập, vì vậy mã mạnh sẽ không giả định có một thiết bị duy nhất.

+0

trình giống như một nhờ charm-! –

+0

@VincentTheeten Nếu giải pháp này là những gì bạn đang tìm kiếm, bạn nên chấp nhận nó. – citruspi

12

Tôi tin attach_data.device là thứ bạn đang tìm kiếm. một phần của khối lượng.

Heres một ví dụ, không chắc chắn nếu điều này là cách tốt nhất, nhưng nó ra volumeid, instanceid, và attachment_data cái gì đó như:

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

Nếu bạn cũng muốn ánh xạ thiết bị khối (trong linux, các địa phương tên thiết bị của khối lượng EBS), bạn cũng có thể sử dụng EC2Connection.get_instance_attribute để lấy một danh sách các tên thiết bị cục bộ và các đối tượng EBS tương ứng của họ:

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

này sẽ trả về một từ điển với tên thiết bị cục bộ như là chìa khóa, và các đối tượng EBS làm giá trị (từ đó y Bạn có thể lấy đủ mọi thứ như volume-id).

1

Cách tốt nhất mà tôi đã tìm thấy là để có được tất cả các nguồn lực trong một khu vực tại một thời điểm và kết hợp chúng mình:

#!/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() 
Các vấn đề liên quan