openstack虚拟机迁移到ovirt环境脚本实现

本文档介绍了如何将openstack虚拟机手动迁移到ovirt-engine环境,由于cinder鉴权问题,采用备份导入的方式。详细步骤包括:获取openstack虚拟机信息,使用virsh和xml解析获取详细配置,将虚拟机disk转换为qcow2格式,通过ovirt SDK上传并创建虚拟机,挂载磁盘和添加网卡。

1、需求背景:

旧平台openstack虚拟机需要迁移到ovirt-engine环境,直接用ovirt自带的对接openstack环境一直cinder鉴权报错,调查是版本不支持,只能手动备份导入的ovirt平台。

思路:获取openstack环境虚拟机信息,读取迁移虚拟机表格,导出虚拟机为qcow2,上传到ovirt平台创建虚拟机挂盘。

2、获取openstack计算节点虚拟机信息

通过virsh list获取instance实例列表,再通过dumpxml获取虚拟机信息利用xml模块解析所需要的信息

    def get_vms_list(self):
        # print("virsh list --all --name ...")
        list_cmd = "virsh list --all --name".split(" ")
        stdout, stderr = self.cmd_process(list_cmd)
        instance_names = list(filter(None, stdout.split("\n")))
        return instance_names

    def get_dumpxml_info(self, instance_name):
        # print("virsh dumpxml...")
        info_cmd = "virsh dumpxml %s" % instance_name
        stdout, _ = self.cmd_process(info_cmd.split(" "))
        return stdout

    def get_vms_info(self):
        instance_names = self.get_vms_list()
        vms_info = []
        for instance_name in instance_names:
            xml_str = self.get_dumpxml_info(instance_name)
            DOMTree = xml.dom.minidom.parseString(xml_str)
            collection = DOMTree.documentElement
            vm_info = {}
            data_volume = []
            vm_info["instance_name"] = collection.getElementsByTagName("name")[0].childNodes[0].data
            vm_info["vm_name"] = collection.getElementsByTagName("metadata")[0].getElementsByTagName("nova:instance")[
                0].getElementsByTagName("nova:name")[0].childNodes[0].data
            vm_info["vm_flavor"] = collection.getElementsByTagName("metadata")[0].getElementsByTagName("nova:instance")[
                    0].getElementsByTagName("nova:flavor")[0].getAttribute("name")
            vm_info["instance_uuid"] = collection.getElementsByTagName("uuid")[0].childNodes[0].data
            vm_info["instance_vcpu"] = collection.getElementsByTagName("vcpu")[0].childNodes[0].data
            vm_info["instance_memory"] = collection.getElementsByTagName("memory")[0].childNodes[0].data
            for disk_info in collection.getElementsByTagName("devices")[0].getElementsByTagName("disk"):
                dev = disk_info.getElementsByTagName("target")[0].getAttribute("dev")
                if dev == "vda" or dev == "hda":
                    vm_info["system_volume"] = disk_info.getElementsByTagName("source")[0].getAttribute("name")
                else:
                    data_volume.append(disk_info.getElementsByTagName("source")[0].getAttribute("name"))
            vm_info["data_volume"] = data_volume
            vms_info.append(vm_info)
        return vms_info

计算节点都要执行,最后汇总到执行脚本的节点,并且汇总读取信息(注意系统卷和数据卷的判断根据具体环境修改适配)

    run_first_time = False
    if run_first_time:
        for host in HOST_LIST:
            print("** get the vm info from %s" % host)
            os.system("scp get_vm_info.py root@%s:/home" % host)
            sshclient_execmd(host, "pyth
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值