ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-06-08 02:05:41  阅读:232  来源: 互联网

标签:node 虚机 Python KVM dev file path disk order


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 = '上传成功'

 

 

查看:

 

标签:node,虚机,Python,KVM,dev,file,path,disk,order
来源: https://www.cnblogs.com/zhangguosheng1121/p/14861127.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有