1、进入python虚拟环境:

本实验所用Zed虚拟机是一个容器化的云平台Zed版,云平台是在Rocky 9上使用kolla-ansible部署,共运行30多个容器,请使用Xshell连接虚拟机,执行以下命令进入python虚拟环境,获得admin权限,以执行openstack相关命令:

# source /path/to/venv/bin/activate

# source /etc/kolla/admin-openrc.sh

2、安装Openstack SDK

在PyCharm中打开一个终端进行安装

python -m pip install --upgrade pip

pip install openstacksdk

python -m openstack version       #显示openstacksdk版本

:如果是其它版本的openstack可能要安装的openstacksdk版本不同,如M版建议安装openstacksdk 0.101.0较为合适(pip install openstacksdk==0.101.0)。

3、添加配置文件,保存在.py所在目录

我这里部署的openstack Zed版的clouds.yaml内容如下:

clouds:
  openstack:
    auth:
      auth_url: http://192.168.100.10:5000/v3
      username: "admin"
      password: "123456"
      project_id: 193fd852263c461da83d697790de9e71
      project_name: "admin"
      user_domain_name: "default"
    region_name: "RegionOne"
    interface: "public"
    identity_api_version: 3

:若为其它版本的openstack,需要根据实际情况修改如下内容,如:admin的密码、project_id、user_domain_name等,当然你也可以使用非admin用户的认证进行操作。

4、将镜像cirros-0.5.1-x86_64-disk.img复制到项目目录,即.py所在目录

5PyCharm编写脚本,对云平台进行运维

以下代码实现的功能如下:创建项目、创建用户、为用户授权、创建云主机类型、创建网络(外网flat,内网vxlan)、创建子网、路由、路由接口、创建镜像、创建云主机并为云主机绑定浮动IP(云主机可与外网连通,Xshell连接云主机用户名:cirros,密码:gocubsgo);相应各资源创建完成后会显示相应资源列表。

import openstack
import time
conn = openstack.connect(cloud='openstack')
def mycreate_project(projectname):
    if conn.get_project(name_or_id=projectname):
        print(f'项目{projectname}已存在')
    else:
        domain = conn.get_domain(name_or_id='default')
        result = conn.create_project(projectname, domain_id=domain.id)
        if result:
            print(f'项目{projectname}创建成功')
            print(f"以下是项目列表".center(50, '*'))
            pros = conn.list_projects()
            for pro in pros:
                print(pro.name)
def mycreate_user(username,projectname):
    if conn.get_user(name_or_id=username):
        print(f'用户{username}已存在')
    else:
        domain = conn.get_domain(name_or_id='default')
        result = conn.create_user(username, domain_id=domain.id, password='0', default_project=projectname)
        if result:
            print(f'用户{username}创建成功')
            conn.grant_role('member', user=username, project=projectname)
            print(f"以下是用户列表".center(50, '*'))
            users = conn.list_users()
            for user  in users:
                print(user.name)
def mycreate_flavor(flavorname,mycpus,myram,mydisk,myflavorid):
    if conn.get_flavor(name_or_id=flavorname):
        print(f"云主机类型{flavorname}已存在")
    else:
        result = conn.create_flavor(name=flavorname, vcpus=mycpus, ram=myram, disk=mydisk, flavorid=myflavorid)
        if result:
            print(f'云主机类型{flavorname}创建成功')
            print(f"以下是云主机类型列表".center(50, '*'))
            flavors = conn.compute.flavors()
            for f in flavors:
                print(f.name)
def mycreate_network(ex_networkname,in_networkname,routername):
    def create_ext_network(ex_networkname):
        network = conn.network.find_network(ex_networkname)
        if network is None:
            network = conn.create_network(name=ex_networkname,shared=True,external=True, provider={'network_type': 'flat', 'physical_network': 'physnet1'})
            subnet = conn.create_subnet(subnet_name=ex_networkname+'subnet', network_name_or_id=ex_networkname, cidr='192.168.200.0/24', gateway_ip='192.168.200.2', enable_dhcp=True)
            if network and subnet:
                print(f'外部网络{ex_networkname}创建成功')
        else:
            print(f'外部网络{ex_networkname}已存在!')
    def create_int_network(in_networkname):
        network = conn.network.find_network(in_networkname)
        if network is None:
            # 网络类型network_type默认vxlan
            network = conn.create_network(name=in_networkname,shared=False)
            subnet = conn.create_subnet(subnet_name=in_networkname+'subnet', network_name_or_id=in_networkname, cidr='10.0.0.0/24', gateway_ip='10.0.0.1', enable_dhcp=True, dns_nameservers=["8.8.8.8", "8.8.4.4"])
            if network and subnet:
                print(f'内部网络{in_networkname}创建成功')
        else:
            print(f'内部网络{in_networkname}已存在!')
    def create_router(routername):
        router_find = conn.network.find_router(routername)
        if router_find is None:
            network_ext = conn.network.find_network(ex_networkname)
            router_create = conn.create_router(name=routername, ext_gateway_net_id=network_ext.id)
            if router_create:
                 print(f'路由{routername}创建成功')
            def add_router_interface():
                router = conn.get_router(name_or_id=routername)
                network_int = conn.network.find_subnet(in_networkname+'subnet')
                port = conn.add_router_interface(router, subnet_id=network_int.id)
                if port:
                    print(f'路由内网接口创建成功')
            add_router_interface()
        else:
            print(f'路由{routername}已存在!')
    create_ext_network(ex_networkname)
    create_int_network(in_networkname)
    create_router(routername)
    print(f"以下是网络列表".center(50,'*'))
    networks = conn.list_networks()
    for net in networks:
        print(net.name)
    print(f"以下是子网列表".center(50, '*'))
    subnets = conn.list_subnets()
    for sub in subnets:
        print(sub.name)
    print(f"以下是路由列表".center(50, '*'))
    routers = conn.list_routers()
    for r in routers:
        print(r.name)
    print(f"以下是路由接口列表".center(50, '*'))
    router = conn.get_router(name_or_id=routername)
    router_interfaces = conn.list_router_interfaces(router)
    for r_faces in router_interfaces:
        print(r_faces.id)
def mycreate_image(imagename):
    if conn.get_image(name_or_id=imagename):
        print(f"镜像{imagename}已存在")
    else:
        result = conn.create_image(name=imagename, filename="cirros-0.5.1-x86_64-disk.img", disk_format='qcow2', container_format='bare')
        if result:
            print(f"镜像{imagename}创建成功,镜像id为:" + result['id'])
            print(f"以下是镜像列表".center(50, '*'))
            images = conn.compute.images()
            for i in images:
                print(i.name)
def mycreate_vm(vmname,imagename,flavorname,in_network):
    if conn.get_server(name_or_id=vmname):
        print(f'云主机{vmname}已存在')
    else:
        result = conn.create_server(name=vmname, image=imagename, flavor=flavorname, network=in_network)
        if result:
            print(f'云主机{vmname}创建成功!')
            # 创建云主机需要时间,请等待
            time.sleep(15)
            vmdata = conn.get_server(name_or_id=vmname)
            # conn.add_ips_to_server(vmdata) //传入vm的全部数据,不只是name
            conn.add_auto_ip(vmdata)
            print(f"云主机{vmname}浮动IP绑定成功!")
            print(f"以下是云主机列表".center(50, '*'))
            servers = conn.compute.servers()
            for s in servers:
                print(s.name)

if __name__ == '__main__':
    mycreate_project('yun1')
    mycreate_user('test1','yun1')
    mycreate_flavor('myflavor1',1,512,1,'auto')
    mycreate_image('image1')
    mycreate_network('exnet','innet','router1')
    mycreate_vm('vm1','image1','myflavor1','innet')

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐