【问题标题】:How to revert a VM snapshot with Pyvmomi?如何使用 Pyvmomi 恢复 VM 快照?
【发布时间】:2023-03-24 03:40:01
【问题描述】:

我一直在使用 vSphere Pyvmomi 的官方 Python 绑定 (https://github.com/vmware/pyvmomi) 我已经设法获得一个代码示例来启动虚拟机,但我想先将虚拟机恢复到指定的快照,然后再启动。知道怎么做吗?这是目前为止的工作。

def main():

   args = GetArgs()
   if args.password:
      password = args.password
   else:
      password = getpass.getpass(prompt='Enter password for host %s and user %s: ' % (args.host,args.user))

   try:
      vmnames = args.vmname
      if not len(vmnames):
         print("No virtual machine specified for poweron")
         sys.exit()

      si = None
      context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
      context.verify_mode = ssl.CERT_NONE
      try:
         si = SmartConnect(host=args.host,
                           user=args.user,
                           pwd=password,
                           port=int(args.port),
                           sslContext=context)
      except IOError:
         pass
      if not si:
         print("Cannot connect to specified host using specified username and password")
         sys.exit()

      atexit.register(Disconnect, si)

      # Retreive the list of Virtual Machines from the inventory objects
      # under the rootFolder
      content = si.content
      objView = content.viewManager.CreateContainerView(content.rootFolder,
                                                        [vim.VirtualMachine],
                                                        True)
      vmList = objView.view
      objView.Destroy()

      #Code to list all available snapshots but not working
      #snap_info = [vm.snapshot for vm in vmList if vm.name in vmnames]

      #tree = snap_info.rootSnapshotList
      #while tree[0].childSnapshotList is not None:
      #    print("Snap: {0} => {1}".format(tree[0].name, tree[0].description))
      #    if len(tree[0].childSnapshotList) < 1:
      #        break
      #    tree = tree[0].childSnapshotList

      # Find the vm and power it on
      tasks = [vm.PowerOn() for vm in vmList if vm.name in vmnames]

      print("Virtual Machine(s) have been powered on successfully")
   except vmodl.MethodFault as e:
      print("Caught vmodl fault : " + e.msg)
   except Exception as e:
      print("Caught Exception : " + str(e))

# Start program
if __name__ == "__main__":
   main()

【问题讨论】:

    标签: python vsphere pyvmomi


    【解决方案1】:

    你可以尝试创建这样的任务:

        snapshot_name = 'snapshot_name2' # snapshot name
        for vm in vmList:
            if vm.name in vmnames:
                snapshots = vm.snapshot.rootSnapshotList
                for snapshot in snapshots:
                        if snapshot_name == snapshot.name:
                            snap_obj = snapshot.snapshot
                            print ("Reverting snapshot ", snapshot.name)
                            task = [snap_obj.RevertToSnapshot_Task()]
                            WaitForTasks(task, si)
    

    【讨论】:

    • 非常感谢!这正是我一直在寻找的
    【解决方案2】:

    获取所有快照的递归函数,包括虚拟机上的子项。

      def get_all_vm_snapshots(self, snapshots=None):
        found_snapshots = []
    
        if not snapshots:
            snapshots = vm.snapshot.rootSnapshotList
    
        for snapshot in snapshots:
            if snapshot.childSnapshotList:
                found_snapshots += get_all_vm_snapshots(snapshot.childSnapshotList)
            found_snapshots += [snapshot]
        return found_snapshots
    

    【讨论】:

      【解决方案3】:

      如果您想恢复到最多 3 个级别的快照(不仅仅是根级别),您可以这样做

      snapshot_name = 'MySnapshot'  # snapshot name
      for vm in vmList:
         if vm.name in vmnames:
            snapshots = vm.snapshot.rootSnapshotList
            for snapshot in snapshots:
               if snapshot_name == snapshot.name:
                  print("Snapshot NAME L1: " + str(snapshot.name))
                  snap_obj = snapshot.snapshot
                  print("LEVEL1 Reverting snapshot ", snapshot.name)
                  task = [snap_obj.RevertToSnapshot_Task()]
                  WaitForTasks(task, si)
                  break
               for subsnapshot in snapshot.childSnapshotList:
                  print(subsnapshot.name)
                  if snapshot_name == subsnapshot.name:
                     print("Snapshot NAME L2: " + str(subsnapshot.name))
                     snap_obj = subsnapshot.snapshot
                     print("LEVEL2 Reverting snapshot ", subsnapshot.name)
                     task = [snap_obj.RevertToSnapshot_Task()]
                     WaitForTasks(task, si)
                     break
                  for subsnapshot2 in subsnapshot.childSnapshotList:
                     print(subsnapshot2.name)
                     if snapshot_name == subsnapshot2.name:
                        print("Snapshot NAME L3: " + str(subsnapshot2.name))
                        snap_obj = subsnapshot2.snapshot
                        print("LEVEL3 Reverting snapshot ", subsnapshot2.name)
                        task = [snap_obj.RevertToSnapshot_Task()]
                        WaitForTasks(task, si)
                        break
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 2020-05-31
        • 2023-03-27
        • 2019-06-21
        • 2019-09-17
        • 1970-01-01
        • 2022-12-12
        相关资源
        最近更新 更多