21x9.org | System Administration | Home Automation | Smart Home
02.05.2013

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.

  • Einführung
  • Paketverwaltung
  • Grenzen

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ß.

Tags: linux xen xentools xen hooks vm

Tags

linux xen xentools xen hooks vm

Feeds

Atom 1.0 RSS JSON
  • Datenschutz
  • Impressum
  • Archiv