จะเปลี่ยนกลับสแน็ปช็อต VM ด้วย Pyvmomi ได้อย่างไร

ฉันได้เล่นกับ Python อย่างเป็นทางการสำหรับ vSphere Pyvmomi (https://github.com/vmware/pyvmomi) ฉันจัดการเพื่อให้ได้ตัวอย่างโค้ดที่ทำงานเพื่อเปิด vm ได้ แต่ฉันต้องการเปลี่ยน vm กลับเป็นสแน็ปช็อตที่ระบุก่อนที่จะเปิดเครื่อง มีความคิดอย่างไรในการทำเช่นนี้? นี่คือสิ่งที่ทำงานจนถึงตอนนี้

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()

person bearaman    schedule 08.04.2016    source แหล่งที่มา


คำตอบ (3)


คุณสามารถลองสร้างงานแบบนั้นได้:

    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)
person Ilya Lebedev    schedule 14.04.2016
comment
ขอบคุณมาก! นั่นคือสิ่งที่ฉันกำลังมองหา - person Boris Modylevsky; 14.07.2016

หากคุณต้องการเปลี่ยนกลับเป็นสแน็ปช็อตสูงสุด 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
person andriyze    schedule 14.07.2016

ฟังก์ชันแบบเรียกซ้ำเพื่อรับสแน็ปช็อตทั้งหมดรวมถึงลูก ๆ บน vm

  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
person lpiner    schedule 17.11.2016