Die Foren-SW läuft ohne erkennbare Probleme. Sollte doch etwas nicht funktionieren, bitte gerne hier jederzeit melden und wir kümmern uns zeitnah darum. Danke!

vmware-cmd auf remote rechner benutzen um VMs zu starten

Hilfe bei Problemen mit der Installation oder Benutzung des VMware GSX Server und VMware Server 1.

Moderatoren: Dayworker, irix

Member
Beiträge: 15
Registriert: 07.12.2006, 15:40

vmware-cmd auf remote rechner benutzen um VMs zu starten

Beitragvon Snipey » 07.12.2006, 15:57

Hallo,

ich steh vor einem kleinen Problem, erst mal die Hintergründe. In meiner Firma wird Software entwicklet und deswegen stelle ich unseren Entwicklern virtuelle Maschinen zum testen bereit. Aus Performancegründen soll bei uns nicht die VMWareconsole benuzt werden.
Das ganze soll so aussehen:
Der Benutzer klick auf eine Batchdatei. Diese Batch soll überprüfen ob die VM gestartet ist, das ghet noch aber dann soll, wenn sie nicht gestartet ist dei VM hochgefahren werdern.
Dafür hab ich eine Netzlaufwerk eingerichtet das auf den Ordner VMWare Server zeigt. In ihm liegt die vmware-cmd.bat (Datei von VMWare), diese hab ich angepasst das sie nicht mehr den lokalen Pfad zurückgibt sondern das Netzlaufwerk. Diese Batch startet dann Perl.exe über die ich die VM auf Kommandozeileneben konfigurieren kann. Na ja, so sollte es sein, leider stürzt Perl immer ab.

Lasse ich die vmware-cmd.bat in Ihrem ursprünglichen Zustand und führe das ganze lokal auf dem Server aus funktioniert alles.

Hat jemand erfahrung damit??

Wen es interesiert, der nächste Schritt wäre halt die VM zu starten und zu überprüfen ob Sie gestartet ist und dann eine Terminalsession aufzubauen. Dieser letzte Teil läuft auch schon recht gut. RDP ist einfach schneller als die Console.

Schon mal Danke für eure Hilfe

Benutzeravatar
Member
Beiträge: 49
Registriert: 26.07.2004, 09:18
Wohnort: Potsdam

Beitragvon potsdam » 07.12.2006, 19:24

Welche Betriebssysteme laufen denn auf dem VMWare Server und den Clients?

Mit Perl hab ich noch nicht gearbeitet - wüsste aber eine Lösung mit VBScript und der COM-API von VMWare. Diese müsste dann aber auf den Clients installiert werden. Funktioniert mit Windows-Clients ab 2000.

Wenn das eine Alternatve zum Batchfile wäre sag Bescheid ;-)

Benutzeravatar
UNSTERBLICH(R.I.P.)
Beiträge: 14759
Registriert: 09.08.2003, 05:41
Wohnort: sauerland
Kontaktdaten:

Beitragvon continuum » 07.12.2006, 23:19

Hi
ich wuerde mir auf dem VMware-server host einen ssh-server installieren und dann die vmware-cmd Befehle per putty von deinem Arbeitsrechner aus auf dem VMware-server ausfuehren.
Ein SSH-server fuer Win32 gibt es fuer lau: freesshd

Das die batchs im Moment nicht laufen wenn du sie von einem Netzwerkshare4 startest ist ja wohl klar ...

Ulli

Member
Beiträge: 15
Registriert: 07.12.2006, 15:40

Beitragvon Snipey » 08.12.2006, 09:12

Also der Server hat läuft auf 2003 Stabndart R2, die Clients sind alle XP Prof.
ob Perl oder vbs, spielt auch keine rolle, es soll nur funktionieren.

Das ganze soll nicht von mir ausgeführt werden sondern von den Benutzern in unserem Netzwerk, das heist es darf kein größerer Aufwand als 2 Clicks sein und dann öffnet sich das RDP Fenster zum Connect auf die fertig hochgefahrene Maschine. Ich glaub SSh wäre da etwas aufwendig.

Ein guter Ansatz ist das Programm psexec http://www.microsoft.com/technet/sysint ... sexec.mspx
Damit kann man Scripte, batches etc. auf Remoterechnern ausführen. Leider braucht das Tool Adminrechte auf dem zu steuernden PC und das Passwort wird im Script im klartext angezeigt. Unsere User dürfen keine Möglichkeit haben an irgend welche Adminrechte zu kommen.

Benutzeravatar
Member
Beiträge: 49
Registriert: 26.07.2004, 09:18
Wohnort: Potsdam

Beitragvon potsdam » 08.12.2006, 11:30

OK ich bastle mal was mit VBScript.

Auf dem Client wird dann die VMCom api benötigt um per Script auf dem VMWare Server zuzugreifen. Das File heist VMware-VmCOMAPI-3.0.1-32039.exe muutu mal bei VMWare.com suchen - den genauen Link hab ich leider nicht parat.

Benutzeravatar
Member
Beiträge: 49
Registriert: 26.07.2004, 09:18
Wohnort: Potsdam

Beitragvon potsdam » 11.12.2006, 09:40

So hier ein running example in vbs - hat noch einen Haken: Username und Passwort für einen Nutzer, der die VM Starten darf ist in Klartext hinterlegt.

Es wird geprüft, on die VM läuft, wenn nicht dann wird sie gestartet und gewartet bis der Heartbeat der VM eine Konfigurierbare Uptime signalisiert. Dann wird lokal ein Prog gestartet (z.B. mstsc)

als *.vbs abspeichern, Konfig anpassen und testen ;-)

Code: Alles auswählen

'Region Description
'
' Name:            Start_Reomote_VM
' Author:         Stefan Mrosek
' Version:         0.1
' Description:      Das Script startet eine VM auf einem RemoteServer, prüft ob diese läuft
'               und startet anschließend ein Programm auf dem lokalen Rechner
'
'
' EndRegion

'Region Changelog

   ' 11.12.06      Start of Coding

'EndRegion

'Region Konfiguration

               
vmfile = "E:\w2k_ws1\w2k_ws1.vmx"      'Pfad zum VMX-File der VM - relativ zum VMWare Server
local_app = "mstsc.exe"            'Das lokal zu statende Programm
local_app_Para = "/v:VMGuest"      'Parameter für den Programmaufruf

remote_host = "172.24.128.8"      'IP-Adresse des VMWare Servers
remote_port = "902"               '902 ist Standard
remote_user = "Nutzer"            'Nutzer auf dem VMWareServer, der die VM starten darf
remote_pass = "Passwort"         'Passwort

VMStartMaxTries = 20            'Anzahl der Versuche, die VM zu Starten
VMStartTryInterval = 30            'Sekunden zwischen den Versuchen
VMStartedHeartbeats = 300         'Anzahl der benötigten Hartbeats um zu bestätigen das die VM
                           'Up&Running ist
'EndRegion

'### Ab hier wirds ernst - nichts mehr Ändern

'Region Global Settings
'On Error Resume Next
Set wshShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Set wshNet = CreateObject("WScript.Network")

Const vmExecutionState_On = 1
Const vmExecutionState_Off = 2
Const vmExecutionState_Suspended = 3
Const vmExecutionState_Stuck = 4
Const vmExecutionState_Unknown = 5
Const vmPowerOpMode_Hard = 1
Const vmPowerOpMode_Soft = 2
Const vmPowerOpMode_TrySoft = 3

Const OneSecond = 1000


'EndRegion

'Region Objekte Initialisieren
Set cp = CreateObject("VmCOM.VmConnectParams")
Set server = CreateObject("VmCOM.VmServerCtl")
Set thevm = CreateObject("VmCOM.VmCtl")

If Err.number <> 0 Then
    MSG = MsgBox("Es schein Probleme mit der VMCom-API zu geben.", vbCritical, " ERROR")
   WScript.Quit
End If

cp.hostname = remote_host
cp.username = remote_user
cp.password = remote_pass
cp.port = remote_port
'EndRegion

'Region Verbindung zum VMWare Server herstellen
connected = False
For tries_srv = 1 To 10
   server.Connect cp
   If Err.number = 0 Then
         connected = True
         Exit For
   End If
   WScript.Sleep OneSecond
   Err.clear
Next
 
If Not connected Then
    MSG = MsgBox("Keine Verbindung zum VMWare-Server - Verbindungsdaten prüfen.", vbCritical, " ERROR")
   WScript.Quit
End If   
'EndRegion

'Region Verbindung zur VM herstellen
connected_m = False
For tries_vm = 1 To 10
   thevm.Connect cp, vmfile
   If Err.number = 0 Then
         connected_m = True
         Exit For
   End If
   WScript.Sleep OneSecond
   Err.clear
Next
 
If Not connected_m Then
    MSG = MsgBox("Keine Verbindung zur VM - Verbindungsdaten prüfen.", vbCritical, " ERROR")
   WScript.Quit
End If   
'EndRegion

'Region Status der VM ermitteln
ps = thevm.ExecutionState
 
If ps = vmExecutionState_On Then
    is_on = True   'VM läuft
    MSG = MsgBox("Die VM läuft bereits.", vbExclamation, "Hinweis")

ElseIf ps = vmExecutionState_Off Or ps = vmExecutionState_Suspended Then
    was_on = False   'ist Aus
   is_on = False
Else
    MSG = MsgBox("Die VM befindet sich in einem undefiniertem Zustand - keine Verbindung möglich.", vbCritical, " ERROR")
   WScript.Quit
End If

'EndRegion

'Region VM Starten wenn nötig
If is_on = False Then   
  geton = thevm.start(vmPowerOpMode_Soft)
  'Abwarten bis Hartbeat OK
  For tries_on = 1 To VMStartMaxTries
    Heartbeat = thevm.Heartbeat
    If Heartbeat > VMStartedHeartbeats Then
      is_on = True
      Exit For
    End If
  WScript.Sleep VMStartTryInterval * OneSecond
  Next
  If is_on = False Then
    MSG = MsgBox("Start der VM fehlgeschlagen - Bitte Zustand prüfen.", vbCritical, " ERROR")
   WScript.Quit
  End If
End If
'EndRegion

'Region lokales Programm Starten
If is_on = True Then
   'If fso.FileExists (local_app) Then
      On Error Resume Next
      Set oExec = wshShell.run(local_app & " " & local_app_Para)
   'End If   
End If

'EndRegion

Member
Beiträge: 15
Registriert: 07.12.2006, 15:40

Beitragvon Snipey » 11.12.2006, 10:49

Nettes Script, ich habs jetzt auch so hinbekommen aber lange nicht so elegant. Ich werd Dein Script auf jeden Fall mal testen

Ich habs mit zwei Batchdateien gelöst

Danke

Benutzeravatar
Member
Beiträge: 49
Registriert: 26.07.2004, 09:18
Wohnort: Potsdam

Beitragvon potsdam » 11.12.2006, 11:25

Ich habs mit zwei Batchdateien gelöst
Wie schaun die denn aus?

Member
Beiträge: 15
Registriert: 07.12.2006, 15:40

Beitragvon Snipey » 11.12.2006, 14:07

nicht ganz so toll:

Batch_start.bat:

echo off
ping VM1 –n 1 > c:\Temp\vmlog.txt
if %ERRORLEVEL% == 1 goto WEITER
echo Die VM wird bereits benutzt, bitte versuchen Sie es später noch einmal.
pause
goto ENDE
:WEITER
echo VM wird hoch gefahren, bitte warten Sie.
psexec –u Benutzername –p Passwort \\VMServer \\VMServer\...\vm.bat
\\VMServer\...\VM1.rdp
:ENDE




Jetzt die vm.bat:

echo off
cd c:\Programme\VMWare\WMware Server
call vmware-cmd D:\...\VM1.vmx
echo Es wird auf den Remote Desktop Service gewartet!
:NOCHMAL
call C:\...\portqry –n VM1 –e 3389 –q
echo.
if not %ERRORLEVEL% == 0 goto :NOCHMAL
echo RDP Port gefunden Terminalsession wird gestartet

Benötigt werden die Programme psexec und portqry, gibt beide bei Microsoft.
Die erste Batch steht den Usern direkt zur Verfügung, vm.bat liegt mit den rdp Dateien direkt im Verzeichnis der virtuellen Maschinen


Zurück zu „VMserver 1 und GSX“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste