HowTo: VMWare ESXi Backuplog per E-Mail verschicken

Ich habe ja letzte Woche eine Anleitung veröffentlicht, wie man auf dem VMWare ESXi Hypervisor wunderbar Backups macht.
Allerdings will man natürlich nicht immer nachsehen, ob die Backups nun erfolgreich waren oder nicht.
Deshalb die Idee der ESXi Server könnte doch einfach ein E-Mail schicken mit den Logfile des Backups?

Tja, das Problem ist wohl das der ESXi (wohl aus Sicherheitsgründen) wirklich sehr abgespeckt ist, und deswegen keine Möglichkeit um E-Mails zu versenden besitzt.

Aber ich hab mir da etwas einfallen lassen!

Nach langem suchen bin ich auf die Idee gekommen wir könnten doch einfach E-Mails verschicken mit Hilfe von netcat und einem Shell-Script!
netcat ist hier zu bekommen, ich habe hierbei einfach das i386 RPM-Paket runtergeladen und lokal entpackt.
Darin befindet sich eine netcat Binary die auch auf dem ESXi funktioniert!

Nachdem wir die netcat Binary auf den Server kopiert haben (in meinem Fall unter /vmfs/volumes/primary/custom/netcat), können wir mit folgendem Script E-Mails verschicken: #!/bin/sh

#################################################
 # Author: Michael Simmer
 # Date: 23.10.2010
 # Version: 0.2
 # Contact: http://www.zeux.at/
 #################################################
netcat="/vmfs/volumes/primary/custom/netcat"
 tmp="/tmp/mail"
 hostname=`hostname`
if [ -f $netcat ]
 then
if [ $# -eq 5 ]
 then
 echo -e "HELO $hostname\r" > $tmp
 echo -e "MAIL FROM: $2\r" >> $tmp
 echo -e "RCPT TO: $3\r" >> $tmp
 echo -e "DATA\r" >> $tmp
 echo -e "From: $2\r" >> $tmp
 echo -e "To: $3\r" >> $tmp
 echo -e "Subject: $4\r" >> $tmp
 echo -e "\r" >> $tmp
 if [ -f $5 ]
 then
 awk '{printf("%s\r\n", $0);}' < $5 >> $tmp
 #cat $5 >> $tmp
 #echo -e "\r" >> $tmp
 else
 echo "Error: File not found!"
 rm $tmp
 exit 1
 fi
 echo -e ".\r" >> $tmp
 echo -e "quit\r" >> $tmp
$netcat -i 1 $1 25 < $tmp
rm $tmp
 else
 echo "Usage: ./sendmail.sh     "
 exit 1
 fi
 else
 echo "Error: netcat Binary not found!"
 exit 1
 fi

bzw. sendmail.sh zum Herunterladen.

Das Script ist sehr leicht zu benutzen, einfach ./sendmail.sh [Mailserver] [von E-Mail Adresse] [an E-Mail Adresse] [Betreff] [Datei, dessen Inhalt in der Mail sein soll]
Beispiel: ./sendmail.sh mein.mailserver.com esxi@example.com empfaenger@example.com “ESXi Backup Logfile” /vmfs/volumes/primary/custom/backuplog.txt

Um nun auch ein Backuplog zu haben, das wir verschicken können, müssen wir bei unserem ghettoVCB.sh Script noch -l [/pfad/zum/logfile] anhängen.

Nun gibt es mehrere Möglichkeiten das Backuplog zu verschicken:

1. Wir verschicken das Backuplog per cronjob einige Zeit nach dem Backup per Mail weg.
Dazu brauchen wir einfach einen weiteren cronjob, der das sendmail.sh Script einige Stunden später aufruft.

2. Wir bauen den sendmail.sh Befehl in das ghettoVCB.sh Script ein, damit es nach dem Backup das Backuplog verschickt.
Wo ihr den sendmail.sh Befehl einbauen müsst, müsst ihr euch aber selbst raussuchen!

3. Wir bauen ein weiteres Script, dass das ghettoVCB.sh Script aufruft, und danach das sendmail.sh Script ausführt, und tragen dieses als cronjob ein.

Wem das komplette Backuplog zu lange ist, der baut einfach dazwischen noch folgendes ein:

mv /vmfs/volumes/primary/custom/backuplog.txt /vmfs/volumes/primary/custom/temp.txt
grep "info" /vmfs/volumes/primary/custom/temp.txt | grep -v "CONFIG" > /vmfs/volumes/primary/custom/backuplog.txt
rm /vmfs/volumes/primary/custom/temp.txt

Mein “Zwischenscript” (welches ich unter /vmfs/volumes/primary/custom/backup.sh abgelegt habe) sieht in etwa so aus:

 
#!/bin/sh
/vmfs/volumes/primary/custom/ghettoVCB.sh -f /vmfs/volumes/primary/custom/vmlist -c /vmfs/volumes/primary/custom/conf -l /vmfs/volumes/primary/custom/backuplog.txt
mv /vmfs/volumes/primary/custom/backuplog.txt /vmfs/volumes/primary/custom/temp.txt
grep "info" /vmfs/volumes/primary/custom/temp.txt | grep -v "CONFIG" > /vmfs/volumes/primary/custom/backuplog.txt
rm /vmfs/volumes/primary/custom/temp.txt
 /vmfs/volumes/primary/custom/sendmail.sh x.x.x.x esxi@domain.local mik@domain.local "ESXi Backup Log" /vmfs/volumes/primary/custom/backuplog.txt
rm /vmfs/volumes/primary/custom/backuplog.txt
 

In die /etc/rc.local trage ich also folgendes ein:
echo “0 1 * * 3 /vmfs/volumes/primary/custom/backup.sh” >> /var/spool/cron/crontabs/root

somit sieht mein cronjob nachher so aus:
0 1 * * 3 /vmfs/volumes/primary/custom/backup.sh