Das neue System besteht aus:
- 1 x Super Micro D-X7SPA-HF-D525-O Mainboard
- 2 x 2 GB RAM
- 4 x 3 TB SATA-HDD
- einem billigen 19″-Rack-Gehäuse
Die Platten besitzen eine große GPT-Partition zudem habe ich sie zu einem RAID10 zusammengefasst und darüber einen LVM-Layer gelegt (mehr zu LVM steht im oben verlinkten Artikel zu Xen). Die Dom0 (also das physikalische System) hat 32 GB für das root-Dateisystem und 4 GB Swap. Außerdem gibt es noch auf jedem Laufwerk eine 16 MB umfassende “Reserved BIOS boot area”. (Mehr dazu gibt es unter: http://jasonschaefer.com/transition-away-from-mbr-to-gpt-booting/)
Die Dom0 verfügt über 512 MB RAM, da dort so gut wie keine Dienste laufen sollte das locker reichen. Als System wird, wie gewohnt, Debian Wheezy verwendet.
Da das Board über zwei Netzwerkkarten verfügt habe ich mich dazu entschlossen die beiden Netzwerkkarten zusammenzuschalten (Bonding). Hierzu ist zunächst das Paket ifenslave-2.6
zu installieren. Anschließend wird die Datei /etc/network/interfaces
wie folgt angepasst:
auto lo
iface lo inet loopback
auto bond0
iface bond0 inet static
address 192.168.42.42
netmask 255.255.255.0
network 192.168.42.0
broadcast 192.168.42.255
gateway 192.168.42.1
slaves eth0 eth1
bond-mode active-backup
bond-miimon 100
bond-downdelay 200
bond-updelay 200
auto xenbr0
iface xenbr0 inet static
bridge_ports bond0
bridge_stp no
address 192.168.42.42
netmask 255.255.255.0
network 192.168.42.0
broadcast 192.168.42.255
gateway 192.168.42.1
Durch das Bonding kann eine Netzwerkkarte ausfallen und die andere übernimmt in diesem Fall deren Funktion.
Damit es wirklich etwas neues für das Blog gibt habe ich mich entschieden das System redundant auszulegen (Cluster). Mir ist natürlich bewusst dass dies auf derselben Hardware nicht so wahnsinnig viel Sinn macht, aber es soll ja eine Spielwiese sein, da muss nicht immer alles Sinn ergeben. Ich habe also mit Xen zwei identische Systeme (DomUs, also virtuelle Xen-Maschinen) aufgesetzt.
Die beiden DomUs haben ebenfalls je eine 32 GB root-Partition und 2 GB Swap, außerdem jeweils 1 GB RAM. Zusammen mit den 512 MB RAM der Dom0 sind also 2,5 GB RAM bereits vergeben. Bleiben aber immer noch 1,5 GB für weitere Testmaschinen, in Anbetracht der doch eher geringen CPU-Leistung sollte das mehr als ausreichend sein.
Da ich nun zwei Systeme habe, die im Grunde identisch konfiguriert sein sollten/müssen habe ich mich dazu entschlossen eine System-Management-Software zu verwenden. Meine Wahl fiel auf SaltStack
, andere Tools aus diesem Bereich sind Puppet
und Chef
. Eigentlich ist sowas natürlich totaler Overkill, aber Spielwiese und so. ;)
Saltstack erlaubt es auf dem Salt-Master (der Einfachheit halber habe ich diesen auf dem Dom0 installiert) sogenannte States zu definieren und zu bestimmen auf welche Maschinen diese States angewendet werden sollen. Die an den Salt-Master angebundenen Maschinen werden Minions
genannt.
Die Installation des Salt-Masters ist sehr einfach, hierzu wird das Salt-Repository der Datei /etc/apt/sources.list
hinzugefügt, der GPG-Key des Repositories importiert, der apt-Katalog aktualisiert und das Paket salt-master
installiert:
echo “deb http://debian.saltstack.com/debian wheezy-saltstack main” >> /etc/apt/sources.list
wget -q -O- “http://debian.saltstack.com/debian-salt-team-joehealy.gpg.key” | apt-key add –
apt-get update
apt-get install salt-master
In der Konfigurationsdatei /etc/salt/master
werden nun noch folgende Zeilen von ihrem Kommentarzeichen (#) befreit und der salt-master neu gestartet (`/etc/init.d/salt-master restart):
file_roots:
base:
– /srv/salt
file_ignore_regex:
– ‘/\.git($|/)’
In /srv/salt/
werden später die sog. States abgelegt. Da ich die States mit git
versionieren möchte wird der Salt-Master angewiesen alle Dateien in /srv/salt/.git/
zu ignorieren.
Auf den Minions (die beiden DomUs) wird jetzt ebenfalls das Repository und der Key hinterlegt. Hier wird dann allerdings das Paket salt-minion
installiert. In /etc/salt/minion
wird nun noch in der Zeile master:
die IP bzw. der Hostname des Salt-Masters (die Dom0) eingetragen und der Salt-Minion neu gestartet:
echo “deb http://debian.saltstack.com/debian wheezy-saltstack main” >> /etc/apt/sources.list
wget -q -O- “http://debian.saltstack.com/debian-salt-team-joehealy.gpg.key” | apt-key add –
apt-get update
apt-get install salt-minion
sed -i.bak ‘s/#master: salt/master: 192.168.42.42/’ /etc/salt/minion
/etc/init.d/salt-minion restart
Nun führt man auf dem Salt-Master den Befehl salt-key -L
aus. Dieser sollte nun die Hostnamen der beiden Minions unter Unaccepted Keys
aufführen. Um die Key zu akzeptieren und so die Minions mit dem Master zu verbinden muss der Befehl salt-key -A
ausgeführt werden.
Mit dem Befehl salt ‘*’ test.ping
kann nun die Kommunikation des Masters mit seinen Minions überprüft werden:
root@doctormoon:/srv/salt# salt ‘*’ test.ping
thelibrary-node2:
True
thelibrary-node1:
True
Nun können wir uns an unseren ersten State wagen. Hierzu wird zunächst die Datei /srv/salt/top.sls
erstellt, diese steuert welche States an welche Minions verteilt werden:
base:
‘*’:
– standard_packages
Die Datei besagt dass alle Minions (’*’
) mit dem State standard_packages
versorgt werden sollen. Dieser State wird über die Datei /srv/salt/standard_packages.sls
definiert:
base:
pkg.installed:
– pkgs:
– htop
– ifto1p
– iotop
– nload
– etckeeper
– unp
– mc
– pciutils
– lsof
– debian-goodies
– molly-guard
– logwatch
– apticron
build-essential:
pkg.installed
python-pip:
pkg.installed
python-dev:
pkg.installed
glances:
pip.installed:
– name: glances
– require:
– pkg: build-essential
– pkg: python-pip
– pkg: python-dev
Der State sorgt dafür dass die unter pkgs
aufgelisteten Debian-Pakete auf den Minions installiert werden. Außerdem werden noch die Pakete build-essential
, python-pip
und python-dev
installiert. Über die Python-Repository-Verwaltung pip
wird anschließend glances
installiert. Allerdings dann des require
-Abschnitts nur dann, wenn die Pakete build-essential
, python-pip
und python-dev
auf dem Minion vorhanden sind bzw. deren Installation erfolgreich verlaufen ist.
Mit dem Befehl salt ‘*’ state.highstate
kann der State nun angewendet werden. Nach einiger Zeit sollte der Befehl eine Auflistung der Pakete ausgeben die auf den Minions installiert wurden. Führt man den Befehl erneut aus wird geprüft ob der im State definierte Zustand immer noch korrekt ist, falls nicht wird er wieder hergestellt. Ist alles so wie es sein soll sieht der Output so aus:
root@doctormoon:/srv/salt# salt ‘*’ state.highstate
thelibrary-node2:
———-
State: – pkg
Name: build-essential
Function: installed
Result: True
Comment: Package build-essential is already installed
Changes:
———-
State: – pkg
Name: python-pip
Function: installed
Result: True
Comment: Package python-pip is already installed
Changes:
———-
State: – pkg
Name: python-dev
Function: installed
Result: True
Comment: Package python-dev is already installed
Changes:
———-
State: – pip
Name: glances
Function: installed
Result: True
Comment: Package already installed
Changes:
———-
State: – pkg
Name: base
Function: installed
Result: True
Comment: All specified packages are already installed.
Changes:
thelibrary-node1:
———-
State: – pkg
Name: build-essential
Function: installed
Result: True
Comment: Package build-essential is already installed
Changes:
———-
State: – pkg
Name: python-pip
Function: installed
Result: True
Comment: Package python-pip is already installed
Changes:
———-
State: – pkg
Name: python-dev
Function: installed
Result: True
Comment: Package python-dev is already installed
Changes:
———-
State: – pip
Name: glances
Function: installed
Result: True
Comment: Package already installed
Changes:
———-
State: – pkg
Name: base
Function: installed
Result: True
Comment: All specified packages are already installed.
Changes:
Salt Stack kann noch bedeutend mehr, damit könnte man wahrscheinlich problemlos ein weiteres Blog befüllen. Zum Glück ist aber die Doku recht gut gelungen (ich empfehle die PDF oder ePub-Variante): http://docs.saltstack.com/index.html
Ich werde aber natürlich die Einrichtung meines kleinen Systems hier im Blog noch weiter beschreiben und dabei auch noch einige Beispiele für die Verwendung von salt anbringen. Im nächsten (oder eher übernächsten) Artikel wird es dann um den Zusammenbau des Clusters auf Basis von corosync
und pacemaker
gehen.