LibCloud操作OpenStack

728 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。

前言

OpenStack 是一个伟大的开源云平软件,对于 OpenStack 的管理和编排我们有很多种方式,比如官方的 SDK、原生的 API、官方的 ClientTerraformpulumi 等。今天我们来介绍一款相对冷门的但是挺好用的库,它就是 ApacheLibCloud

环境准备

  1. Python@3 环境
  2. OpenStack 环境信息
  3. 安装 libcloud
pip install apache-libcloud

呆猫

获取规格列表

通过本例,你可以了解到 libcloud 是如何连接 OpenStack 的,获取规格列表应该使用哪个方法。

from libcloud.compute.types import Provider
from libcloud.compute.providers import get_driver
import libcloud.security
# 忽略https证书
libcloud.security.VERIFY_SSL_CERT = False

OpenStack = get_driver(Provider.OPENSTACK)
driver = OpenStack('admin', 'pwd@pwd',
                   ex_tenant_name='admin',
                   ex_force_auth_url='https://xxx.cloud.com:5000',
                   # 注意定义keystone的api版本
                   ex_force_auth_version='3.x_password')

res = driver.list_sizes()

for i in res:
    print(i.name)

规格列表获取成功

获取虚机列表

# driver在前面的代码中已经获取到,后续不再重复
# 虚机列表
vms = driver.list_nodes(ex_all_tenants = False)
for vm in vms:
    print(vm.name)

虚机列表获取成功

延伸:根据以上的代码我们可以根据虚机名称获取到虚机对象,然后从虚机对象获取到虚机的 ID

就像这样:

vms = driver.list_nodes(ex_all_tenants = False)
for vm in vms:
    print(vm.name,vm.id)

虚机ID获取成功

获取镜像列表

# 镜像列表
imgs = driver.list_images()
for img in imgs:
    print(img.name,img.id)

镜像列表查询成功

云盘创建

这是比较重要的功能,libCloud 也可以很好的支持。这里展示 cinder 的功能。

# 创建卷
v = driver.create_volume(size=66, name='from-libc', location=None, snapshot=None, ex_volume_type='SSD')
print(v)

卷创建成功

虚机操作

虚机的 Action 是我们经常会用到的操作,我们这里展示下虚机的关机开机。

# 关机开机虚机
# 根据名称获取虚机
def getVmByName(name):
    vms = driver.list_nodes(ex_all_tenants=True)
    for vm in vms:
        if vm.name == name:
            # print(vm.name, vm.id)
            return vm

# 获取虚机状态
def getNodeStatus(name):
    vm = getVmByName(name)
    print("当前虚机状态:",vm.state)
    return vm.state

# 获取虚机对象
vm = getVmByName('test_vol_image')

# 获取虚机状态
getNodeStatus('test_vol_image')

# 虚机关机
print('====执行关机=====')
res = driver.stop_node(node=vm)
print(res)

# 当虚机关机后执行开机操作
import time
num=1
while True:
    state = getNodeStatus('test_vol_image')
    if state == 'stopped':
        # 执行开机操作
        print('====执行开机,程序结束=====')
        res = driver.start_node(node=vm)
        #print(res)
        break
    else:
        print(f'vm state is {state}===#第{num}次循环#')
        num+=1
        time.sleep(1)

# 获取虚机状态
getNodeStatus('test_vol_image')

关机开机成功

总结

libCloud 虽然支持很多的 Provider,而且用法比较简单,但是其对 OpenStack 的很多功能支持的并不完善,比如项目和用户那块就还没有实现,期待 libCloud 后续能够补充这部分。