【问题标题】:Using Boto to find to which device and EBS Volume is mounted使用 Boto 查找挂载到哪个设备和 EBS 卷
【发布时间】:2011-07-12 04:26:39
【问题描述】:

如何使用 Python Boto v2.0 找到 EBS 卷挂载到哪个设备?

boto.ec2.Volume 有一些有趣的属性,例如 attachment_statevolume_state。但是有设备映射的功能吗?

boto.manage.volume 具有 get_device(self, params) 但需要 CommandLineGetter。

关于如何进行的任何指示或使用boto.manage 的一些示例?

【问题讨论】:

    标签: python amazon-ec2 boto amazon-ebs


    【解决方案1】:

    不清楚您是从实例本身还是外部运行它。如果是后者,您将不需要元数据调用。只需提供实例 ID。

    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
    

    请注意,一个实例可能有多个卷,因此健壮的代码不会假设只有一个设备。

    【讨论】:

    • @VincentTheeten 如果这个解决方案是您想要的,您应该接受它。
    【解决方案2】:

    我相信 attach_data.device 就是您要找的。音量的一部分。

    这是一个例子,不确定这是否是最好的方法,但它会输出 volumeid、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()
    

    【讨论】:

      【解决方案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 对象作为值(您可以从中获取各种信息,例如卷 ID)。

      【讨论】:

        【解决方案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()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-16
          • 2020-12-26
          • 1970-01-01
          相关资源
          最近更新 更多