vSphere CLI: Verbindung zum ESX schlägt fehl

Wenn man sich mit den vSphere CLI’s zum Server verbinden will erhält man die Meldung:

Server version unavailable at '<a href="https://esx-server:443/sdk/vimService.wsdl'" target="blank">https://esx-server:443/sdk/vimService.wsdl'</a> at /usr/share/perl5/VMware/VICommon.pm line 545, <STDIN> line 2.

Dies ist kein bug in der vSphere CLI, sondern eine restriktion in den neueren perl Versionen, die ein https connect ohne gültiges SSL Zertifikat verweigern. – Und da fast niemand auf dem ESX ein meist kostenpflichtiges "gültiges" SSL Zertifikat installieren will, dürfte dieser mag einige Administratoren betreffen.

Die Lösung ist ganz einfach mittels einer shell-Variable, die man jeweils vor dem Aufruf setzen muss:

export PERL_LWP_SSL_VERIFY_HOSTNAME=0

Damit dürfte dann die verbindung klappen.

Related Links

vmware communities: openSSL certificate verification

ESX: Backup

Hat man einen ESX Server aufgesetzt und am laufen kommt bald die Frage auf, wie sichern.

Hier sind einige Szenarien erwähnt:

ESX-Konfiguration

Es ist zwar nicht unbedingt nötig, die ESX Konfiguration zu sichern, kann aber trotzdem nützlich sein und mit den vmware-vcli scripts [http://www.vm-help.com/esx/esx3i/esx_3i_rcli/vicfg-cfgbackup.php|vicfg-cfgbackup] gemacht werden:

[root@linux-server ~]# vicfg-cfgbackup --server esx-server -s /backup/esx-server.tgz

Virtuelle Maschinen (Full Backup)

Oft wäre es z.B. in Desaster Szenarien gut, wenn man ein volles Backup seiner Virtuellen Maschinen hätte.

Dies ist zwar mit dem "VMware Consolidated Backup" möglich, doch diese Software ist sehr teuer.
Günstiger und einfacher(!) gehts mit dem kostenlosen Community-Script [http://communities.vmware.com/docs/DOC-8760|ghettoVCB].

Dieses script muss auf dem ESX-Server in der SSH shell gestartet werden und kann sogar Online-Backups im laufenden Betrieb mittels snapshots erzeugen! 😉

Virtuelle Maschinen (Konfiguration)

Diesen Fall musss man nur dann beachten, wenn man kein Hardware-RAID hat und stattdessen einfach zwei oder mehrere physische Disks hat mit denen man je einen Datastore macht und diese dann mittels eines Software RAIDs zusammenführt.

In diesem Fall werden die Konfigurationen der virtuellen Maschine nämlich nur auf dem "Haupt"-Datastore gespeichert. Fällt nun genau diese Disk aus, verliert man zumindest die Konfiguration der VM und muss diese neu erstellen.
Um dem vorzubeucgen kann man sich mittels dem folgenden Script, dass man per cronjob auf dem ESXi laufen lassen kann zumindest die Konfiguration sichern:

#!/bin/sh
 
MAIN_DS="/vmfs/volumes/local-disk1"
BACKUP_DS="/vmfs/volumes/local-disk2"
 
cd $MAIN_DS
for vmDir in `ls -d *`; do
  if [ ! -d $BACKUP_DS/$vmDir ]; then
    echo "$BACKUP_DS/$vmDir does not exist, creating it"
    mkdir $BACKUP_DS/$vmDir
  fi
  cp $vmDir/<em>.nvram $vmDir/</em>.vmsd $vmDir/<em>.vmx $vmDir/</em>.vmxf $BACKUP_DS/$vmDir/ 2> /dev/null
done

[stextbox id=“warning“ caption=“Achtung“]Generell ist bei ESX ein Setup ohne Hardware-RAID eine "Bastelei"; im privaten Bereich leider oft die einzige Möglichkeit um eine Virtualisierung zu betreiben.

Falls nun die primäre Festplatte ausfällt, wird die VM darauf nicht mehr weiterlaufen, insofern ist die Verfügbarkeit im Sinne des RAIDs nicht mehr vollständig gegeben.
Man kann aber mittels dieser Lösung die VM vom zweiten Datastore wieder starten und so relativ schnell wieder verfügbar machen.[/stextbox]

Related Links

What Files Make Up a Virtual Machine?
HLOG files.. Do I need to keep them?
Hetzner-Forum: ESX mit Soft-RAID betreiben

ESX: Cronjobs permanent machen

Beim ESX Server wird der Grossteil des Filesystems bei jedem neustart neu initialisiert und alle (manuellen) Änderungen gehen verloren.

Dies trifft leider auch für das crontabs file (/var/spool/cron/crontabs/root) zu.

Das einzige file, welches nicht neu erstellt wird ist: /etc/rc.local. – Dabei darf man sich, wenn man dieses file anschaut, nicht vom erwähnten Verzeichnis: "/etc/rc.local.d" verwirren lassenn! – Dieses (nicht-existente) Verzeichnis sieht zwar so aus, wie wenn es dazu gedacht wäre lokale init-scripts abzulegen, es wird aber, wenn man es erstellt ebenfalls bei jeden neustart gelöscht.

Will man nun z.B. sein eigenes crontab file erstellen, bei dem Änderungen nicht verloren gehen, ist folgende Vorgensweise möglich:

Ein Verzeichnis auf einem Datastore- (z.B. /vmfs/volumes/myDatastore/), und darin ein crontabs Verzeichnis erstellen.

Danach fügt man noch einen Eintrag in /etc/rc.local hinzu, der das cronfile bei jedem start an das schon vorhande anhängt:

mkdir /vmfs/volumes/myDatastore/crons
cp /var/spool/cron/crontabs/root /vmfs/volumes/myDatastore/crons/
echo "cat /vmfs/volumes/myDatastore/crons/root >> /var/spool/cron/crontabs/root" >> /etc/rc.local

Gebräuchliche OpenSSL Befehle

Allgmeine OpenSSL Befehle

Diese Kommandos dienen zum erstellen von CSRs, Zetifikaten, PrivateKeys und anderen verschiedenen Dingen.

PrivateKey erstellen

openssl genrsa -out example.com.key 4096

Zertifikat erstellen

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt

CSR erstellen

openssl req -out CSR.csr -key privateKey.key -new

Siehe dazu auch: SSL CSR erstellen für weitere Optionen, wie z.B: ein CSR für ein SAN Zertifikat.

CSR aus bestehendem Zertifikat erstellen

Hat man keinen CSR zum ursprünglich angelegten Zertifikat mehr, lässt sich das einfach aus dem bisherigen Zertifikat und Key erstellen:

openssl x509 -x509toreq -in certificate.crt -signkey privateKey.key -out $CSR.csr 

Neuer PrivateKey aus altem erstellen

openssl rsa -in privateKey.pem -out newPrivateKey.pem

Neuer CSR inklusive key erstellen

openssl req -new -newkey rsa:4096 -nodes -keyout www.example.com.key -out www.example.com.csr -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"

Neues selbst signiertes Zertifikat inklusive key erstellen

openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout www.example.com.key -out www.example.com.crt

Überprüfen mit OpenSSL

Zertifikate, CSRs oder PrivateKeys überpüfen:

Certificate Request (CSR) prüfen

openssl req -text -noout -verify -in CSR.csr

PrivateKey prüfen

openssl rsa -check -in privateKey.key

Zertifikat anschauen

openssl x509 -text -noout -in certificate.crt

Einzelne Felder aus dem Zertifikat ausgeben

openssl x509 -enddate -noout -in certificate.crt
openssl x509 -subject -noout -in certificate.crt

PKCs12 file prüfen

openssl pkcs12 -info -in keyStore.p12

Debuggen mit OpenSSL

Falls man einen Fehler bekommt wie: „private doesn’t match the certificate“ oder einem installierten Zertifikat wird nicht vertraut, dann kann man das mit diesem Kommandos herausfinden.

Prüfen ob ein Zetifikat (.crt) zu einem Schlüssel (.key) passt

openssl x509 -noout -modulus -in certificate.crt | openssl md5; openssl rsa -noout -modulus -in privateKey.key | openssl md5; openssl req -noout -modulus -in CSR.csr | openssl md5

(alle md5-summen müssen gleich sein)

Mit der Website verbinden und Zertifikat sehen

openssl s_client -connect www.paypal.com:443

Hinweis: Bei der Verwendung von name based virtualhosts mittels SNI muss zusätzlich noch der Parameter -servername angefügt werden:

openssl s_client -servername www.paypal.com -connect www.paypal.com:443

Konvertieren mit OpenSSL

Mit den folgenden Kommandos kann man Zertifikate und Schlüssel in andere Format konvertieren um diese mit spezifischen Server- und Software- typen kompatibel zu machen.
z.B. eine normale PEM Datei, welche mit apache funktionieren würde in eine PFX (PKCS#12) Datei umwandeln und mit Tomcat oder IIS zu benutzen.

DER nach PEM

openssl x509 -inform der -in certificate.cer -out certificate.pem

PEM nach DER

openssl x509 -outform der -in certificate.pem -out certificate.der

PKCS12/PFX (.p12/.pfx) nach PEM

openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes

(You can add -nocerts to only output the private key or add -nokeys to only output the certificates)

PEM nach PKCS12/PFX (.p12/.pfx)

openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

Quelle: SSLShopper: The Most Common OpenSSL Commands

CA erstellen und mit dieser ein Zertifikat erstellen

Mit den nachfolgenden Befehlen kann man schnell eine CA erstellen udn damit ein Zertifikat signieren:

# Key erstellen
openssl genrsa -out ca.key 2048
# Root-CA Zertifikat mit diesem key erstellen
openssl req -x509 -new -nodes -key ca.key -sha256 -days 1024 -out ca.crt

## Zertifikat für domain: "example.org" erstellen
# Key für cert erstellen:
openssl genrsa -out example.org.key 2048
# CSR mit diesem key erstellen
openssl req -new -key example.org.key -out example.org.csr
# Zertifikat erstellen und mit der Root-CA signieren:
openssl x509 -req -in example.org.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out example.org.crt -days 500 -sha256

Nützliche aliase für bash

Wenn man in bash aliase anlegt kannt man die, doch recht schwierig zu merkenden Kommandos abkürzen:

alias csrview='openssl req -text -noout -verify -in'
alias crtview='openssl x509 -text -noout -in'
alias sslkeygen='openssl genrsa 4096 -out'

Nützliche Shell Scripts

Diese Scripts kann man im ~/bin/ Verzeichnis ablegen zum einfachen aufrufen.

checkcert
Zeigt die Checksummen von KEY, CRT und CSR an, damit man sofort sieht ob diese zusammenpassen.

#!/bin/bash

DOMAIN=$1
if [ -z "$DOMAIN" ]; then
  echo "usage: $0 <domain.tld>"
  exit 1
fi

if [ "$DOMAIN" != "" ]; then
  if [ -f  $DOMAIN.crt ]; then
    echo -n "CRT: "; openssl x509 -noout -modulus -in $DOMAIN.crt | openssl md5
  fi
  if [ -f  $DOMAIN.key ]; then
    echo -n "KEY: "; openssl  rsa -noout -modulus -in $DOMAIN.key | openssl md5
  fi
  if [ -f  $DOMAIN.csr ]; then
    echo -n "CSR: "; openssl  req -noout -modulus -in $DOMAIN.csr | openssl md5
  fi
fi

Festplatten im laufenden Betrieb entfernen („hot-remove“)

Will man unter Linux eine Disk „hot removen“, also im laufenden Betrieb herausziehen, muss man danach auch die Referenzen auf das Device entfernen.

Macht man dies nicht und „reisst die Disk einfach heraus“, erhält man solche unschönen Fehler im messages log, bzw. mit dmesg:

end_request: I/O error, dev sdd, sector 209715192
sd 0:0:3:0: SCSI error: return code = 0x00010000
end_request: I/O error, dev sdd, sector 0
sd 0:0:3:0: SCSI error: return code = 0x00010000
end_request: I/O error, dev sdd, sector 0

oder im LVM:

[root@server ~]# vgs
  /dev/sdd: read failed after 0 of 4096 at 0: Input/output error
  VG     #PV #LV #SN Attr   VSize   VFree
  [...]

Um die Festplatte im laufenden Betrieb richtig entfernen zu können, muss man nebst dem obligatorischen korrektem unmounten / aus der VG removen / pvremove / usw. folgendes tun um die System-Referenz auf das Device entfernen:

echo 1 > /sys/block/<DEVICE>/device/delete

Wobei <DEVICE> hier mit dem Device-Namen ersetzt werden muss, in unserem Fall z.b. „sdd“.

Man kann diese Prozedur im übrigen auch machen, wenn man die Festplatte schon heraus gezogen hat, um diese Meldungen verschwinden zu lassen. (:wink:)

Quellen

Nach CentOS6 upgrade: Windows clients lassen sich nicht mehr zur Domäne hinzufügen

Nach dem upgrade von CentOS/RHEL 5 auf CentOS/RHEL 6 stellt man fest, dass sich Windows clients nicht mehr an der SAMBA-Domäne anmelden können.

Es erscheint die folgende Meldung:

Der folgende Fehler ist beim Abfragen von DNS über den Ressourceneintrag der Dienstidentifizierung (SRV) aufgetreten, der zur Suche eines Domänencontrollers für die Domäne "my.domain.tld" verwendet wird:
 
Fehler: "Der DNS-Name ist nicht vorhanden."
(Fehlercode 0x0000232B RCODE_NAME_ERROR)
 
Die Abfrage war für den SRV-Eintrag für _ldap._tcp.dc._msdcs.MY.DOMAIN.TLD
 
Die häufigsten Ursachen dieses Fehlers sind:
 
- Der DNS-SRV-Eintrag wurde nicht in DNS registriert.
 
- Mindestens eine der folgenden Zonen enthalten keine Delegierung zu dieser untergeordneten Zone:
 
my.domain.tld
domain.tld
tld
. (die Stammzone)
 
Klicken Sie auf "Hilfe", um weitere Informationen über die Fehlerbehebung zu erhalten.

Das Problem liegt daran, dass bei CentOS 5 der smb und der nmb daemon zusammen im startscript: /etc/init.d/smb gestartet wurden.
Bei CentOS 6 hingegen, werden diese über die zwei getrennten Startscript: /etc/init.d/smb und /etc/init.d/nmb gestartet. Vergisst man nun, den nmb daemon zu aktivieren, schlägt das hinzufügen zur domäne fehl.

Das problem wird durch starten des nmb daemons gelöst:

chkconfig nmb on
/etc/init.d/nmb start

Diagnostizieren kann man das Problem mit den folgendes commands:

smbclient -L <IP> -U%
Domain=[MY.DOMAIN.TLD] OS=[Unix] Server=[Samba 3.5.10-115.el6_2]
 
        Sharename       Type      Comment
        ---------       ----      -------
        print$          Disk      Printer Driver Download Area
        share           Disk      Temporary file space
        media           Disk      Video, Bilder und Sound
        IPC$            IPC       IPC Service (domain-server)
        myprinter      Printer   HP Color LaserJet
Domain=[MY.DOMAIN.TLD] OS=[Unix] Server=[Samba 3.5.10-115.el6_2]
 
        Server               Comment
        ---------            -------
        DOMAIN-SERVER        domain-server
        MYWORKSTATION
 
        Workgroup            Master
        ---------            -------
        MY.DOMAIN.TLD        DOMAIN-SERVER

(Wenn der PDC nicht funktioniert sind die unteren beiden Abschnitte "Server" und "Workgroup" leer.

nmblookup -A <PDC-IP>
Looking up status of x.x.x.x
        DOMAIN-SERVER       <00> -         B <ACTIVE>
        DOMAIN-SERVER       <03> -         B <ACTIVE>
        DOMAIN-SERVER       <20> -         B <ACTIVE>
        ..<b>MSBROWSE</b>. <01> - <GROUP> B <ACTIVE>
        MY.DOMAIN.TLD   <1d> -         B <ACTIVE>
        MY.DOMAIN.TLD   <1b> -         B <ACTIVE>
        MY.DOMAIN.TLD   <1c> -         B <ACTIVE>
        MY.DOMAIN.TLD   <1e> - <GROUP> B <ACTIVE>
        MY.DOMAIN.TLD   <00> - <GROUP> B <ACTIVE>
 
        MAC Address = 00-00-00-00-00-00

Mehrere Linux Konsolenfenster mit screen

Auch in einem Linux Terminal kann man mehrere "Fenster" haben – Und das praktische dabei ist: Diese laufen automatisch weiter, wenn man sich aus der aktuellen SSH Session ausloggt! (:wink:)

Möglich wird dies mit dem Programm "screen", einem sogenannten "Terminal-multiplexer".

[stextbox id=“note“ caption=“Hinweis“]screen gilt mittlerweile als veraltet und ausserdem ist die Entwicklung tot.
Als bessere alternative wird tmux angesehen, welches jedoch sehr ähnlich funktioniert und die Bedienung von dieser Seite abgeleitet werden kann.[/stextbox]

Zum Benutzen gibt man in der Linux Session einfach "screen" ein.

Hier kann man dann ganz normal Programme laufen lassen. Will man sich nun aus dieser screen-session ausloggen, drückt man CTRL+A und gibt dann: "d" (für dettach) ein. Und schon ist man wieder in der normalen Linux shell, wo man sich nun aus- und nach dem einloggen das laufende Programm einfach mit "screen -r" (re-attach) zurückholen kann.

Die Bedienung von screen erfolgt im allgemeinen immer mittels: [[CTRL]+a, gefolgt von einem Buchstaben als Befehl; also ähnlich wie ESC beim vi.

Die folgenden Befehle sind in einer screen session sehr nützlich:

  • [[CTRL]+a c

[c]reate, erzeugt ein neues screen Fenster.

  • [[CTRL]+a n

[n]ext, springt zum nächsten screen Fenster.

  • [[CTRL]+a p

[p]revious, springt zum vorherigen screen Fenster

  • [[CTRL]+a #

Das # steht für eine Nummer, mit der man direkt zum entsprechenden Terminal springen kann. Das erste Fenster startet ab 0, welches also mittels CTRL+a 0 erreicht werden kann.

  • [[CTRL]+a A

Damit kann man dem Fesnter einen Namen geben

  • [[CTRL]+a "

Eine Übersicht aller screen Fenster anzeigen

  • [[CTRL]+a K

[K]ill, schliesst das screen Fenster und beendet die darin laufenden Programme.

  • [[CTRL]+a S

[S]plit, erzeugt einen horizontalen splitscreen (im neuen screen muss noch mit [CTRL]+a c ein neues Fenster erzeugt werden)

  • [[CTRL]+a |

Wie oben, aber mit einem horizontalem splitscreen

  • [[CTRL]+a [[TAB]

Wechselt zwischen den splitscreens

  • [[CTRL]+a X

Schliesst den aktuellen splitscreen

  • [[CTRL]+a Q

Schliesst alle splitscreens

Quellen

linux screen terminal
Screen auf wiki.archlinux.de

Mit vi ganze Textblöcke bearbeiten

Immer wieder steht man vor dem Problem mit dem VI schnell mal einen ganzen Codeblock auskommentieren zu müssen. Mit dem Blockmodus von VI geht das auch ganz einfach:

In die Anfangszeile wechseln und CTRL+V drücken, dies aktiviert den Blockmodus (im Status erscheint: – VISUAL BLOCK –)

Jetzt den Cursor bis zur gewünschten Zeile nach unten (Cursortaste oder j) verschieben, der Block dazwischen wird dadurch ausgewählt

Mit shift+i (großes I) in den Eingabemodus wechseln und das gewünschte Kommentarzeichen (#, // ) eingeben.

Mit ESC zurück in den Befehlsmodus, VI hat jetzt an den Anfang jeder Zeile das gewünschte Zeichen eingefügt.

Sollen die Zeilen wieder einkommentiert werden muss der Block zuerst wie vorher wieder markiert werden. Bei mehr als einem Zeichen werden die weiteren mit der Cursortaste oder l markiert. Zum löschen x drücken.

Dies funktioniert übrigens auch mit Einrückungen.

Output loopen

Möchte man in einem shell script mit einer Ausgabe irgendwas machen, geht das ganz leicht mittels:

for line in `ls`; do echo "this is line: $line"; done

In diesem Beipsiel wird jede Zeile von "ls" wieder ausgegeben.
Selbiges könnte man zum Beispiel cat mit dem Inhalt einer Datei machen:

for line in `cat datei.txt`; do echo "this is line: $line"; done

Man kann auch ein kommando ausführen und dies erst in eien Variable schreiben.
Das folgende Beispiel findet alle ausführbaren .conf Dateien im Verzeichis /etc/myapp/ und führt diese mit dem entpsrechenden Benutzer der die Datei besitzt aus:

init_files=`find /etc/myapp/<em> -maxdepth 1 -type f -name </em>.conf -perm -u+rx`
for init_files in $init_files
  do
    script_owner=`stat -c '%U' $init_script`
    echo -e "nStarting script for user: $script_owner"
    sudo -u $script_owner -i $init_script $1;
    RETVAL=$(($RETVAL+$?))
  done