Seite 1 von 1

Skript zum Deployen einer VM

Verfasst: 04.03.2013, 14:03
von derhoeppi
Hallo Leute,
wir deployen über ein Skript ein Template mit Customization Profil, damit die VM gleich in der AD aufgenommen wird. Danach werden automatisch weitere Aktionen angestoßen. Leider starten die weiteren Aktionen zu schnell, so dass es Fehler hagelt, weil die weiteren Aktionen auf die VMware Tools aufbauen. Eine Wartezeit zwischen dem Customization und den weiteren Aktionen ist bereits eingebaut. Kennt Ihr eine Möglichkeit wie ich das Fertigstellen des Customization abfragen und als Bedingung einbauen kann?

Gruß
derhoeppi

Verfasst: 06.03.2013, 09:54
von Tschoergez
Hi!
Du könntest überprüfen, ob die VM bereits den neuen Namen inkl. Domäne hat. Oder allgemein den Status der VMware tools. Beides ist über die vCenter API möglich.

oder eine asynchrone logik: Dein skript wartet, bis die VM aktiv (z.b. mit einem runOnce skript nach dem customizen) meldet, dass sie bereit ist.

Viele Grüße,
Jörg

Verfasst: 07.03.2013, 07:39
von derhoeppi
Hallo Jörg,
das Customization wird durchgeführt, so dass der Rechner in der Dömäne aufgenommen ist. Im Skript arbeite ich mit Sleep Zeit, so dass ich für das Customization 5 Minuten Zeit lasse. Im Normalfall ist er in 1-2 Minuten fertig.

Dein Vorschlag mit den VMware Tools finde ich gut. Jedoch fährt nach dem Deployen des Templates die neue VM hoch und die VMware Tools sind gestartet (sind im Template integriert). Ich müsste hier also mit einem Sleep arbeiten. Hast du dafür mal ein Beispiel, wie der Code aussehen könnte. Dein anderer Vorschlag mit der asynchronen Logik hört sich ebenfalls gut an. Hast du soetwas schon einmal umgesetzt. Für mich stellt sich die Frage, wie das RunOnce Script aus meiner neuen VM ein Signal an den Rechner abgeben soll, der das Skript ausführt? Woher weißt das RunOnce Skript von dem Deploy-Script?

Gruß
derhoeppi

Verfasst: 09.03.2013, 00:09
von Tschoergez
Für das Warten auf den richtigen host-domainnamen kopier ich unten mal ganz frech die entsprechende Action aus dem Orchestrator... (ist in JavaScript, lässt sich aber einfach auf andere sprachen übersetzen)
Für die asynchrone variante: das runOnce-skript kann man sysprep in der guest customization mitgeben. Es muss selber eigentlich gar nix vom deploz script wissen, sondern z.B. nur eine neue Datei "ichBinFertig.txt" in einem Netzwerkshare ablegen. Und das deployskript pollt dann nach dieser Datei.
Oder sogar: Wie GuestOperations der vSphere API auf das Dateisystem der VM zugreifen. Dann muss das runonce skript nur lokal eine Datei anlegen, und das ganze ist unabhängig vom Netzwerk.

Sämtliche Varianten hab ich schon mal gesehen...

Viele Grüße,
Jörg


Code: Alles auswählen

while (true) {
   if (vm.guest != null) {
      if (vm.guest.toolsStatus == VcVirtualMachineToolsStatus.toolsOk || vm.guest.toolsStatus == VcVirtualMachineToolsStatus.toolsOld) {
         if (vm.guest.guestState == "running") {
            hostname = vm.guest.hostName;
            if (hostname.indexOf(".") > 0) {
               if (dnsNameToWait.indexOf(".") > 0 && hostname.toLowerCase() == dnsNameToWait.toLowerCase()) {
                  break;
               }
               if (dnsNameToWait.indexOf(".") < 0) {
                  if (hostname.substring(0, hostname.indexOf(".")).toLowerCase() == dnsNameToWait.toLowerCase()) {
                     break;
                  }
               }
            }
            else {
               if (dnsNameToWait.indexOf(".") > 0 ) {
                  if (dnsNameToWait.substring(0, dnsNameToWait.indexOf(".")).toLowerCase() == hostname.toLowerCase()) {
                     break;
                  }
               }
               if (dnsNameToWait.indexOf(".") < 0 && hostname.toLowerCase() == dnsNameToWait.toLowerCase()) {
                  break;
               }
            }
         }
      }
   }
   // wait the poolingRate
   System.sleep(pollingRate * 1000);
   // test timeout
   timeout -= pollingRate;
   if (timeout <= 0) {
      throw "Timeout: Unable to get a DNS name for the VM before reaching the Timeout";
   }
}

System.log("Found name '" + hostname + "' for VM '" + vm.name + "'");