blog.bartlweb - a technologist's external brain

vmrun zur Automatisierung von VMWare Workstation nutzen

Für kleinere Server oder den Heimgebrauch ist nach wie vor VMWare Workstation für die Virtualisierung das Mittel der Wahl. Wer des Öfteren virtuelle Maschinen starten und beenden muss, um z.B. Backups zu machen, wird sich schnell nach einer Möglichkeit der Automatisierung dieser Vorgänge sehnen.

VMWare Workstation stellt dazu das Kommandozeilen-Tool vmrun zu Verfügung. Über dieses lassen sich sowohl lokal laufende VMs als auch auf entfernten Rechnern laufende VMs (Sharing) steuern.

vmrun

Das Tool liegt bei einer Windows-Installation unter C:\Program Files (x86)\VMware\VMware VIX\vmrun.exe bzw. auch unter C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe.

Aufbau der Befehle

Befehl für die Steuerung von lokalen VMs:

vmrun -T ws <command>

Befehl für die Steuerung von lokalen und entfernten Shared-VMs:

vmrun -T ws-shared -h <hostname> -u <username> -p <password> <command> vmrun -T ws-shared -h https://localhost:8333/sdk -u vmadmin -p password list

Status ermitteln

Eine Liste aller laufenden virtuellen Maschinen abfragen:

vmrun -T ws list vmrun -T ws-shared -h https://localhost:8333/sdk -u vmadmin -p password list

VM starten/stoppen

Um gezielt eine virtuelle Maschine zu starten oder zu stoppen muss diese durch die Angabe der zugehörigen vmx-Datei spezifiziert werden. Für lokale Maschinen passiert dies durch Angabe des vollständigen Dateipfads, bei Shared-VMs wird ein Pfad innerhalb des Standard-Datastores angegeben. Die Pfade bzw. Datastore-Pfade lassen sich am einfachsten mittels des vmrun-Befehls list ermitteln.

  • VM starten: start
  • VM stoppen: stop
  • VM Guest-OS herunterfahren: stop mit Zusatz soft
  • VM pausieren: pause
  • VM wiederherstellen: unpause
  • VM reseten: reset
vmrun -T ws start V:\webserver\webserver.vmx
vmrun -T ws-shared -h https://localhost:8333/sdk -u vmadmin -p password stop "[standard] webserver/webserver.vmx" soft
vmrun -T ws-shared -h https://192.168.0.1:8333/sdk -u vmadmin -p password stop "[standard] webserver/webserver.vmx"

 

Bei Zugriff auf Shared-VMs haben alle Befehle auch immer mit eingeschränkten Nutzerrechten funktioniert, bei der Steuerung von lokalen VMs hat sich die Ausführung der Befehle mit Administratorrechten bewährt.

Batch-Skript zur Automatisierung

Das folgende Batch-Skript kann zum gleichzeitigen Starten bzw. Stoppen von mehreren virtuellen Maschinen genutzt werden.

Das untenstehende Skript fährt die Gast-Betriebssysteme sanft herunter und lässt 5 Sekunden Zeitabstand zwischen den einzelnen abgeschlossenen Shutdown-Vorgängen.

@echo off
setlocal EnableDelayedExpansion
 
rem vmwares
SET "vmware_list[1]=dnsserver/dnsserver.vmx"
SET "vmware_list[2]=webserver/webserver.vmx"
SET "vmware_list[3]=terminalserver/terminalserver.vmx"
SET "vmware_list[4]=mailserver/mailserver.vmx"
 
rem config
SET "vmware_vmrun="C:\Program Files (x86)\VMware\VMware VIX\vmrun.exe""
SET "vmware_host=https://localhost:8333/sdk"
SET "vmware_username=admin"
SET "vmware_password=password"
SET "vmware_timeout=5"
 
rem action
set "x=1"
:SymLoop
if defined vmware_list[%x%] (
    SET vmware_command=%vmware_vmrun% -T ws-shared -h %vmware_host% -u %vmware_username% -p %vmware_password% stop "[standard] %%vmware_list[%x%]%%" soft
    call echo !vmware_command!
    call !vmware_command!
    
    call ping -n %vmware_timeout% localhost > nul
    
    set /a "x+=1"
    GOTO :SymLoop
)

Um mit dem angegebenen Skript virtuelle Maschinen zu Starten, muss der unten stehende Code-Block im obigen Skript ersetzt werden. Das Timeout zwischen den einzelnen Befehlen wird auf 60 Sekunden erhöht um zu verhindern, dass zu viele virtuelle Maschinen gleichzeitig booten und sich durch die erhöhte Festplattenaktivität gegenseitig ausbremsen.

SET "vmware_timeout=60"
 
rem action
set "x=1"
:SymLoop
if defined vmware_list[%x%] (
    SET vmware_command=%vmware_vmrun% -T ws-shared -h %vmware_host% -u %vmware_username% -p %vmware_password% start "[standard] %%vmware_list[%x%]%%"
    call echo !vmware_command!
    call !vmware_command!
    
    call ping -n %vmware_timeout% localhost > nul
    
    set /a "x+=1"
    GOTO :SymLoop
)

Dieser Artikel hat Dir deinen Tag gerettet?

... und mühevolles Probieren, Recherchieren und damit Stunden an Zeit gespart? Oder einfach nur Dein Problem gelöst?

Dann würde ich mich freuen, wenn Du meine Zeit für die Erstellung dieses Blogartikels mit einer kleinen Anerkennung honorierst:

Zahlung mit PayPal oder Kreditkarte.

Hinweis zur Verwendung

Die Übermittlung einer Zahlung ist eine persönliche Anerkennung Ihrerseits an den Entwickler (Christian Bartl, Privatperson). Eine Zahlung ist nicht zweckgebunden und es ist keine Gegenleistung zu erwarten. Bitte beachten Sie, dass für eine übermittelte Zahlung keine Quittung ausgestellt werden kann.

Über den Autor

Christian Bartl

Christian Bartl Requirements Engineer
& Solution Architect für Online und Mobile

Als Technologie-Enthusiast und begeisterter Programmierer entwickle ich in meiner Freizeit Websites, Software und IT-Lösungen, die mir selbst und anderen den Alltag vereinfachen.

mehr auf christian.bartl.me

Kommentare

  1. Hallo,

    erstmal danke für die Anleitung. Ich hab echt lange gesucht, da genau deine Infos in der PDF von VMWare fehlen.

    Ich hab ein VMWare WS 12 Pro mit Shared VMs laufen. Laut der PDF wird das Clonen bei VMWare Server nicht unterstützt.

    Wie sieht es mit den Workstation Shared-VMs aus?

    kommentieren

    1. Hallo Sven,

      hab ich selbst bisher noch nicht benötigt und kann ich dir daher leider auch nicht sagen.

      lg Christian

      kommentieren

  2. die Befehle funktionieren leider nicht, Vmware ws 9, wsx 1.0.2

    kommentieren

Kommentar schreiben

Der hier angegebene Name wird gemeinsam mit deinem Kommentar auf der Website veröffentlicht.

Deine E-Mail-Adresse wird zur einmaligen Benachrichtigung bei Veröffentlichung des Kommentars genutzt.

Benachrichtigung per E-Mail über Antworten auf meinen Kommentar erhalten.

Bitte tippe die Zahlenkombination "3815" ein, nur dann kann ich deinen Kommentar entgegennehmen.

Bitte fülle dieses Feld nicht aus, nur dann kann ich deinen Kommentar entgegennehmen.