2016-04-08 3 views
0

Ich habe mit der offiziellen Python-Bindung für vSphere Pyvmomi herumgespielt (https://github.com/vmware/pyvmomi) Ich habe es geschafft, ein Code-Beispiel zum Einschalten einer VM zu bekommen, aber ich möchte zuerst die VM zu einem bestimmten Snapshot vorher zurückstellen eingeschaltet sein. Irgendeine Idee, wie man das macht? Hier ist was bisher funktioniert.Wie wird ein VM-Snapshot mit Pyvmomi wiederhergestellt?

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

Antwort

1

können Sie versuchen, Aufgabe, so zu erstellen:

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) 
+0

Vielen Dank! Genau das, was ich gesucht habe –

1

Wenn Sie möchten, zu einem Snapshot zurückzukehren bis zu 3 Ebenen nach unten (also nicht nur eine Wurzel) Sie es wie diese

tun können
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 
+0

Hier finden Sie das Skript https://github.com/andriyze/python-vmware-manager – andriyze

1

Rekursive Funktion, um alle Snapshots einschließlich Kinder auf einem VM zu erhalten.

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 
Verwandte Themen