Ansible / Teil 2 – Foreman als GUI

Es folgt der zweite Teil zur Linux Orchestrierung mit Ansible, in dem es sowohl um die Installation einer grafischen Übersicht geht als auch eine Möglichkeit darstellt, sich die Inventarisierung automatisch generieren zu lassen.
Zum Thema GUI klammere ich die kommerzielle Variante “Ansible Tower” ebenso aus, wie das Open-Source Äquivalent “AWX” und richte den Fokus auf Foreman. Dies stellt lediglich meine persönliche Präferenz dar, da ich Foreman einerseits übersichtlicher und andererseits einfacher zu handhaben empfinde. Wir setzen auf den vorherigen Teil auf, weswegen die vorangegangene Installation und Konfiguration von Ansible bereits durchgeführt sein sollte. Darum bildet auch wieder ein Ubuntu Server 20.04 mit dem Namen “wikinger-server” die Grundlage.

Vorbereitung

Spätestens jetzt ist der Zeitpunkt gekommen, dem Server eine feste IP-Adresse zuzuweisen. Macht das mit eurem Router/DNS/DHCP aus (Stichwort: “always assign same IP-address” etc.).
Danach setzen wir den FQDN zur korrekten Auflösung unseres Servers:

sudo hostnamectl set-hostname wikinger-server.fritz.box

Die IP-Adresse samt Servernamen setzen wir dann noch im hosts-File des Systems um:

sudo nano /etc/hosts

### IP-Adresse eures Ansible-/Foreman-Servers
192.168.0.2 wikinger-server.fritz.box

Überprüft anschließend den Namen …

hostname -f
wikinger-server.fritz.box

Nun wären wir gut beraten, vor der Installation noch ein System Update durchzuführen …

sudo apt-get update && sudo apt-get upgrade

Ist das auch erledigt, starten wir die Maschine einmal durch

sudo reboot

Installation von Foreman

Okay, die Formalien wären damit erledigt und es geht ans eingemachte. Wir machen unsere APT Datenbank mit den Paketquellen von Foreman vertraut. Sucht euch unter der Adresse http://deb.theforeman.org/ bitte eure jeweilige Version heraus. Im folgenden werde ich die Ubuntu 20.04 (Codename “focal”) mit der Foreman Version 3.0 und das dazugehörige Plugin-Repository auswählen und anschließend den GPG-Key einspielen.

### Foreman APT repo für Ubuntu 20.04
echo "deb http://deb.theforeman.org/ focal 3.0" | \
sudo tee /etc/apt/sources.list.d/foreman.list

### Foreman Plugin repo für Ubuntu 20.04
echo "deb http://deb.theforeman.org/ plugins 3.0" | \
sudo tee -a /etc/apt/sources.list.d/foreman.list

### Foreman GPG-Key
wget -q https://deb.theforeman.org/pubkey.gpg -O- | \
sudo apt-key add -

Betankt mit den neuen Paketquellen aktualisieren wir den Cache und installieren den “foreman-installer”:

sudo apt update
sudo apt -y install foreman-installer

Schlägt euch nun ein Fehler entgegen der eine gewisse Puppet Abhängigkeit nicht auflösen kann (wie bei mir), zieht ihr euch zusätzlich noch die aktuelle Puppet-Version ins APT-Repository, aktualisiert abermals den Cache und führt anschließend den foreman-installer erneut aus:

### Hier achtet ihr bitte wieder auf das Release eurer jeweiligen Distribution
sudo wget https://apt.puppetlabs.com/puppet7-release-focal.deb
sudo dpkg -i puppet7-release-focal.deb
sudo apt-get update -y
sudo apt -y install foreman-installer

Nun ist zwar der Foreman-Installer installiert, aber nicht Foreman selbst. Dies übernehmen diverse Puppet-Module (daher auch die zu installierende Abhängigkeit). Ihr könnt die Installation interaktiv vornehmen oder automatisch ablaufen lassen. Da uns die Grundausstattung während der automatischen Installation genügt (installiert wird foreman, foreman-lci, foreman_cli_puppet, configure foreman_proxy, configure puppet und configure foreman_plugin_puppet), kann sie mit …

sudo foreman-installer

… gestartet werden.
Das kann nun eine ganze Weile dauern. Sollte dieser Prozess fehlschlagen, lässt er sich im Anschluss beliebig oft wiederholen. Die Error-Meldungen geben dabei Aufschluss, wo der Schuh drückt. Abschließend sollte in etwa folgende Zusammenfassung präsentiert werden:

Notiert euch bitte das gezeigte Passwort gut!

Die freundliche Einladung für die Foreman Oberfläche nehmen wir dankend an und besuchen die gezeigte Adresse die folgendermaßen aussehen sollte:

Die Anmeldemaske überwunden präsentiert sich uns eine Oberfläche mit vielen Funktionen. Unser erster Tatort soll die Auflistung der Hosts sein und findet sich unter “Hosts” -> “Alle Hosts”.

Leider noch ziemlich nackig …

Das wollen wir ändern. Behilflich dabei sein wird uns das Ansible-Plugin. Im folgenden werde ich auf die Installation des Plugins mit der Ansible Version 2.5 oder höher eingehen.
Wir weisen Ansible an, als Callback Methode foreman zu benutzen. Hierzu schauen wir uns in der Datei /etc/ansible/ansible.cfg nach der Kategorie “[defaults]” um und geben ihr den folgenden Eintrag mit:

nano /etc/ansible/ansible.cfg

### Innerhalb der Kategorie [defaults]
[defaults]
callback_whitelist = foreman

Außerdem erstellen wir eine weitere Kategorie, die wir innerhalb derselben Datei am Ende einfügen und dort die URL, das Zertifikat vom kürzlich dazuinstallierten Puppetserver, dem Private Key vom Puppetserver und das Zertifikat der Zertifizierungsstelle vom Puppetserver angeben:

[callback_foreman]
url = 'https://wikinger-server.fritz.box'
ssl_cert = /etc/puppetlabs/puppet/ssl/certs/wikinger-server.fritz.box.pem
ssl_key = /etc/puppetlabs/puppet/ssl/private_keys/wikinger-server.fritz.box.pem
verify_certs = /etc/puppetlabs/puppet/ssl/certs/ca.pem

Möglicherweise liegen die Dateien bei euch in einem anderen Verzeichnis. Durchsucht in dem Fall euer Dateisystem und passt die Pfade entsprechend an.

Installation des Plugins

Nun ist es Zeit das Ansible-Plugin zu installieren. Dies erledigt ihr hiermit:

sudo foreman-installer --enable-foreman-plugin-remote-execution --enable-foreman-proxy-plugin-remote-execution-ssh
sudo foreman-installer --enable-foreman-plugin-ansible --enable-foreman-proxy-plugin-ansible

Sollte euch der Fehler ‘ERROR: Unrecognized option ‘–enable-foreman-proxy-plugin-remote-execution-ssh”‘ entgegen schlagen, gebt alternativ diesen ein:

sudo foreman-installer --enable-foreman-proxy-plugin-remote-execution-script

Sollten Fehler auftreten, können diese ausgemerzt und der Installer jederzeit erneut ausgeführt werden.

Clients in Foreman integrieren

Damit hätten wir die Voraussetzungen geschaffen, unsere Clients in die Foreman Oberfläche zu überführen. Es muss nur noch die Anweisung erteilt werden, dies tatsächlich zu tun.
Beim Ausführen von Playbooks lassen sich mit Ansible (ähnlich wie Puppet auch) sogenannte “Fakten” sammeln. Diese Fakten beinhalten z.B. IP-Adresse, Hostname, verwendetes OS, MAC-Adressen der Netzwerkkarten, Partitionierung (und so weiter) der kontakrierten Maschine. Um an diese Fakten zu gelangen, erstellen wir uns nun ein eigens dafür vorgesehenes Playbook:

nano /etc/ansible/playbooks/fakten_sammeln.yml

---
- name: "Host-Fakten sammeln"
  gather_facts: true
  hosts: vm-clients
  tasks:

Dieser 5-Zeiler macht nichts anderes, als sich auf die Zielmaschinen der Gruppe “vm-clients” zu verbinden und dort ein paar Fakten einzusammeln (seit meinem letzten Beitrag habe ich den Gruppennamen geändert und ihr eine weitere Maschine hinzugefügt).

Führen wir das Playbook aus …

sudo ansible-playbook /etc/ansible/playbooks/fakten_sammeln.yml

… und ein weiterer Blick auf die Foreman-Oberfläche offenbart bereits das Resultat:

Nun erhalten wir jedes mal wenn wir dieses Playbook ausführen (oder ein anderes Playbook welches sich ebenfalls an den Fakten bedient), eine Aktualisierung der Werte. Falls die Maschine noch gar nicht vorhanden war, wird sie neu angelegt.
Klicken wir auf eine dieser Maschinen, gelangen wir auf eine Übersichtsseite und können weitere Details einsehen bzw. Aktionen für sie ausführen.

Diese Oberfläche dient zu diesem Zeitpunkt allerdings lediglich einer grafischen Übersicht. Um die Maschinen innerhalb Foremans zu konfigurieren, sind weitere Schritte notwendig, wie das Anlegen und Zuweisen von sogenannten Rollen. Dies wird allerdings erst in einem möglichen dritten Beitrag über Ansible erläutert. Wie gewohnt können die Maschinen jedoch weiterhin über die Kommandozeile bedient werden.

Automatische Inventarisierung

Zum Abschluss möchte ich noch auf eine Möglichkeit eingehen, Ansibles Inventar automatisiert unter bestimmter Voraussetzung mit Clients zu befüllen. Leider ist diese Methode davon abhängig, dass die Clients ein festes Namensschema mit fortlaufender Nummerierung aufweisen. Treffen diese Kriterien zu, lassen sich hinzukommende Maschinen automatisch in Ansibles Verwaltung einpflegen.
Legt sicherheitshalber zuallererst eine Kopie der derzeitigen Host-Datei an.

cp /etc/ansible/hosts /etc/ansible/hosts_KOPIE

Danach legen wir uns einen weiteren Unterordner in Ansible Ordnerstruktur an …

mkdir /etc/ansible/config

… und erstellen dort die Datei …

nano /etc/ansible/config/inventar_erstellen.sh

… mit folgendem Inhalt:

#!/bin/bash

cat > /etc/ansible/hosts <<EOF
###########################
#                                                                  #
#               Main Ansible Hosts File               #
#                                                                  #
###########################
EOF

echo -e "\n### Sonstige Maschinen" >> /etc/ansible/hosts
echo "[server]" >> /etc/ansible/hosts
echo "wikinger-server" >> /etc/ansible/hosts

echo -e "\n### Virtuelle Clients" >> /etc/ansible/hosts
echo "[vm-clients]" >> /etc/ansible/hosts
for f in wikinger-client-{001..010}; do
  if $(ping -c 1 -W 2 $f &> /dev/null);then
    echo $(ping -c 1 -W 2 $f | sed '2q;d' | awk '{print $4}') >> /etc/ansible/hosts
  fi
done

Zu beachten sind hier folgende 2 Punkte:

  1. Da Ansibles Hosts Datei mit diesem Skript ständig neu generiert und überschrieben wird, werden auch alle manuell eingetragenen Gruppen, Hosts und Parameter überschrieben. Abhilfe schafft der Block in Zeile 11-13, der Maschinen mit z.B. festem Namen mitschreibt. In diesem Beispiel wird die Gruppe “[server]” mit dem Mitglied “wikinger-server” angelegt. Um weitere Mitglieder hinzuzufügen, müssen entsprechende Zeilen hinzugefügt werden. Ebenso, wie wenn neue Gruppen hinzugefügt werden sollen.
  2. Innerhalb der For-Schleife der Zeile 17 werden per regex die Clients “wikinger-client-001”- “wikinger-client-010” gesucht und in die Gruppe “Virtuelle Clients” gesteckt. Passt hier die Werte entsprechend eurer eigenen Infrastruktur und Namensgebung an.

Macht die Datei ausführbar und führt sie aus:

chmod +x /etc/ansible/config/inventar_erstellen.sh
/etc/ansible/config/inventar_erstellen.sh

Das Ergebnis sieht in etwa folgendermaßen aus:

Diese Art der Inventarisierung ist lediglich ein Vorschlag, der übernommen, in abgewandelter Form benutzt oder gänzlich links liegen gelassen werden.

2 Kommentare zu „Ansible / Teil 2 – Foreman als GUI“

    1. Hi Marici,
      vielen Dank für die Anmerkung. Grundsätzlich sammelt Ansible (sofern nicht anders eingerichtet) die Fakten durch ein ausgeführtes Playbook automatisch ein.
      Aber du hast natürlich Recht, ein gesondertes ‘gather_facts’ kann in diesem Fall natürlich nicht schaden. Ich habe es im Beitrag entsprechend ergänzt.

      Skol

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen