Ansible in einer FreeIPA-Domäne einrichten

Veröffentlicht am Kategorisiert in Ansible, FreeIPA, Linux Keine Kommentare zu Ansible in einer FreeIPA-Domäne einrichten

Ansible ist eine Automatisierungslösung zum Configuration Management und Software Deployment (und eigentlich alles, was mit automatisierten Aufgaben zu tun hat), die im Gegensatz zu bekannten Lösungen wie SCCM, Baramundi oder Empirum nicht auf einen Client oder Agent auf dem entfernten Rechner angewiesen ist, sondern push-basiert über SSH auf entfernte Rechner zugreift. Um wiederkehrende Aufgaben auszuführen, schreibt man sogenannte Playbooks, die bei Bedarf immer wieder ausgeführt und kombiniert werden können. Ehemals langwierige Fleißarbeiten werden so in Sekundenschnelle erledigt.

Mein Ansible-Server basiert wie die anderen Server in meiner Domäne auf CentOS 7, aber grundsätzlich kann Ansible auf den meisten Linux- und BSD-Distributionen sowie auf Mac OS X installiert werden. Von dort kann Ansible potentiell alle Rechner im Netzwerk, mit Erweiterungen auch Windows-Rechner, verwalten.

Diese Anleitung steht für sich alleine, knüpft aber manchmal an folgende Beiträge an:

1. Installation des Control Node

Ich erstelle eine virtuelle Maschine mit folgenden Werten:

Hostname: cgn-ansible01.ipa.animentor.de
DNS-Server: 192.168.111.10; 192.168.111.11
Gateway: 192.168.111.1

Der Server soll genau wie alle anderen Rechner im Netzwerk ein Mitglied der Domäne werden. Dazu installiere ich, wie ein früherer Beitrag der Reihe erklärt, den FreeIPA-Client. Damit für Domänenbenutzer ein Benutzerverzeichnis auf dem Server angelegt wird, muss der FreeIPA-Client dafür konfiguriert werden:

sudo authconfig --enablemkhomedir --update

Um eine jüngere Ansible-Version als in den Standard-Paketquellen von CentOS 7 einzusetzen, aktiviert man das EPEL-Repository (Extra Packages for Enterprise Linux). Unter anderen Distributionen mag dieser Schritt nicht nötig sein:

sudo yum install epel-release

Nun wird Ansible aus den Paketquellen installiert:

sudo yum install ansible

2. Ansible-Inventory erstellen

Es ist sinnvoll, die Rechner im Netzwerk zu gruppieren. Bei SCCM würde man von Gerätesammlungen sprechen: Mitglieder verschiedener Gruppen oder Container sollen verschieden behandelt werden. Ein Rechner kann Mitglied mehrerer Gruppen sein. Dasselbe Prinzip gilt auch hier: Ansible richtet nach sich nach einem sogenannten Inventory, das in der Datei /etc/ansible/hosts geführt wird. Standardmäßig ist das Schema wie folgt:

[gruppennameA]
hostname1
hostname2
...
[gruppennameB]
hostname3
hostname4
...

Da meine FreeIPA-Domäne bereits Host-Gruppen pflegt, halte ich es nicht für verkehrt, mich daran zu orientieren. So könnte eine Ansible-Gruppe im Inventory so aussehen:

[ipaservers]
cgn-ipa01.ipa.animentor.de
cgn-ipa02.ipa.animentor.de

3. SSH-Zugriff für Ansible einrichten

Jetzt fehlt nur noch eine geeignete Möglichkeit, Ansible auf den entfernten Rechnern walten zu lassen. Wenn wir ein zentrales Identity Management mit FreeIPA haben, spricht nichts dagegen, es auch zu nutzen und einen domänenweiten Ansible-Benutzer anzulegen:

Vorname: Ansible
Nachname: SSH
Anmeldename: ansible.ssh

Das kann man über das Webinterface oder über die folgenden Befehle tun:

kinit admin
ipa user-add

Der frisch angelegte Benutzer hat noch kein Passwort (wenn keines explizit vergeben wurde), darum kann man noch kein Kerberos-Ticket für ihn mit kinit bekommen und kann ihn auch noch nicht für SSH-Verbindungen zu den Rechnern verwenden. Daher ermögliche ich dem Benutzer die Anmeldung, indem ich ihm ein Startpasswort vergebe, das er bei der ersten Anmeldung, zum Beispiel über SSH, ändern muss:

ipa user-mod ansible.ssh --password

Der SSH-Zugriff selber ist wegen der standardmäßig aktivierten Host-Based-Access-Control-Regel namens allow_all allen Benutzern von allen Rechnern auf alle Rechner der Domäne erlaubt. Später wird dieser Zugriff eingeschränkt, aber der Ansible-Benutzer ist erst einmal einsatzbereit.

Zuerst wird die SSH-Verbindung mit dem Benutzer getestet, zum Beispiel zum Ansible-Server selber. Im Zuge dessen wird ein neues Passwort vergeben:

ssh ansible.ssh@192.168.111.15

Damit der Ansible-Benutzer in zukünftigen Playbook-Skripts automatisch, ohne Passworteingabe, aber trotzdem sicher SSH-Verbindungen zu entfernten Rechnern aufbauen kann, erstelle ich mit dem Ansible-Benutzer ein SSH-Schlüsselpaar:

ssh-keygen -t rsa -b 4096

Der private Schlüssel wird standardmäßig in der Datei ~/.ssh/id_rsa gespeichert. Mithilfe des privaten Schlüssels kann sich der Ansible-Benutzer auf jedem Rechner ohne Passwort anmelden, auf dem sein öffentlicher Schlüssel bekannt ist. Noch ist er nirgendwo bekannt. Aber der Dienst SSSD, der Bestandteil des FreeIPA-Clients ist, kann stattdessen die öffentlichen SSH-Schlüssel von FreeIPA-Benutzern auf den FreeIPA-Servern suchen und zwischenspeichern: So müssen öffentliche Schlüssel nicht auf jeden einzelnen Rechner kopiert werden. Dazu muss der öffentliche Schlüssel in die Benutzerinformationen hochgeladen werden:

ipa user-mod ansible.ssh --sshpubkey "$(cat /home/ansible.ssh/.ssh/id_rsa.pub)"

Als auf dem Ansible-Server angemeldeter Ansible-Benutzer ist es jetzt möglich, eine SSH-Verbindung zu anderen Rechnern in der FreeIPA-Domäne herzustellen, ohne ein Passwort einzugeben. Testen lässt sich das zum Beispiel mit einer SSH-Verbindung vom Ansible-Server zu einem FreeIPA-Server:

ssh ansible.ssh@192.168.111.10

Von Pascal Korz

IT Systems Engineer in und aus dem schönen Köln

Schreibe einen Kommentar

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