Autorenarchiv
PXE Install für VMware ESXi (Update)
Ein Kommentar zu dem Artikel PXE Install für VMware ESXi brachte die Frage auf, ob es denn auch möglich sei, eine unattended PXE Installation für ESXi durchzuführen.
Auf den ersten Blick scheint das von VMware so nicht vorgesehen zu sein. Dankenswerterweise jedoch ist die komplette Installationsroutine in Python geschrieben und somit einfach zu manipulieren.
In unserer pxelinux Konfiguration übergeben wir dem Kernel bereits zusätzliche Argumente
APPEND esx4iu1/vmkboot.gz --- esx4iu1/vmkernel.gz --- esx4iu1/sys.vgz --- esx4iu1/cim.vgz --- esx4iu1/ienviron.tgz --- esx4iu1/image.tgz --- esx4iu1/install.tgz
Interessant in unserem Fall sind ienviron.tgz und install.tgz. ienviron.tgz ist der generische Python Installer, install.tgz sind die – für eine ESXi notwendigen – Installationsschritte. Der Lösungsansatz ist nun, die Tastatureingabe für jeden Installationsschritt einfach fest in die Installationsdatei einzutragen und somit die Interaktion zu umgehen.
Achtung! Das ist keine offizielle Herangehensweise und ich übernehme keine Verantwortung für eventuelle Schäden!
# cd /tftpboot/esx4iu1
# cp ienviron.tgz ienviron.tgz.orig
# mkdir tmp ; cd tmp ; tar xzf ../ienviron.tgz
# vi usr/lib/vmware/installer/Core/TUI/Display.py
In der Datei Display.py müssen wir die Funktion Run suchen. Diese ist dafür zuständig, den einzelnen Dialogen (Welcome, EULA, usw.) die Benutzereingabe zu übergeben. Hier tauschen wir einfach die “eingegebenen” Tasten durch “Enter” und “F11″ aus. Achtung: In Python ist die Einrückung wichtig, Tabs mag der Interpreter gar nicht.
def Run(self):
while not self.currentDialog.terminate:
self.Draw()
# keys = self.ui.get_input()
keys = [ 'enter', 'f11' ]
for k in keys:
# pass keystrokes to the current widget
k = self.currentDialog.keypress(self.size, k)
Anschließend packen wir die von uns geänderten Sourcen wieder zu einem Tarball.
# tar czf ../ienviron.tgz *
Das wars auch schon, der Installer wird nun nicht mehr nachfragen und durch die einzelnen Dialoge springen.
Ich bin mir sicher, dass es hier noch wesentlich elegantere Möglichkeiten gibt, hat man die Zeit, könnte man das ganze Installationsframework patchen, um eventuell eine Konfiguration ala ks.cfg einzulesen.
Viel Spaß beim Nachbauen!
PXE Install für VMware ESXi
Als Zusatz zu Blogeintrag Kickstart für VMware ESX 4.0
Vorweg müssen wir ein ISO Image der aktuellen VMware ESXi Version von der VMware Webseite heraus laden. Den Inhalt des ISO Images auf bekannte Art und Weise in unsere tftpboot Umgebung kopieren.
Zur Konfiguration von SYSLINUX
Analog zu den bestehenden Konfigurationsdateien, hier eine exemplarische Datei für ein System mit der Hardware MAC Adresse 00:11:22:33:44:55. Unsere ESXi Installation wurde unter /tftpboot/esx4iu1 abgelegt.
# cat /tftpboot/pxelinux.cfg/01-00-11-22-33-44-55
DEFAULT menu.c32
PROMPT 0
MENU WIDTH 80
MENU MARGIN 10
MENU PASSWORDMARGIN 3
MENU ROWS 12
MENU TABMSGROW 18
MENU CMDLINEROW 18
MENU ENDROW 24
MENU PASSWORDROW 11
MENU TIMEOUTROW 20
MENU TITLE VMware ESX
MENU AUTOBOOT Kickstart VMware ESXi 4.0 Update 1 in 5 seconds
LABEL esx4
MENU LABEL esx
MENU DEFAULT
TIMEOUT 50
KERNEL esx4iu1/mboot.c32
APPEND esx4iu1/vmkboot.gz --- esx4iu1/vmkernel.gz --- esx4iu1/sys.vgz --- esx4iu1/cim.vgz --- esx4iu1/ienviron.tgz --- esx4iu1/image.tgz --- esx4iu1/install.tgz
Wird das System nur über PXE gebootet, startet die ESXi Installation an.
Viel Spaß beim Testen!
perl SDK – Mac Adressen aller virtuellen Maschinen auslesen
Wem ist es nicht schon einmal untergekommen. Die interne Technik läuft säuerlich durch die Stockwerke, gibt kryptische Hexblöcke von sich, redet von Konflikten und meint damit nicht die aktuelle Weltpolitik? Gemeint ist natürlich ein Mac- bzw. IP-Adressen-Konflikt innerhalb eines IP-Netzwerks. Einem ESX-Admin stellt sich nun die Aufgabe, über alle ESX-Hosts zu gehen und z.B. mit grep die .vmx-Dateien zu durchsuchen. Alternativ bauen wir uns einfach ein kleines Perl Skript, was nicht nur eleganter, sondern vor allem zeitsparender ist.
Anbei die Rohfassung eines solchen Skriptes, es bleibt wie immer dem Leser überlassen, kosmetische Verbesserungen vorzunehmen. Voraussetzung ist eine lauffähige Perl-SDK-Installation.
#!/usr/bin/perl
#
# Search VirtualCenter Server for all assigned VM Nic mac adresses.
#
use strict;
use warnings;
use VMware::VIRuntime;
Opts::parse();
Opts::validate();
Util::connect();
# Get the service content reference, root to most of the API features
my $sc = Vim::get_service_content();
unless ($sc->about->apiType() eq “VirtualCenter”) {
die “This script needs to be run against a virtual center.\n”;
}
sub getVmName {
my $vm = shift;
if (ref($vm) ne “VirtualMachine”) {
die(“Invalid VirtualMachine reference”);
}
return $vm->{summary}->{config}->{name};
}
sub getVmMac {
my $vm = shift;
if (ref($vm) ne “VirtualMachine”) {
die(“Invalid VirtualMachine reference”);
}
my @mac;
foreach my $dev_ref (@{ $vm->{config}->{hardware}->{device} }) {
if(defined($dev_ref->{macAddress})) {
# assume nic
push @mac, $dev_ref->{macAddress};
}
}
return @mac;
}
# Fetch all VMs
my $vms = Vim::find_entity_views(view_type => ‘VirtualMachine’);
foreach my $vm_view (@{$vms}) {
my $vm_name = getVmName($vm_view);
my @mac = getVmMac($vm_view);
print “Name: $vm_name\n”;
print “Mac: “. join(“, “, @mac) .”\n”;
}
END {
Util::disconnect();
}
Viel Spaß damit!
perl SDK – Host Alarme in vCenter bestätigen
Manchmal ist es einfacher, vCenter Alarme über die Kommandozeile zu bestätigen (acknowledge), als das Ganze via VI Client zu erledigen.
Hier ein kleines Beispiel, wie das mittels Perl SDK und vSphere 4.0 API funktioniert:
#!/usr/bin/perl
use strict;
use warnings;
use VMware::VIRuntime;
# validate options, and connect to the server
Opts::parse();
Opts::validate();
Util::connect();
# This is where most features starts … get service content reference
my $sc = Vim::get_service_content();
# fetch alarmManager
my $alarmManager = Vim::get_view( mo_ref => $sc->alarmManager );
unless (defined $alarmManager) {
print “ERROR Could not connect to alarmManager. Exiting.\n”;
print “Remember: you need to connect to a vCenter installation.\n”;
Util::disconnect();
exit 1
}
# our ESX Hosts
my $esx_hosts = Vim::find_entity_views( view_type => ‘HostSystem’ );
foreach my $esx (@{$esx_hosts}) {
printf “Working at Host: %s\n”, $esx->{summary}->{config}->{name};
if($esx->{summary}->{host}->{type} ne “HostSystem”) {
printf “Skipping for non HostSystem ‘%s’”, $esx->{summary}->{host}->{type};
next;
}
foreach my $alarm_me (@{$esx->{triggeredAlarmState}}) {
my $alarm = Vim::get_view( mo_ref => $alarm_me->{alarm} );
printf “%s “, $alarm->{info}->{lastModifiedTime};
printf “%s\n”, $alarm->{info}->{name};
# Ack the alarm
$alarmManager->AcknowledgeAlarm( alarm => $alarm_me->{alarm},
entity => $alarm_me->{entity} );
printf “Alarm acknowledged\n”;
}
}
Util::disconnect();
Viel Spaß damit!
vSphere – Hostnamen von vCenter Server ändern
Im Zuge einer internen ESX-Server-Konsolidierung bin ich über das Problem gestolpert, den vCenter Server Hostnamen ändern zu müssen. Da auf dem vCenter Host zusätzlich noch eine SQL Server 2005 Express Edition installiert war, gab es etwas mehr zu tun.
Bevor wir loslegen, muss grundsätzlich sichergestellt sein, dass der vCenter-Server seinen neuen Hostnamen <NEWNAME> korrekt auflösen kann.
SQL Server
- Über das SQL Server Management Studio System-Tabellen via Stored Procedures anpassen (<OLDNAME> und <NEWNAME> entsprechend wählen)
sp_dropserver '<OLDNAME>\SQLEXP_VIM'
GO
sp_addserver '<NEWNAME>\SQLEXP_VIM', local
GO
- Anzeigen der Änderungen (Achtung: Änderungen werden erst nach einem Reboot aktiv)
sp_helpserver
SELECT @@SERVERNAME, SERVERPROPERTY('ServerName')
vCenter Server
- Falls notwendig, den Hostnamen der ODBC Verbindung auf den SQL Server via Management Console (mmc) anpassen
- Auf dem vCenter Server anmelden und in den nachfolgenden Dateien <OLDNAME> durch <NEWNAME> ersetzen. (Achtung: Änderungen werden erst nach einem Reboot aktiv)
C:\Program Files\VMware\Infrastructure\VirtualCenter Server\extensions\cim-ui\extension.xml
C:\Program Files\VMware\Infrastructure\tomcat\webapps\cim-ui\scriptConfig.xml
C:\Program Files\VMware\Infrastructure\VirtualCenter Server\extensions\health-ui\extension.xml
C:\Program Files\VMware\Infrastructure\tomcat\webapps\health-ui\scriptConfig.xml
C:\Program Files\VMware\Infrastructure\VirtualCenter Server\extensions\com.vmware.vim.stats.report\extension.xml
C:\Program Files\VMware\Infrastructure\tomcat\webapps\statsreport\WEB-INF\web.xml
- Abschließend noch die letzte Anpassung via vSphere Client
- Anmeldung an vCenter mittels vSphere Client
- [Menü] -> Administration -> vCenter Server Einstellungen
- Unterhalb der [Laufzeit Einstellungen] den vCenter Server Name anpassen
- Im Menüpunkt [Erweiterte Einstellungen] die URL Einstellungen korrigieren
- VirtualCenter.VimWebServiceUrl
- VirtualCenter.VimApiUrl
Werden alle diese Aktionen ohne Reboot durchgeführt, ist final noch ein Neustart notwendig.
Viel Erfolg!

