Python运维开发:基于openstack RestfulAPI上传镜像和创建云主机

2023-11-17

基础环境

python 脚本文件头建议加入“ #encoding:utf-8”避免编码错误;测试脚本代码用python3命令执行与测试;在linux系统中安装Python3 并安装request等依赖包

配置:有一台搭建好的open stack平台

           导入python源等依赖包 

在controller节点/root/目录下编写api_image_manager.py脚本

要求:1.创建镜像(创建之前删除同名镜像)

           2.查询镜像

#获取token值
import requests
import json
import time
import argparse
try:
    url = "http://192.168.1.101:5000/v3/auth/tokens"
    body = {
        "auth": {"identity":{"methods":["password"],"password":{
            "user":{"domain":{"name":"demo"},"name":"admin","password":"000000"}}},
                 "scope":{"project":{"domain":{"name":"demo"},"name":"admin"}}}}
    headers= {
        "Content-Type":"application/json"
    }
    token = requests.post(url,data=json.dumps(body),headers=headers).headers['X-Subject-Token']
    headers={"X-Auth-Token":token}
    print(token)

except Exception as e:
    print(f"debeat{str(e)}")
    exit(0)


#定义class类
class create_glance:
    def __init__(self,headers,url):
        self.headers=headers
        self.url=url

    def delete_images(self,image_name):
        result = json.loads(requests.get(self.url,headers=self.headers).text)
        for i in result['images']:
            if i['name'] == image_name:
                
      requests.delete(f"http://192.168.1.101:9292/v2/images/{i['id']}",headers=self.headers)
    def create_glance(self,image_name:str,container_format="bare",disk_format="qcow2"):
        body = {
            "name": image_name,
            "container_format": container_format,
            "disk_foramt": disk_format
        }
        status_code = requests.post(self.url,data=json.dumps(body),headers=self.headers)
        print(status_code.json['names'])
    def get_image_id(self,image_name):
        result = json.loads(requests.get(self.url, headers=self.headers).text)
        for i in result['images']:
            if i['name'] == image_name:
                return i['id']

    def updata_glance(self,image_name:str,file_path=''):
        self.url=self.url+"/"+self.get_image_id(image_name)+'/file'
        self.headers['Content-Type'] = 'application/octet-stream'
        status_code = requests.put(self.url,data=open(file_path,'rb').read(),headers=self.headers)
    def show_image(self,image_name):
        result = json.loads(requests.get(self.url, headers=self.headers).text)
        for i in result['images']:
            if i['name'] == image_name:
                return i['id']
create_glance=create_glance(headers,"http://192.168.1.101:9292/v2/images")
create_glance.delete_images("giant fox")
create_glance.create_glance("giant fox")
print(create_glance.show_image("giant fox"))
create_glance.updata_glance('giant fox',file_path="./CentOS_7.5_x86_64_XD.qcow2")

创建镜像时 可能会出现一直排队的情况 在创建虚拟机时可以使用已经在运行的镜像

 +--------------------------------------+-----------+--------+
| ID                                   | Name      | Status |
+--------------------------------------+-----------+--------+
| 0eede4fd-be01-4508-9f21-7089bc166a26 | centos    | active |
| 36fc6cfc-9ad1-4189-9522-d8addccafa60 | giant fox | queued |
+--------------------------------------+-----------+--------+

 创建一台云主机镜像已经创建好,其他的自行创建

import json
import requests
import time

try:
    url = "http://192.168.1.101:5000/v3/auth/tokens"
    body = {"auth":{"identity":{"methods":["password"],"password":{
            "user":{"domain":{"name":"demo"},"name":"admin","password":"000000"}}},
                "scope":{"project":{"domain":{"name":"demo"},"name":"admin"}}}}
    headers = {"Content-Type":"application/json"}
    Token = requests.post(url,json.dumps(body),headers=headers).headers["X-Subject-Token"]
    headers = {"X-Auth-Token":Token}
    print(Token)
except Exception as e:
    print(f"失败信息如下:{str(e)}")
    exit(0)


class create_vm:
    def __init__(self,headers):
        self.headers=headers

    def delete_vm(self):
        result = requests.get("http://192.168.1.101:8774/v2.1/servers",headers=self.headers)
        for i in result.json()['servers']:
            if i['name'] == 'test_vm':
                requests.delete(f"http://192.168.1.101:8774/v2.1/servers/{i['id']}",headers=self.headers)

    def get_image_id(self):
        result = requests.get("http://192.168.1.101:9292/v2/images",headers=self.headers)
        for i in result.json()['images']:
            if i['name'] == "giant fox":
                self.image_id=i['id']

    def get_network_id(self):
        result = requests.get("http://192.168.1.101:9696/v2.0/networks",headers=self.headers)
        for i in result.json()['networks']:
            if i['name'] == 'network':
                self.network_id=i['id']

    def get_flavor_id(self):
        result = requests.get("http://192.168.1.101:8774/v2.1/flavors",headers=self.headers)
        for i in result.json()['flavors']:
            if i['names'] == '4g4u100g':
                self.flavor_id=i['id']

    def create_vm(self):
        self.delete_vm()
        self.get_flavor_id()
        self.get_image_id()
        self.get_network_id()
        data = {
            "server": {
                "name": "test_vm",
                "imageRef": self.image_id,
                "flavorRef": self.flavor_id,
                "networks": [{'uuid':self.network_id}]
            }
        }
        status_code = requests.post("http://192.168.1.101:8774/v2.1/servers",headers=self.headers,data=json.dumps(data))
        print(status_code.json())


create_vm=create_vm(headers=headers)
create_vm.create_vm()

创建成功

+--------------------------------------+---------+--------+----------------------+--------+----------+
| ID                                   | Name    | Status | Networks             | Image  | Flavor   |
+--------------------------------------+---------+--------+----------------------+--------+----------+
| f2d7a396-9bec-4074-9e35-c39e4d556756 | test_vm | ACTIVE | network=192.168.1.7  | centos | 4g4u100g 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python运维开发:基于openstack RestfulAPI上传镜像和创建云主机 的相关文章

随机推荐

  • markdown 转为 word 含公式

    markdown 转为 word 含公式 pandoc的下载与安装 将m md转为m docx文件 window10为例 pandoc的下载与安装 pandoc下载地址 https pandoc org installing html 选择
  • 小米、华为、海尔竞争中,全屋智能「崛起」2023

    智能家居进入下半场 互联网大厂凭借着自身的流量红利收割了一部分市场份额 家电企业在向家装企业转型的过程中 也有其自带的流量优势和渠道优势 通信厂商借着 链接 优势 三大阵营在智能家居行业都各占鳌头 作者 思杭 编辑 皮爷 出品 产业家 一屋
  • java中的static关键字

    按照是否静态的对类成员变量进行分类可分两种 一种是被static修饰的变量 叫静态变量或类变量 另一种是没有被static修饰的变量 叫实例变量 static关键字的主要两个作用 1 为特定的数据类型或对象分配单一的存储空间 而与创建对象的
  • UE4 UI界面

    在UE4中创建UI界面是创建一个widget 进去之后左上角是选择控件 找到直接拖上去 中间那个框代表的就是我们的屏幕 在button中打字也就是给button命名时需要在上面在拖一个text控件 更好的排版可以改变锚点 这四个就类似与边距
  • 负数的除法和取模运算(Python 2.7和C的比较)

    一 除法 除法的取整分为三类 向上取整 向下取整 向零取整 1 向上取整 向 方向取最接近精确值的整数 在这种取整方式下 5 3 2 5 3 2 5 3 1 5 3 1 2 向下取整 向 方向取最接近精确值的整数 在这种取整方式下 5 3
  • html插入activex,ActiveX in HTML

    My requirement is to instantiate an object using new ActiveX in html I have created a COM component SimpleActiveX using
  • 第六周作业&实验报告四

    一 实验目的 1 掌握类的继承 2 变量的继承和覆盖 方法的继承 重载和覆盖的实现 二 实验的内容 1 根据下面的要求实现圆类Circle 1 圆类Circle的成员变量 radius表示圆的半径 2 圆类Circle的方法成员 Circl
  • 小甲鱼python学习笔记

    http fishc com 高级语言要编译成汇编语言才能被机器 然后再转换成二进制文件才能被机器所理解 idle window alt n 上一条命令 alt p 下一条命令 苹果mac ctrl n 上一条命令 ctrl p 下一条命令
  • 如何在线剪辑视频?手机视频怎样剪辑?

    在这个短视频当道的时代 大家都开始随手录制视频记录生活 一个视频从录制到发布 中间不可缺少的环节就是对视频的剪辑 想要做出高质量的视频 就少不了要在视频剪辑这一方面下功夫 有视频剪辑经验的小伙伴自然会选择使用PR等富有技术含量的软件 但是对
  • 关系型数据库特点分析

    1970年E F Codd发表的那篇阐述新型数据库设计方式的论文 数据管理技术才开始发生了巨大变化 特点分析 形式化的数学模型 使用关系代数来描述数据及数据间的关系 数据结构的逻辑排布方式同它们的物理存储方式相分离 消除数据异常 保证数据一
  • 互联网时代的营销方法

    随着新型互联网时代的到来 金融社会也跟随着发生剧变 出现了许多新兴的营销方式 他们或多或少都与互联网有着不可分离的关系 在这里 我简单向大家介绍几种我较为认可的营销方式 一 饥饿营销 饥饿营销是指商品提供者有意调低产量 以期达到调控供求关系
  • Java知识点二

    20世纪90年代 硬件领域出现了单片式计算机系统 这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意 因为使用它可以大幅度提升消费类电子产品 如电视机顶盒 面包烤箱 移动电话等 的智能化程度 Sun公司为了抢占市场先机 在1991年
  • 【概率论】大数定律

    概要 首先介绍了切比雪夫不等式 然后介绍大数定律概念和3种大数定律及证明 切比雪夫不等式 已知随机变量X的期望EX和方差DX 对 可得的一个上界 解释 不论X服从什么分布 X在E x 的 邻域内取值的概率不小于1 Dx 2 证明 本质 随机
  • echarts 配置问题

    饼图标签重叠 超出 series type pie name 数据来源 radius 40 60 avoidLabelOverlap true 是否启用防止标签重叠策略 minAngle 20 最小的扇区角度 0 360 用于防止某个值过小
  • leetcode算法刷题:长度最小的子数组

    目录 题目如下 输入输出 思路 题目链接 209 长度最小的子数组 力扣 LeetCode 题目如下 输入输出 思路 使用快慢指针 设置指针end 和start指针 一开始end和start从0开始 以及区间最小长度minLen变量设为In
  • java怎么把字符串转换成日期类型

    1 java怎么把字符串转换成日期类型 2 Java如何将指定字符串转化为指定日期格式 3 求JAVA高手解答 有关于字符串类型转换成日期型 4 Java中怎么把字符串转换成日期格式啊 5 java中怎样将字符串转换成日期形式存入数据库 j
  • 3分钟即可了解 FHub中转站文件摆渡新技能

    说到文件摆渡的方式 有很多种 比较传统一点的 像U盘拷贝 FTP等 自动化一点的 像网闸 网盘等 还有一些企业会通过一些技术手段进行摆渡 比如防火墙技术等 这些方式都能在一定程度上解决跨隔离网文件摆渡的问题 为什么这么说呢 且听下文分析 1
  • java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)...

    内存分配的策略 按照编译原理的观点 程序运行时的内存分配有三种策略 分别是静态的 栈式的 和堆式的 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求 因而在编 译时就可以给他们分配固定的内存空间 这种分配策略要求程序代码
  • 联想万全服务器告警信息在哪里看,华为网络设备查看告警信息

    检查设备是否出现故障以及近期是否有重要的告警信息 前提条件 已经完成登录设备 操作步骤 执行命令display alarm all 查看所有活动的硬件告警信息 以判断设备是否发生故障 display alarm all Info NO al
  • Python运维开发:基于openstack RestfulAPI上传镜像和创建云主机

    基础环境 python 脚本文件头建议加入 encoding utf 8 避免编码错误 测试脚本代码用python3命令执行与测试 在linux系统中安装Python3 并安装request等依赖包 配置 有一台搭建好的open stack