华为公有云运维开发——云主机管理(命令行工具)
调用SDK云主机管理的方法,实现云主机的的增删查改。
使用已建好的运维开发环境,在/root/huawei目录下创建ecs_manager.py脚本,完成ECS云主机管理,ecs_manager.py程序支持命令行参数执行。
提示说明:华为云主机支持安装所需Python库。提交前答案前,需安装所开发程序所依赖的Python库。
(1)程序支持根据命令行参数,创建1个云主机。
位置参数“create”,表示创建;
参数“-i 或--input”,格式为json格式文本的云主机的名称、镜像名称2个信息。其他参数同上述开发环境云主机一致。
创建待成功,再返回查询该云主机的信息,结果以json格式输出到控制台。
参考执行实例如下:
python3 /root/huawei/ecs_manager.py create --input '{ "name": " chinaskill001", " imagename": "imageid"} '
(2)支持查询给定具体名称的ECS云主机查询。
位置参数“get”,表示查询ECS;
参数“-n 或 --name”支持指定名称ECS查询,类型为string。
参数“-o 或 --output”支持查询该ECS信息输出到文件,格式为json格式。
(3)程序支持查询目前区域账号下所有的ECS云主机。
位置参数“getall”,表示查询所有ECS云主机;
参数“-o 或--output”支持输出到文件,格式为yaml格式。
(4)支持删除指定名称的云主机。
位置参数“delete”,表示删除一个ECS云主机;返回response,通过控制台输出。
参数“-n或--name”支持指定名称查询,类型为string。
完成后提交“chinaskill开发运行环境云主机”的用户名、密码和 IP 地址到答题框。
import json
import time
import yaml
import argparse
from huaweicloudsdkims.v2 import *
from huaweicloudsdkevs.v2 import *
from huaweicloudsdkecs.v2 import *
from huaweicloudsdkcore.exceptions import exceptions
from huaweicloudsdkims.v2.region.ims_region import ImsRegion
from huaweicloudsdkevs.v2.region.evs_region import EvsRegion
from huaweicloudsdkecs.v2.region.ecs_region import EcsRegion
from huaweicloudsdkcore.auth.credentials import BasicCredentials
ak = "UCJEM0YMIIEGCS3SGW4R"
sk = "ueyWtMjX5o9KBbQkFKPWx14Jkiqbq4VQ2EQjacfn"
region = "cn-north-4"
dev_server_id = 'cb13603f-f736-4d00-bb06-0c56f13ca288'
def ShowServer(server_id: str):
credentials = BasicCredentials(ak, sk)
client = EcsClient.new_builder().with_credentials(credentials).with_region(EcsRegion.value_of(region)).build()
try:
request = ShowServerRequest()
request.server_id = server_id
response = client.show_server(request)
print(response)
return response
except exceptions.ClientRequestException as e:
print(e.status_code)
print(e.request_id)
print(e.error_code)
print(e.error_msg)
return e.status_code, e.request_id, e.error_code, e.error_msg
def ListImages():
credentials = BasicCredentials(ak, sk)
client = ImsClient.new_builder().with_credentials(credentials).with_region(ImsRegion.value_of(region)).build()
try:
request = ListImagesRequest()
response = client.list_images(request)
print(response)
return response
except exceptions.ClientRequestException as e:
print(e.status_code)
print(e.request_id)
print(e.error_code)
print(e.error_msg)
return e.status_code, e.request_id, e.error_code, e.error_msg
def CreatePostPaidServers(name: str, flavor_ref: str, image_ref: str, volumetype: str, vpcid: str, subnet_id: str):
credentials = BasicCredentials(ak, sk)
client = EcsClient.new_builder().with_credentials(credentials).with_region(EcsRegion.value_of(region)).build()
try:
request = CreatePostPaidServersRequest()
# SATA: 普通IO磁盘类型。
# SAS: 高IO磁盘类型。
# SSD: 超高IO磁盘类型。
# GPSSD: 为通用型SSD磁盘类型。
# co - p1: 高IO(性能优化I型)。
# uh - l1: 超高IO(时延优化)。
# ESSD: 为极速IO磁盘类型。
# GPSSD2: 通用型SSD
# V2磁盘类型。
# ESSD2: 极速型SSD
# V2磁盘类型。
rootVolumeServer = PostPaidServerRootVolume(
volumetype=volumetype
)
listNicsServer = [
PostPaidServerNic(
subnet_id=subnet_id
)
]
serverbody = PostPaidServer(
flavor_ref=flavor_ref,
image_ref=image_ref,
name=name,
nics=listNicsServer,
root_volume=rootVolumeServer,
vpcid=vpcid
)
request.body = CreatePostPaidServersRequestBody(
server=serverbody
)
response = client.create_post_paid_servers(request)
print(response)
return response
except exceptions.ClientRequestException as e:
print(e.status_code)
print(e.request_id)
print(e.error_code)
print(e.error_msg)
return e.status_code, e.request_id, e.error_code, e.error_msg
def ListServersDetails():
credentials = BasicCredentials(ak, sk)
client = EcsClient.new_builder().with_credentials(credentials).with_region(EcsRegion.value_of(region)).build()
try:
request = ListServersDetailsRequest()
response = client.list_servers_details(request)
print(response)
return response
except exceptions.ClientRequestException as e:
print(e.status_code)
print(e.request_id)
print(e.error_code)
print(e.error_msg)
return e.status_code, e.request_id, e.error_code, e.error_msg
def DeleteServers(server_id: str):
credentials = BasicCredentials(ak, sk)
client = EcsClient.new_builder().with_credentials(credentials).with_region(EcsRegion.value_of(region)).build()
try:
request = DeleteServersRequest()
listServersbody = [
ServerId(
id=server_id
)
]
request.body = DeleteServersRequestBody(
servers=listServersbody,
delete_volume=True,
delete_publicip=True
)
response = client.delete_servers(request)
print(response)
return response
except exceptions.ClientRequestException as e:
print(e.status_code)
print(e.request_id)
print(e.error_code)
print(e.error_msg)
return e.status_code, e.request_id, e.error_code, e.error_msg
def ShowVolume(volume_id: str):
credentials = BasicCredentials(ak, sk)
client = EvsClient.new_builder().with_credentials(credentials).with_region(EvsRegion.value_of(region)).build()
try:
request = ShowVolumeRequest()
request.volume_id = volume_id
response = client.show_volume(request)
print(response)
return response
except exceptions.ClientRequestException as e:
print(e.status_code)
print(e.request_id)
print(e.error_code)
print(e.error_msg)
return e.status_code, e.request_id, e.error_code, e.error_msg
def ListServerInterfaces(server_id: str):
credentials = BasicCredentials(ak, sk)
client = EcsClient.new_builder().with_credentials(credentials).with_region(EcsRegion.value_of(region)).build()
try:
request = ListServerInterfacesRequest()
request.server_id = server_id
response = client.list_server_interfaces(request)
print(response)
return response
except exceptions.ClientRequestException as e:
print(e.status_code)
print(e.request_id)
print(e.error_code)
print(e.error_msg)
return e.status_code, e.request_id, e.error_code, e.error_msg
if __name__ == "__main__":
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='command')
sub1 = sub.add_parser('create')
sub1.add_argument('-i', '--input', type=json.loads)
sub2 = sub.add_parser('get')
sub2.add_argument('-n', '--name')
sub2.add_argument('-o', '--output')
sub3 = sub.add_parser('getall')
sub3.add_argument('-o', '--output')
sub4 = sub.add_parser('delete')
sub4.add_argument('-n', '--name')
args = parser.parse_args()
print(args)
if args.command == 'create':
print(args.input)
dev_info = ShowServer(dev_server_id)
print(dev_info)
dev_info = dev_info.to_dict()
name = args.input['name']
flavor_ref = dev_info['server']['flavor']['id']
image_ref = args.input['imagename']
# image_ref = '02a17486-1214-4e42-8da7-7d200cac585e' # Centos 7.9 64bit
volumetype = ShowVolume(dev_info['server']['os_extended_volumesvolumes_attached'][0]['id']).to_dict()['volume']['volume_type']
vpcid = dev_info['server']['metadata']['vpc_id']
subnet_id = ListServerInterfaces(dev_server_id).to_dict()['interface_attachments'][0]['net_id']
new_server_id = CreatePostPaidServers(name=name, flavor_ref=flavor_ref, image_ref=image_ref, volumetype=volumetype, vpcid=vpcid, subnet_id=subnet_id).to_dict()['server_ids'][0]
print(new_server_id)
time.sleep(10)
print(str(ShowServer(new_server_id)))
elif args.command == 'get':
args_name = args.name
args_output = args.output
resp = ListServersDetails().to_dict()
for i in resp['servers']:
if i['name'] == args_name:
with open(args_output, 'w') as f:
f.write(str(ShowServer(i['id'])))
print('break')
break
elif args.command == 'getall':
with open(args.output,'w') as f:
f.write(yaml.dump(ListServersDetails().to_dict()))
elif args.command == 'delete':
args_name = args.name
resp = ListServersDetails().to_dict()
for i in resp['servers']:
if i['name'] == args_name:
print(str(DeleteServers(i['id'])))
print('break')
break