python开发云主机类型管理脚本

开发flavor_manager.py程序,来完成云主机类型管理的相关操作。

该文件拥有以下功能:

  • 根据命令行参数,创建一个云主机类型,返回response。
  • 查询admin账户下所有的云主机类型
  • 查询给定具体名称的云主机类型
  • 支持删除指定的id云主机类型

操作并不复杂,程序也相对较简单,大致分为两大部分

一,解析传入的参数,将参数转化为程序使用的变量

二,通过openstacksdk,使用获得的变量完成相应行为。

基础

首先构建我们的程序主题,肯定是需要argparse模块,那么我们先把argparse模块添加进我们的程序。

import argparse

parse = argparse.ArgumentParser()
args = parse.parse_args()

这做不了什么,也不能满足题目的要求,所以我做出改变,既然我们需要让程序拥有四种功能,那肯定要写出四个相应的实现方法,而参数解析是必须的,那么我们需要这样一个操作,当我们首先解析出需要的操作时,就进行反馈,将继续的参数解析到相应的功能里,这样就把四种功能分开,整个程序会变得很整洁。

创建解析对象

再回来看看题目,四种功能使用位置参数来分别区分,既然如此,我们第一个参数就设置为 option ,用来识别程序需要完成的功能,之后将带入相应的解析中,并调取需要的程序来完成相应的行为。

整体思路就是这样,可能你还没跟上。那么让我来演示第一步的解析:

import argparse

parse = argparse.ArgumentParser()
parse.add_argument('option') if __name__ == '__main__':
args = parse.parse_args()
print(args.option)

可以预见,这一步后,程序中被添加进了一个必须的参数,也就是我们需要的位置参数,如果你输入 create,那么程序中的args.option就设置为create,诸如此类,getall ,get,delete。也就很好区分了,接下来我们需要一个判断,在不同的判断中,我们读入不同的参数。

解析位置参数

还是一步一步来吧,我们先以create为例:

import argparse

parse = argparse.ArgumentParser()
parse.add_argument('option')
parse.add_argument('-n', '--name', type=str, metavar='name', help='New flavor name')
parse.add_argument('-m', '--ram', type=int, metavar='size-mb', default=256, help='Memory size in MB (DEFAULT 256M)')
parse.add_argument('-v', '--vcpus', type=int, metavar='vcpus', default=1, help='Number of vcpus (default 1)')
parse.add_argument('-d', '--disk', type=int, metavar='size-gb', default=0, help='Disk size in GB (default 0G)')
parse.add_argument('-id', '--id', type=str, metavar='id', default='auto', help='Unique flavor ID') if __name__ == '__main__':
args = parse.parse_args()
if args.option == 'create':
print("i will create new flavor")

可以看到,我已经把create这个行为剥离开来,接下来想必你已经知道我要做什么了。让我们把四种功能补全看看。

解析可选参数

import argparse

parse = argparse.ArgumentParser()
parse.add_argument('option')
parse.add_argument('-n', '--name', type=str, metavar='name', help='New flavor name')
parse.add_argument('-m', '--ram', type=int, metavar='size-mb', default=256, help='Memory size in MB (DEFAULT 256M)')
parse.add_argument('-v', '--vcpus', type=int, metavar='vcpus', default=1, help='Number of vcpus (default 1)')
parse.add_argument('-d', '--disk', type=int, metavar='size-gb', default=0, help='Disk size in GB (default 0G)')
parse.add_argument('-id', '--id', type=str, metavar='id', default='auto', help='Unique flavor ID') if __name__ == '__main__':
args = parse.parse_args()
if args.option == 'create':
print("i will create new flavor")
if args.option == 'getall':
print("i will inquire all flavor")
if args.option == 'get':
print("i will get flavor by id")
if args.option == 'delete':
print("i will delete flavor by id")

很显然,我还没有把具体实现填入,仅仅只是更改了输出用以区分,检查一下我们是否解析了所有的参数。

填入程序主体

因为接下来我要将实现填入了,这是程序中较为重要的一步。

  • -n指定flavor名称,数据类型为字符串
  • -m指定内存大小,数据类型为int,单位M
  • -v指定虚拟cpu个数,数据类型为int
  • -d指定磁盘大小,内存大小类型为int,单位G
  • -id指定id,类型为字符串

在程序中我们已经做到了这些参数的解析,那么我们先填入create的实现,程序变成了下面这样。

import argparse
import opentack parse = argparse.ArgumentParser()
parse.add_argument('option')
parse.add_argument('-n', '--name', type=str, metavar='name', help='New flavor name')
parse.add_argument('-m', '--ram', type=int, metavar='size-mb', default=256, help='Memory size in MB (DEFAULT 256M)')
parse.add_argument('-v', '--vcpus', type=int, metavar='vcpus', default=1, help='Number of vcpus (default 1)')
parse.add_argument('-d', '--disk', type=int, metavar='size-gb', default=0, help='Disk size in GB (default 0G)')
parse.add_argument('-id', '--id', type=str, metavar='id', default='auto', help='Unique flavor ID') conn = opentack.connect(
auth_url='http://192.168.10.25:5000',
username='admin',
password='passwordadmin',
project_name='admin',
project_domain_name='Default',
) def create_flavor(name, ram, vcpus, disk, flavorid):
response = conn.create_flavor(name, ram, vcpus, disk, flavorid=flavorid)
return response if __name__ == '__main__':
args = parse.parse_args()
if args.option == 'create':
print(create_flavor(name=args.name, ram=args.ram, vcpus=args.vcpus, disk=args.disk, flavorid=args.id))
if args.option == 'getall':
print("i will inquire all flavor")
if args.option == 'get':
print("i will get flavor by id")
if args.option == 'delete':
print("i will delete flavor by id")

我希望你还能看懂,在这一步,我导入了openstack这个包,我创建了一个连接对象conn,这样我就能操作openstack,我写入了一个方法create_flavor并指定了它可以传入的参数,当option读入create时,将会调用这个方法,并传入相应的参数。由方法中的连接对象调取create_flaovr方法来完成最后的创建,完成后,这个方法将response返回并打印到终端。

我将运行的结果贴在下方:

(venv) PS D:\Python> python .\demo3.py create -n flavor_small -m 1024 -v 1 -d 10 -id 100000
openstack.compute.v2.flavor.Flavor(disk=10, OS-FLV-EXT-DATA:ephemeral=0, id=100000, os-flavor-access:is_public=True, name=flavor_small, ram=1024, rxtx_factor=1.0, swap=, vcpus=1, description=None, OS-FLV-DISABLED:disabled=False, extra_specs={}, location=Munch({'cloud': 'zed', 'region_name': '', 'zone': None, 'project': Munch({'id': '80074c3b4d09419e87ba0b8c05ce5164', 'name': 'admin', 'domain_id': None, 'domain_name': 'Default'})}))

很明显,这是一个正确的输出,如此,我就不废话了,将所有功能快速的填入,只需要根据功能创建剩余的三个方法即可。

import argparse
import openstack parse = argparse.ArgumentParser()
parse.add_argument('option')
parse.add_argument('-n', '--name', type=str, metavar='name', help='New flavor name')
parse.add_argument('-m', '--ram', type=int, metavar='size-mb', default=256, help='Memory size in MB (DEFAULT 256M)')
parse.add_argument('-v', '--vcpus', type=int, metavar='vcpus', default=1, help='Number of vcpus (default 1)')
parse.add_argument('-d', '--disk', type=int, metavar='size-gb', default=0, help='Disk size in GB (default 0G)')
parse.add_argument('-id', '--id', type=str, metavar='id', default='auto', help='Unique flavor ID') conn = openstack.connect(
auth_url='http://192.168.10.25:5000',
username='admin',
password='passwordadmin',
project_name='admin',
project_domain_name='Default',
) def create_flavor(name, ram, vcpus, disk, flavorid):
response = conn.create_flavor(name, ram, vcpus, disk, flavorid=flavorid)
return response def getall_flavor():
response = conn.list_flavors()
return response def get_flavor(id):
response = conn.get_flavor_by_id(id)
return response def delete_flavor(id):
response = conn.delete_flavor(id)
return response
if __name__ == '__main__':
args = parse.parse_args()
if args.option == 'create':
print(create_flavor(args.name, args.ram, args.vcpus, args.disk, args.id))
if args.option == 'getall':
print(getall_flavor())
if args.option == 'get':
print(get_flavor(args.id))
if args.option == 'delete':
print(delete_flavor(args.id))

总结

到这里整个命令行脚本就大体完成了,如果需要别的改动,只需要按照这个思路修改就可以了。更多的argparse模块的使用可以参照官方文档的解析,非常详细,而且配有非常多的案例,当然,这太麻烦了,我找到了一个写的很不错的文档推荐给大家,我自己写的就太糟糕了。

【python 学习杂记】argparse模块使用教程_Onedean的博客-CSDN博客_argparse 教程

python开发云主机类型管理脚本的更多相关文章

  1. 【Python之旅】第六篇(七):开发简易主机批量管理工具

    [Python之旅]第六篇(七):开发简易主机批量管理工具 python 软件开发 Paramiko模块 批量主机管理 摘要: 通过前面对Paramiko模块的学习与使用,以及Python中多线程与多 ...

  2. 如何在OpenStack中对云主机类型进行重新配置

    目标:很多用户在OpenStack启动一个虚拟机,选择了一个云主机配置类型,例如2CPU 4GB内存,使用了一段时间,感觉这个配置并不能满足需求,所以希望能够提高配置,那么OpeNStack的管理界面 ...

  3. python之简单主机批量管理工具

    今天做了一个很简单的小项目,感受到paramiko模块的强大. 一.需求 二.简单需求分析及流程图 需求很少,我就简单地说下: 1. 主机分组可以配置文件实现(我用字典存数据的). 2. 登陆功能不做 ...

  4. Python开发:变量类型

    1.变量赋值 #!/usr/bin/python # -*- coding: UTF-8 -*- counter = 100 # 赋值整型变量 miles = 1000.0 # 浮点型 name = ...

  5. Python 开发基础-字符串类型讲解(字符串方法)-2

    s = 'Hello World!'print(s.index('W',0,9))#返回某个字母的索引值,本例返回6.没有该字母会报错,和FIND比较像,find不会报错,没找到会返回-1print( ...

  6. Python 开发基础-字符串类型讲解(字符串方法)-1

    s = 'Hello World!' print(s.capitalize()) #第一个字母大写,其余小写# 输出:Hello world!print(s.swapcase())#大写变小写,小写变 ...

  7. 【openstack N版】——创建云主机

    一.启动实例 1.1 已准备服务介绍 MySql:为各个服务提供数据存储. RabbitMQ:为各个服务之间通信提供交通枢纽. keystone:为各个服务之间通信提供认证和服务注册. Glance: ...

  8. 一个项目经理对主流项目管理工具的对比:禅道VS华为软件开发云

    禅道与软件开发云对比分析报告 1. 产品介绍 禅道是易软天创出品的一款项目管理软件,集产品管理.项目管理.测试管理.文档管理.组织管理于一体,覆盖了项目管理和测试管理的核心流程. 华为软件开发云 (D ...

  9. openstack学习-创建一台云主机(七)

    一.创建基础环境 1.检查网络是否正常 [root@linux-node1 ~]# openstack network agent list +---------------------------- ...

  10. git连接华为开发云devcloud

    华为开发运在代码托管方面的个github很类似,引入了代码仓库的概念,同时需要本地安装git客户端,且只能与git进行连接,从这个角度上讲,华为开发云的代码管理部分就是github的功能,下面对git ...

随机推荐

  1. JS 学习笔记 (六) 函数式编程

    1.函数闭包 1.1 概述 JavaScript采用词法作用域,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 为了实现这种词法作用域,JavaScript函数对 ...

  2. 网页嵌入zabbix页面(不同域名)

    先来结论: 方案一:绕过身份验证:https://www.cnblogs.com/JaSonS-toy/p/4939805.html(我不是这样实现,可以自行尝试) 方案二: 1.保证请求的ip与请求 ...

  3. C#使用正则表达式来验证是否是16进制字符串

    /// <summary> /// 判断是否为16进制字符串 /// </summary> /// <param name="hexString"&g ...

  4. Go语言书籍推荐

    附录: 其他书籍的介绍:https://github.com/golang/go/wiki/Books Go程序设计语言 (圣经) 作者 艾伦 A.A.多诺万 Kernighan 下载地址 中文版PD ...

  5. windows10 ftp文件夹错误

    遇到问题: 解决办法: 1. cmd直接访问 ftp ip 2. 启用tftp client 从文件夹访问 注直接访问会弹出如之前报错一样的失败:ftp://ip ftp://用户:密码@ip 使用如 ...

  6. React综合使用联系

    index.js import React from 'react' import ReactDOM from 'react-dom' import CartSimple from './CartSi ...

  7. CyclicBarrier循环屏障源码解析(基于jdk11)

    目录 CyclicBarrier循环屏障源码解析(基于jdk11) 1.1 CyclicBarrier概述 1.2 CyclicBarrier原理 1.2.1 基本结构(jdk11) 1.2.2 aw ...

  8. ATM购物车项目总结

    目录 项目实现思路 ATM项目 优先实现功能 拆分函数 项目路径展示 项目启动文件 start.py 配置文件 setting.py 日志配置字典 日志函数 展示层 src.py 用户注册 获取用户输 ...

  9. Python 大数据量文本文件高效解析方案代码实现

    大数据量文本文件高效解析方案代码实现 测试环境 Python 3.6.2 Win 10 内存 8G,CPU I5 1.6 GHz 背景描述 这个作品来源于一个日志解析工具的开发,这个开发过程中遇到的一 ...

  10. python之元组(tuple)知识点

    元组与列表都是容器,两个的区别在于: 1.元组使用的是小括号,列表使用的是方括号 2.元组一旦定义不可修改,而列表是可以随意变更 创建元组 元组的创建与列表大同小异,逗号在元组中充当了元组的灵魂,创建 ...