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. Day16异常1

    package com.exception.demo01;public class demo01 { public static void main(String[] args) { try{new ...

  2. java学习之Servlet

    0x00前言 Servlet就是一个接口我们需要写一个类然后去实现Servlet,就可以被服务器识别到.request是用来接受客户端传过来的参数,respone是用来响应客户端的页面.我们所用的容器 ...

  3. WebKit策略:<foreignObject>可用于绘制svg中的html标签,但与<use>搭配不生效

    在<svg>里面可以利用<foreignObject>绘制html标签,原本是我在iconfont采用Font class方式引入svg的无奈之举. 起初的设计是所有icon先 ...

  4. CC1,3,6回顾

    前言 前面陆续学习了CC1,CC3,CC6,以及TemplatesImpl以及改造,有点乱,正所谓温故而知新嘛,所以这篇就回顾一下,捋一捋,解决一些细节问题. CC1 由于CC1要介绍CC链的几个关键 ...

  5. 嵌入式-C语言基础:理解形参和实参的区别

    #include<stdio.h> //实参:函数原型中声明函数后面带的参数 int test(int x)//函数原型 { //函数体 printf("test里面的x地址=% ...

  6. Java注解与原理分析

    目录 一.注解基础 二.注解原理 三.常用注解 1.JDK注解 2.Lombok注解 四.自定义注解 1.同步控制 2.类型引擎 五.参考源码 使用的太多,被忽略的理所当然: 一.注解基础 注解即标注 ...

  7. Android网络请求(2)

    Android网络请求(2) 在android网络开发中,除get请求外常见的还有post.put.delete这三种,接下来我们将详细讲解这三种请求及参数 GET请求 我们使用过get请求了,对于我 ...

  8. 【Java EE】Day04 MySQL多表、事务、事务隔离级别、DCL

    一.多表查询 1.概述 笛卡尔积:两集合的所有组成情况 多表查询:消除笛卡尔积得到的无用数据 2.分类 内连接查询(满足指定条件无空值,只显示有关联的数据) 隐式内连接:使用where限制消除无用数据 ...

  9. Kubernetes-基于容器云构建devops平台

    1.基于kubernetes devops的整体方案 本文以Kubernetes为基础,为基于java语言研发团队提供一套完整的devops解决方案.在此方案中,开发人员基于eclipse集成开发环境 ...

  10. Day38:Lambda表达式

    Lambda表达式 1.1 概述 Lambda是JDK8开始后的一种新语法形式. 作用:简化函数式匿名内部类的代码写法. 简化格式: /*部类被重写方法的参数)->{ 被重写方法的方法体代码 } ...