基于OpenStack SDK实现对OpenStack云平台基本运维
以下代码实现的功能如下:创建项目、创建用户、为用户授权、创建云主机类型、创建网络(外网flat,内网vxlan)、创建子网、路由、路由接口、创建镜像、创建云主机并为云主机绑定浮动IP(云主机可与外网连通,Xshell连接云主机用户名:cirros,密码:gocubsgo)。
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所在目录
5、在PyCharm中编写脚本,对云平台进行运维
以下代码实现的功能如下:创建项目、创建用户、为用户授权、创建云主机类型、创建网络(外网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')
更多推荐
所有评论(0)