Xen-Tools: Xen-Hooks
Wer einen Server mit Xen betreibt wird häufig eine bestimmte Grundkonfiguration für die virtuellen Maschinen (VM) verwenden. Diese bei jeder neuen Maschine manuell herzustellen ist fehleranfällig und zeitaufwendig.
Mit Xen-Tools
kann man hier Abhilfe schaffen.
Der Befehl xen-create-image
kennt sog. Hooks
die nach der Durchführung von debootstrap
angewendet werden. Diese Hooks ermöglichen eine umfassende Systemkonfiguration während der Erstellung einer neuen VM. Sie befinden sich in Form von Shell-Scripten im Verzeichnis /usr/lib/xen-tools/
. In dem Verzeichnis gibt es für jede Distribution die über den Parameter –dist
angegeben werden kann bestimmte Hooks.
Diese leiten sich in der Regel in Form von Symlinks von einer common
-Scriptsammlung ab. Lediglich distributionsspezifische Abweichungen werden nicht von common abgeleitet. Diese Hooks können z.B. Benutzer von Hostsystem in die VM übernehmen. Es können aber auch eigene Scripte in den Erstellungsablauf eingestellt werden:
#!/bin/sh
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# create /backup
#
if [ ! -d ${prefix}/backup ]; then
if mkdir -p ${prefix}/backup; then
logMessage “successfully created /backup”
else
logMessage “failed to create /backup”
fi
fi
#
# add user backupuser
#
if chroot ${prefix} /usr/sbin/useradd -d /backup/obnam -m backupuser; then
logMessage “successfully added backupuser”
else
logMessage “failed to add backupuser”
fi
#
# create .ssh directory
#
if [ ! -d ${prefix}/backup/obnam/.ssh ]; then
if mkdir -p ${prefix}/backup/obnam/.ssh; then
logMessage “successfully created .ssh”
else
logMessage “failed to create .ssh”
fi
fi
#
# add ssh-key to authorized_keys2
#
if echo “ssh-rsa [rsa_key_from ~/.ssh/id_rsa.pub] root@hosting” >> ${prefix}/backup/obnam/.ssh/authorized_keys2; then
logMessage “successfully added ssh-key”
else
logMessage “failed to add ssh-key”
fi
#
# disable sftp-subsystem and enable internal sftp
#
if [ -f ${prefix}/etc/ssh/sshd_config ]; then
if sed -i ‘s/Subsystem sftp/#Subsystem sftp/’ ${prefix}/etc/ssh/sshd_config; then
logMessage “successfully disabled sftp-Subsystem”
else
logMessage “failed to disable sftp-Subsystem”
fi
if (cat << 'EOF' >> ${prefix}/etc/ssh/sshd_config
Subsystem sftp internal-sftp
Match user backupuser
ChrootDirectory /backup/obnam
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
EOF
); then
logMessage “successfully altered sshd_config”
else
logMessage “failed to alter sshd_config”
fi
fi
#
# Set user and group for sftp jail
#
if chown root:root ${prefix}/backup/obnam; then
logMessage “successfully chowned /backup/obnam for sftp-jail”
else
logMessage “failed to chown /backup/obnam for sftp-jail”
fi
if mkdir ${prefix}/backup/obnam/repo; then
logMessage “successfully created repo-dir for obnam”
else
logMessage “failed to create repo-dir for obnam”
fi
if chroot ${prefix} chown backupuser:backupuser /backup/obnam/repo; then
logMessage “successfully chowned /backup/obnam/repo”
else
logMessage “failed to chown /backup/obnam/repo”
fi
#
# Install obnam
#
installDebianPackage ${prefix} obnam
#
# Log our finish
#
logMessage Script $0 finished
Das oben aufgeführte Script 97-cust-backup-config
dient zur Grundeinrichtung eines auf Debian Wheezy basierenden Backupsystems.
Das Script nimmt grundlegende Systemeinstellungen vor, legt Benutzer an, Installiert und Konfiguriert diverse Zusatzprogramme und stellt Anbindungen zu Überwachungssystemen wie Iginga
und Munin
her.
Zunächst werden Funktionen wie logMessage
und installDebianPackage
initialisiert und dem Script zur Verfügung gestellt.
Danach geben wir den Start des entsprechenden Scriptes bekannt, diese Nachricht wird nur angezeigt und im Logfile vermerkt wenn xen-create-image
mit dem Parameter –verbose
ausgeführt wurde.
Im Anschluss legen das Verzeichnis /backup
in der VM an. Der Parameter ${prefix}
verweist hierbei auf den im Xen-Hostsystem gemounteten Inhalt der neuen VM. Lässt man ${prefix}
weg würde das Verzeichnis im Xen-Hostsystem angelegt, was ebenfalls praktisch sein kann. Die korrekte Erzeugung des Verzeichnisses wird durch die if
-Abfrage überwacht und es wird entsprechende Meldung ausgegeben (wenn –verbose aktiv ist).
Nun wird der Benutzer backupuser
mit dem Homeverzeichnis /backup/obnam/
erzeugt. Außerdem wird die Datei .authorized_keys2
für den backupuser
abgelegt. Mit dieser Einstellung kann das zu sichernde System selbstständig und ohne Kennwortinteraktion auf den Backupserver zugreifen und dort Daten ablegen.
Für den Benutzer backupuser
wird nun noch ein SFTP-Jail eingerichtet und hierzu die /etc/ssh/sshd_config
angepasst. Der Backupuser ist somit in seinem Homeverzeichnis eingesperrt und kann nicht mit dem eigentlichen Betriebssystem interagieren, was die Sicherheit des Systems erhöht. Das Verzeichnis /backup/obnam/repo/
wird für den Benutzer angelegt und schreibbar gemacht. Hier wird später das Backup abgelegt.
Abschließend wird das Backupprogramm obnam
installiert. Dies ist nicht zwingend nötig, da das Backup von dem zu sichernden System aus nur auf dem Backupserver abgelegt wird, aber so wird die Funktion obnam nagios-last-backup-age
auf dem Backupserver nutzbar.
Um Befehle direkt in der (noch nicht gestarteten) VM, statt im Xen-Hostsystem, auszuführen wird dem gewünschten Befehl chroot ${prefix}
vorangestellt.
Services müssen nach einer Konfigurationsänderung nicht neu gestartet werden, da die Konfiguration der VM noch im ausgeschalteten Zustand vorgenommen wird und erst bei Start der VM erstmals aktiv werden.
Es gibt aber natürlich noch weitere Anwendungsfälle für Hooks.
#!/bin/sh
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Fix empty gateway network config
#
if [ -f ${prefix}/etc/network/interfaces ]; then
if sed -i.bak ‘s/gateway/#gateway/’ ${prefix}/etc/network/interfaces; then
logMessage “successfully fixed network config”
else
logMessage “failed to fix network config”
fi
fi
#
# Install additional Packages
#
installDebianPackage ${prefix} obnam
installDebianPackage ${prefix} logwatch
installDebianPackage ${prefix} apticron
installDebianPackage ${prefix} fail2ban
installDebianPackage ${prefix} sysnews
installDebianPackage ${prefix} ntpdate
installDebianPackage ${prefix} ntp
installDebianPackage ${prefix} mlocate
installDebianPackage ${prefix} mc
installDebianPackage ${prefix} unp
installDebianPackage ${prefix} bzip2
#
# Install and configure git/etckeeper
#
installDebianPackage ${prefix} etckeeper
installDebianPackage ${prefix} git
chroot ${prefix} git config –global user.name “root”
chroot ${prefix} git config –global user.email root@concepts-and-training.de
#
# Install and configure Munin-Node
#
installDebianPackage ${prefix} munin-node
sed -i “s/#host_name localhost.localdomain/host_name ${hostname}/” ${prefix}/etc/munin/munin-node.conf
sed -i ‘s/allow \^::1\$/allow ^192\\.168\\.150\\.2$/’ ${prefix}/etc/munin/munin-node.conf
#
# Install and configure exim4
#
installDebianPackage ${prefix} exim4
cat << EOF > ${prefix}/etc/exim4/update-exim4.conf.conf
dc_eximconfig_configtype=’satellite’
dc_other_hostnames=’${hostname}’
dc_local_interfaces=’127.0.0.1 ; ::1′
dc_readhost=’${hostname}.example.de’
dc_relay_domains=”
dc_minimaldns=’false’
dc_relay_nets=”
dc_smarthost=’192.168.150.1′
CFILEMODE=’644′
dc_use_split_config=’false’
dc_hide_mailname=’true’
dc_mailname_in_oh=’true’
dc_localdelivery=’mail_spool’
EOF
chroot ${prefix} /usr/sbin/update-exim4.conf
#
# Install and configure nrpe
#
installDebianPackage ${prefix} nagios-nrpe-server
cat << EOF > ${prefix}/etc/nagios/nrpe_local.cfg
server_address=${ip1}
allowed_hosts=192.168.150.2
command[check_users]=/usr/lib/nagios/plugins/check_users -w 5 -c 10
command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
command[check_zombie_procs]=/usr/lib/nagios/plugins/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/lib/nagios/plugins/check_procs -w 200 -c 250
command[check_all_disks]=/usr/lib/nagios/plugins/check_disk -w 20 -c 10 –exclude-type=tmpfs –exclude-type=devfs –exclude-type=devtmpfs
command[check_ssh]=/usr/lib/nagios/plugins/check_ssh localhost
command[check_smtp]=/usr/lib/nagios/plugins/check_smtp -H localhost
command[check_backup]=/usr/bin/obnam nagios-last-backup-age –repository=/backup/obnam/repo/ –client-name=${obnamhostname}
command[check_ntp]=/usr/lib/nagios/plugins/check_ntp -H localhost
EOF
#
# Configure Icinga on Dom0
#
cat << EOF > /etc/icinga/objects/${hostname}_icinga.cfg
define host{
use generic-host
host_name ${hostname}
alias ${hostname}.localdomain
address ${ip1}
}
EOF
# Search for “backup servers” and add ${hostname} to the first (and only the first) “members” line
sed -i.bak -e “/backup servers/,$ { 0,/members.*/s/members.*/&\,${hostname}/ }” /etc/icinga/objects/hostgroups_icinga.cfg
#
# Install and configure rkhunter
# (should be the last installed package to speed up the installation process)
#
installDebianPackage ${prefix} rkhunter
echo “ALLOW_SSH_ROOT_USER=yes” >> ${prefix}/etc/rkhunter.conf
echo “ALLOWHIDDENDIR=/etc/.git” >> ${prefix}/etc/rkhunter.conf
echo “ALLOWHIDDENFILE=/etc/.etckeeper” >> ${prefix}/etc/rkhunter.conf
echo “ALLOWHIDDENFILE=/etc/.gitignore” >> ${prefix}/etc/rkhunter.conf
#
# Locale Settings
#
echo “export LANGUAGE=en_US.UTF-8” >>${prefix}/etc/profile
echo “export LANG=en_US.UTF-8” >>${prefix}/etc/profile
echo “export LC_ALL=en_US.UTF-8” >>${prefix}/etc/profile
chroot ${prefix} locale-gen en_US.UTF-8
#
# Shell-Alert
#
echo ‘echo `hostname -f` “ALERT – Shell Access on:” `date` `who` | mail -s “`hostname -f`: Alert: Shell Access from `who | cut -d”(” -f2 | cut -d”)” -f1`” root’ >> ${prefix}/etc/profile
#
# E-Mail-Aliases
#
echo “root: root@example.de” >> ${prefix}/etc/aliases
chroot ${prefix} newaliases
#
# Log our finish
#
logMessage Script $0 finished
Erneut beginnt es mir der Initialisierung des Hooks, um diverse Funktionen wie (logMessage
, installDebianPackage
) bereitzustellen.
Die hier erzeugte Backupmaschine besitzt keine öffentliche IP-Adresse und auch kein Gateway. Die entsprechende Konfiguration in der XEN-Tools-Konfiguration ist daher leer. Hierdurch wird in /etc/network/interfaces
der leere Eintrag gateway=
eingefügt. Dies funktioniert leider nicht, was wir im weiteren Verlauf beheben, indem mit sed
nach dem String gateway=
gesucht wird und die Zeile auskommentiert wird. Hierbei wird eine .bak
-Datei erzeugt.
Nun installieren wir einige Debian-Pakete nach, die zunächst keiner weiteren Konfiguration unterzogen werden.
Außerdem installieren und konfigurieren wir die Pakete etckeeper
, git
und munin-node
. Die Angabe von chroot
ist hierbei notwendig, damit die Konfiguration innerhalb der zu erzeugenden VM getätigt wird. Ansonsten würde der Befehl für den Xen-Host ausgeführt, was ebenfalls hilfreich sein kann. ${prefix}
enthält den Pfad zu den Daten der VM.
Des weiteren installieren und erzeugen eine voll funktionsfähige Exim4-Konfiguration. Hierbei werden alle Nachrichten an den Smarthost unter der IP 192.168.150.1
weitergeleitet, der sich dann um die eigentliche Zustellung der Nachrichten kümmert. Dies ist notwendig da die VM über keine eigene Internetverbindung verfügt und nur im internen Netzwerk kommunizieren kann. (Für Paketupdates wird ein APT-Proxy (apt-cacher-ng
) verwendet. Fremdpakete können über einen Proxy heruntergeladen werden, oder per SFTP von einem Rechner im internen Netz bezogen werden.)
Anschließend wird der Nagios-Remote-Server nrpe
installiert und eingerichtet. Die Variable ${IP1}
enthält die erste mit dem Parameter –ip=
gesetzte IP-Adresse des xen-create-image
-Befehls. Die so erstellte Konfiguration wird in Zeile 109-123 der Icinga/Nagios-Konfiguration auf dem Xen-Host hinzugefügt. Wir sorgen außerdem dafür, dass der neue Server über die members
-Zeile der Servergruppe backup servers
zugewiesen wird. Hierbei ist sichergestellt, dass nur das erste Vorkommen von members
, nach dem ersten Auftreten des Strings backup servers
verändert wird. Die Variable ${hostname}
enthält den Wert des xen-create-image
-Parameters –hostname
.
Nun installieren wir noch rkhunter
und setzen einige Konfigurationsoptionen. Nachfolgende setzen wir die korrekten Einträge für die Spracheinstellungen des System, sorgen dafür dass bei jeder Anmeldung eines Benutzers per SSH eine E-Mail mit einer Information über den Loginvorgang an root
gesendet wird und abschließend wird ein Alias für den Benutzer root
gesetzt, damit E-Mail den eigentlichen Empfänger der Nachrichten erreicht. Hierbei kann es sich auch um eine Komma separierte Liste von mehreren Benutzern handeln.
Manchmal sind Änderungen notwendig die nicht per Hook realisiert werden können. Dies tritt z.B. dann ein, wenn die Konfiguration der Maschine in /etc/xen/
angepasst werden muss. Dies kann z.B. nötig sein, wenn sich die gewünschte IP-Konfiguration nicht per xen-create-image
realisieren lässt.
Per Hook sind solche Anpassungen nicht möglich, weil zur Laufzeit der Hooks die Konfigurationsdatei gar nicht existiert. Im folgenden Beispiel wird ein Wrapper-Script verwendet, welches solche Anpassungen (unter anderem) ebenfalls ermöglicht. Die Kernaufgabe des Scripts ist folgende:
In unserem Hosting-Setup bekommt jeder Kunde eine eigene virtuelle Hosting-Maschine. Hierzu gehört eine, ebenfalls virtuelle Xen, Backupmaschine. Backup jetzt im Sinne von, da kommen die Backupdaten hin und dort befindet sich der MySQL-Replication-Slave. Nicht im Sinne von Failovermaschine. Die Konfiguration der Backupmaschinen ist, von der Größe des Backupspeichers abgesehen, stets identisch. Per Hooks werden die Maschinen vollautomatisch eingerichtet. Die Hostingmaschinen stehen in 3 verschiedenen Paketen zur Verfügung.
Da zu jeder Hosting-Maschine eine passende Backupmaschine gehört bietet sich natürlich ein Script an, welches beide Maschinen gleichzeitig erzeugt:
#!/bin/bash
hosting_ips=”/root/xen_hosting_ips.csv”
backup_ips=”/root/xen_backup_ips.csv”
backup_server=”root@192.168.30.1″
create_script=”/usr/bin/xen-create-image”
hosting_ip_prefix=”192.168.20.”
backup_ip_prefix=”192.168.30.”
if [ ! -f ${hosting_ips} ]; then
echo “IP;Name;Package;external IP;Date created” > ${hosting_ips}
echo “192.168.20.1;Hosting;Xen-Host” >> ${hosting_ips}
fi
if [ ! -f ${backup_ips} ]; then
echo “IP;Name;Package;Date created” > ${backup_ips}
fi
if [ -z $1 ]; then
echo “”
read -p “Please choose package (1-3): ” -N 1 package
echo “”
fi
if [ -z $package ]; then
package=$1
else
package=”package${package}”
fi
if [ ${package} != “package1” ] && [ ${package} != “package2” ] && [ ${package} != “package3” ]; then
echo “Unknown Package…”
exit 1
fi
if [ -z $2 ]; then
echo “Please enter machine name: ”
read machine_name
echo “”
fi
if [ -z $machine_name ]; then
machine_name=$2
fi
if [ ${package} = “package1” ]; then
h_ram=1024
h_cpu=1
h_hdd=25
b_ram=256
b_cpu=1
b_hdd=25
fi
if [ ${package} = “package2” ]; then
h_ram=4096
h_cpu=4
h_hdd=50
b_ram=256
b_cpu=1
b_hdd=50
fi
if [ ${package} = “package3″ ]; then
h_ram=8192
h_cpu=8
h_hdd=250
b_ram=256
b_cpu=1
b_hdd=250
fi
h_machine_name=${machine_name}”.hosting.example.de”
b_machine_name=${machine_name}”.backup.example.de”
if grep ${h_machine_name} ${hosting_ips} > /dev/null; then
echo “A Machine with the name ${h_machine_name} already exists…”
echo “”
read -p “Overwrite? ALL DATA WILL BE LOST! [y/N] ” -N 1 overwrite
if [ “$overwrite” != “y” ]; then
echo “Quit…”
exit 1
else
ipsuffix=$(grep ${h_machine_name} ${hosting_ips} | awk -F [.\;] ‘{print $4}’)
force_overwrite=”–force”
fi
else
ipsuffix=$(tail -n 1 ${hosting_ips} | awk -F . ‘{print $4 + 1}’)
fi
h_ip=”${hosting_ip_prefix}${ipsuffix}”
b_ip=”${backup_ip_prefix}${ipsuffix}”
if [ -z $3 ]; then
echo “”
read -p “Do you want the hosting machine to have an external IP? [y/N] ” -N 1 extip
echo “”
if [ “${extip}” = “y” ]; then
echo “Please enter the IP for ${h_machine_name}: ”
read h_extip
echo “”
else
h_extip=$3
fi
fi
echo “Hosting Machine ${h_machine_name}”
echo “RAM: ${h_ram} MB”
echo “CPU: ${h_cpu}”
echo “HDD: ${h_hdd} GB”
echo “IP : ${h_ip}”
if [ ! -z ${h_extip} ]; then
add_ip=”–ip=${h_extip}”
echo “IP2: ${add_ip: 5}”
fi
echo “”
echo “Backup Machine ${b_machine_name}”
echo “RAM: ${b_ram} MB”
echo “CPU: ${b_cpu}”
echo “HDD: ${b_hdd} GB”
echo “IP : ${b_ip}”
echo “”
read -p “OK? [y/N] ” -N 1 ok
echo “”
if [ “${ok}” = “y” ]; then
echo “Creating machines…”
if ${create_script} –hostname=${h_machine_name} –size=${h_hdd}Gb –swap=${h_ram}Mb –memory=${h_ram}Mb –pygrub –dist wheezy –fs=ext4 –ip=${h_ip} –netmask=255.255.255.0 –bridge=xenbr1 –lvm=vg0 ${force_overwrite} ${add_ip}; then
if [ -z $force_overwrite ]; then
echo “${h_ip};${h_machine_name};${package};${add_ip: 5};`date`” >> ${hosting_ips}
fi
else
echo “Error during hosting machine creation…”
exit 1
fi
if ssh ${backup_server} ${create_script} --hostname=${b_machine_name} --size=${b_hdd}Gb --swap=${b_ram}Mb --memory=${b_ram}Mb --pygrub --dist wheezy --fs=ext4 --ip=${b_ip} --netmask=255.255.255.0 --bridge=xenbr1 --lvm=vg0
if [ -z $force_overwrite ]; then
echo “${b_ip};${b_machine_name};${package};`date`” >> ${backup_ips}
fi
else
echo “Error during backup machine creation…”
exit 1
fi
clear
hosting_info=$(tail -n 8 /var/log/xen-tools/${h_machine_name}.log)
backup_info=$(ssh ${backup_server} tail -n 8 /var/log/xen-tools/${b_machine_name}.log)
echo “${hosting_info}”
echo “”
echo “${backup_info}”
echo “”
echo -e “${hosting_info}\n\n${backup_info}” | mail -s “${h_machine_name} – The new Systems is ready” root
if [ ! -z ${h_extip} ]; then
echo “”
echo “Fixing network configuration…”
ip2mac=”00:16:3e:”`openssl rand -hex 3 | sed ‘s/\(..\)/\1:/g; s/.$//’`
echo “Using ${ip2mac} as MAC-address for IP ${h_extip}.”
echo “”
sed -i.bak “s${h_extip}//” /etc/xen/${h_machine_name}.cfg
sed -i.bak -e “/vif/,$ { s/]/,\n ‘ip=${h_extip} ,mac=${ip2mac},bridge=xenbr0’,\n ]/ }” /etc/xen/${h_machine_name}.cfg
fi
read -p “Start Machines? [y/N] ” -N 1 start
if [ “${start}” = “y” ]; then
xen create /etc/xen/${h_machine_name}.cfg
ssh ${backup_server} xen create /etc/xen/${b_machine_name}.cfg
fi
else
echo “Quit…”
exit 1
fi
Zunächst werden die notwendigen Variablen befüllt. Das Script nutzt zwei CSV-Dateien, welche Daten über die vorhandenen Xen-Gäste enthalten. Außerdem wird der root-Benutzer und die IP des Backupservers angegeben, damit dort dann die Erstellung der Backup-Maschine durchgeführt wird.
Wenn die CSV-Dateien noch nicht existieren werden diese erzeugt. Hierbei wird direkt die IP des Hostsystems eingetragen, damit diese nicht für eine Gastmaschine genutzt wird. Die IPs der Backupserver werden auf Basis der Hostingserver erstellt, daher ist in der CSV-Datei kein Platzhalter notwendig.
Das Script kann per Kommandozeile mit Parametern aufgerufen werden, der erste Parameter wählt das Hostingpaket, der zweite Parameter gibt den Namen der Maschine an. Der optionale dritte Parameter entscheidet darüber ob die Hostingmaschine eine externe IP erhält (andernfalls ist der Zugriff auf die Maschine nur per http/https über einen nginx-Proxy möglich, Debian-Paketupdates kommen sowieso über einen apt-cache-Proxy/apt-mirror).
Werden keine/nicht alle notwendigen Parameter gesetzt werden diese interaktiv abgefragt. Hierum kümmern sich die Zeilen 19-74. Dort werden auch die Werte für die verschiedenen Hostingpakete vergeben. 1GB RAM für Paket 1, 4GB für Paket 2 und 8GB für Paket 3, etc.
Außerdem erzeugen wir aus dem angegebenen Hostnamen einen FQDN.
Existiert bereits eine Maschine mit dem angegebenen Namen wird nachgefragt ob diese überschrieben werden soll.
WARNUNG: Bejaht man diese Frage wird die alte Maschine gelöscht, aber nicht nur diese sondern auch das zugehörige Backup. Dies geschieht dadurch dass xen-create-image
später der Parameter –force
übergeben wird. Hierbei werden die LVM-Laufwerke der Gastmaschinen gelöscht und neu erstellt. Die Möglichkeit stammt aus der Testphase unseres Setups bei dem Maschinen häufig überschrieben wurden. In der Praxis sollte sie eigentlich nicht gebraucht werden.
Wird eine bestehende Maschine überschrieben wird die alte IP wiederverwendet (nur die interne IP, eine externe IP kann erneut frei gewählt werden). Wird eine komplett neue Maschine erstellt wird die letzte verwendete IP aus der CSV-Datei ausgelesen und um 1 erhöht. Wenn die letzte Hostingmaschine also die interne IP 192.168.20.100 hatte erhält die neue Maschine die 192.168.20.101. Die Backupmaschine erhält dann automatisch die IP 192.168.30.101.
Sofern nicht bereits per Kommandozeilenparameter angegeben fragen wir nach ob eine, und wenn ja welche, externe IP-Adresse vergeben werden soll. Diese Möglichkeit gibt es nur für die Hostingmaschinen, da die Backupmaschinen generell nur über das interne Netzwerk erreichbar sind.
Sind alle Fragen gestellt wird noch einmal eine Übersicht über die Konfiguration der Maschinen angezeigt. Sind alle Angaben korrekt wird die Erzeugung der beiden Maschinen gestartet.
Abschließend werden die letzten 8 Zeilen der Maschinenkonfiguration angezeigt, diese enthalten Angaben zur Netzwerkkonfiguration und das root-Kennwort. Die Daten werden außerdem per E-Mail an root versendet (die Übertragung der Mail erfolgt per mTLS und ist somit verschlüsselt).
Der Mailoutput für die Maschine foobar
und der externen IP 1.2.3.4
nebst zugehöriger Backupmaschine:
Installation Summary
———————
Hostname : foobar.hosting.example.de
Distribution : wheezy
IP-Address(es) : 192.168.20.116 1.2.3.4
RSA Fingerprint : xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Root Password : 2KQni7Ac37lKwEj
Installation Summary
———————
Hostname : foobar.backup.example.de
Distribution : wheezy
IP-Address(es) : 192.168.30.116
RSA Fingerprint : xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Root Password : JzTDfdWD4mwTZu9
Wenn die Maschinen erstellt und die Mail mit den Kennwortdaten versendet wurde passt das Script die eingangs erwähnte Konfiguration der Netzwerkkonfiguration der Hostingmaschine an (das was per Hook nicht möglich ist, da die Konfiguration zu diesem Zeitpunkt noch nicht geschrieben wurde). Dies ist nur nötig wenn eine externe IP verwendet wird. Für die Hostingmaschine selbst wird die Netzwerkkonfiguration per Hook geschrieben.
Nachdem auch dies erfolgt ist können die Maschinen auf Wunsch direkt gestartet werden. Je nachdem wie umfangreich die Konfiguration per Hooks ausfällt sind beide Maschinen dann bereits voll einsatzbereit. Im Grunde könnten die Maschinen sogar z.B. per Web-Interface vom Kunden selbst erstellt werden und stünden dann nach wenigen Minuten bereit. So macht Hosting Spaß.