Python脚本实现KVM虚机添加磁盘

   2023-02-09 学习力0
核心提示:Python脚本实现KVM虚机添加磁盘实现方式:①远程Linux下载到本地  ②本地修改  ③上传到Linux远程并覆盖原文件import osimport paramikofrom TSDRM import settingsfrom lxml import etreefrom xml.dom.minidom import parseip = '192.168.1.61'username =

Python脚本实现KVM虚机添加磁盘

实现方式:①远程Linux下载到本地  ②本地修改  ③上传到Linux远程并覆盖原文件

import os
import paramiko
from TSDRM import settings
from lxml import etree
from xml.dom.minidom import parse

ip = '192.168.1.61'
username = 'root'
password = '******'
system_tag = 'Linux'
kvm_name = 'Test-1'
disk_file = '/home/images/disk-image/10GB.qcow2'

try:
    linux_file_path = '/etc/libvirt/qemu/{0}.xml'.format(kvm_name)
    file_path = os.path.join(
        os.path.join(
            os.path.join(settings.BASE_DIR, "drm"),
            "upload"
        ),
        "kvmxml"
    )
    local_file_path = file_path + os.sep + "{0}.xml".format(kvm_name)
    ssh = paramiko.Transport((ip, 22))
    ssh.connect(username=username, password=password)
    sftp = paramiko.SFTPClient.from_transport(ssh)
except paramiko.ssh_exception.SSHException as e:
    kvmlog = "连接服务器失败:{0}。".format(e)
else:
    # ①开始下载
    sftp.get(linux_file_path, local_file_path)
    except Exception as e:
      kvmlog = "下载linux脚本文件失败:{0}。".format(e)
    else:
        # ②修改本地xml文件:xml文件内容转成dom
        domtree = parse(local_file_path)
        rootnode = domtree.documentElement

        # 找到磁盘父节点
        devices_node = rootnode.getElementsByTagName("devices")[0]

        # 新建disk节点
        """
        <disk type='file' device='disk'>
            <driver name='qemu' type='qcow2'/>
            <source file='/home/images/disk-image/10GB.qcow2'/>
            <target dev='vdb' bus='virtio'/>
            <boot order='2'/>
            <address type='pci'/>
        </disk>
        """
        config = etree.XML(rootnode.toxml())
        kvm_devices = config.xpath("//devices//disk")
        disk_list = []
        for disk in kvm_devices:
            file = disk.xpath('source')
            if file:
                file = disk.xpath('source')[0].attrib['file']
                device = disk.xpath('target')[0].attrib['dev']
                order = disk.xpath('boot')[0].attrib['order']
                disk_list.append({
                    'name': device,
                    'file': file,
                    'order': order
                })
        """
        disk_list:
        [{'order': '1', 'name': 'vda', 'file': '/data/vmdata/Test-4/Test-4.qcow2'},
        {'order': '2', 'name': 'vdb', 'file': '/home/images/disk-image/10GB.qcow2'},
        {'order': '3', 'name': 'vdc', 'file': '/opt/1GB.qcow2'}]

        """
        count = len(disk_list)
        disk_order = count + 1
        disk_dev = ''
        disk_dev_dict = {
            0: 'vda', 1: 'vdb', 2: 'vdc', 3: 'vdd', 4: 'vde', 5: 'vdf', 6: 'vdg',
            7: 'vdh', 8: 'vdi', 9: 'vdj', 10: 'vdk', 11: 'vdl', 12: 'vdm', 13: 'vdn'
        }
        # 动态加载order字段属性和dev字段属性,使之与存在的磁盘数据不同
        for i in disk_list:
            if disk_order == i['order']:
                disk_order += 1
            if disk_dev_dict[count] == i['name']:
                disk_dev = disk_dev_dict[count + 1]
            else:
                disk_dev = disk_dev_dict[count]

        disk_node = domtree.createElement("disk")
        disk_node.setAttribute("type", "file")
        disk_node.setAttribute("device", "disk")

        # 新建driver节点
        driver_node = domtree.createElement("driver")
        driver_node.setAttribute("name", "qemu")
        driver_node.setAttribute("type", "qcow2")

        # 新建source节点
        source_node = domtree.createElement("source")
        source_node.setAttribute("file", disk_file)

        # 新建target节点
        target_node = domtree.createElement("target")
        target_node.setAttribute("dev", disk_dev)
        target_node.setAttribute("bus", "virtio")

        # 新建boot节点
        boot_node = domtree.createElement("boot")
        boot_node.setAttribute("order", str(disk_order))

        # 新建address节点
        address_node = domtree.createElement("address")
        address_node.setAttribute("type", "pci")

        # 磁盘节点添加子节点
        disk_node.appendChild(driver_node)
        disk_node.appendChild(source_node)
        disk_node.appendChild(target_node)
        disk_node.appendChild(boot_node)
        disk_node.appendChild(address_node)

        # 父节点添加子节点:磁盘节点
        devices_node.appendChild(disk_node)

        # 重新覆盖写入本地文件
        try:
            with open(local_file_path, 'w') as f:
                domtree.writexml(f, addindent=' ', encoding='utf-8')
        except Exception as e:
            kvmlog = "修改文件失败:{0}。".format(e)
        else:
            # ③上传到服务器
            try:
                ssh = paramiko.Transport((ip, 22))
                ssh.connect(username=username, password=password)
                sftp = paramiko.SFTPClient.from_transport(ssh)
            except paramiko.ssh_exception.SSHException as e:
                kvmlog = "连接服务器失败:{0}。".format(e)
            else:
                try:
                    # 开始上传
                    sftp.put(local_file_path, linux_file_path)
                except Exception as e:
                    kvmlog = "上传linux脚本文件失败:{0}。".format(e)
                else:
                    log = '上传成功'

 

 

查看:

Python脚本实现KVM虚机添加磁盘

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 云计算中的OpenStack和KVM到底是什么
    云计算中的OpenStack和KVM到底是什么
    OpenStack是一个开放源代码云计算平台 openstack是云管理平台,其本身并不提供虚拟化功能,真正的虚拟化能力是由底层的hypervisor(如KVM、Qemu、Xen等)提供。 以下内容真的的背了一遍又一遍的内容,openstart组件介绍Nova:Nova是OpenStack的主要计算引擎,
    03-08
  • KVM 虚拟机联网方式:NAT 和 Bridge
    KVM 客户机网络连接有两种方式:用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。NAT方式。虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些
    03-08
  • 如何在 CentOS 7 / RHEL 7 终端服务器上安装 KVM
    如何在 CentOS 7 / RHEL 7 终端服务器上安装 KV
    如何在 CnetOS 7 或 RHEL 7(Red Hat 企业版 Linux)服务器上安装和配置 KVM(基于内核的虚拟机)?如何在 CentOS 7 上设置 KVM 并使用云镜像 / cloud-init 来安装客户虚拟机?基于内核的虚拟机(KVM)是 CentOS 或 RHEL 7 的虚拟化软件。KVM 可以将你的服务
    03-08
  • kvm虚拟机扩容系统盘 虚拟机扩容c盘
    kvm虚拟机扩容系统盘 虚拟机扩容c盘
     一,宿主机扩容虚拟机系统盘环境文件系统CentOS 7XFS1.1查看虚拟机(以下操作在宿主机上)[root@office-prd-kvm-01 ~]# virsh list 4 office-com-ldap-01 running1.2查看虚拟机系统盘[root@office-prd-kvm-01 ~]# virsh domblklist office-com-ldap-01 目标 源
    03-08
  • kvm虚拟化介绍 kvm开源虚拟化系统
  • Linux中KVM桥接的配置
    Linux中KVM桥接的配置
    1. 原理1.1 说明在安装一个拥有虚拟化功能的Linux操作系统(此处以CentOS为例),一般我们有两种方法:1.在光盘安装的时候安装好虚拟化包或者PXE服务器上配置好虚拟化包2.手动在没有安装虚拟化组件的系统中安装虚拟化组件1.2 目的 如果我们搭建的环境是必须使
    02-10
  • kvm学习笔记(一,基础概念) kvm 原理
    kvm学习笔记(一,基础概念) kvm 原理
    前言   阿里云的云主机,采用的kvm,今天就花了点时间研究了下。一、安装官方文档参考:http://www.linux-kvm.org/page/HOWTO二、快速建立一个基于vnc的虚拟机安装 桥接网卡命令创建虚拟机 virt-install \#--network bridge:br0如果主机网卡不是桥接模式
    02-10
  • KVM 内存虚拟化
    KVM 内存虚拟化
    内存虚拟化的概念    除了 CPU 虚拟化,另一个关键是内存虚拟化,通过内存虚拟化共享物理系统内存,动态分配给虚拟机。虚拟机的内存虚拟化很象现在的操作系统支持的虚拟内存方式,应用程序看到邻近的内存地址空间,这个地址空间无需和下面的物理机器内存直
    02-10
  • 在Ubuntu1804中通过KVM创建bridge型的网络虚拟机
    在Ubuntu1804中通过KVM创建bridge型的网络虚拟
    桥接网络可以运行在宿主机上的虚拟机使用和宿主机同网段的IP,并且可以从外部直接访问到虚拟机。目前企业中大部分场景都是使用桥接网络第一步:首先在宿主机上创建桥接网卡,如下:Ubuntu1804创建桥接网卡 1 # cat/etc/netplan/01-netcfg.yaml 23 # This file
    02-10
  • 通过python-libvirt管理KVM虚拟机 代码实现
    初步代码 [python] view plain copy span style="font-size:18px;"''''' Work with virtual machines managed by libvirt     :depends: libvirt Python module '''  # Special Thanks to Michael Dehann, many of the conce
    02-10
点击排行