{"id":208,"date":"2021-05-05T08:00:00","date_gmt":"2021-05-05T06:00:00","guid":{"rendered":"https:\/\/pascal-korz.de\/blog\/?p=208"},"modified":"2021-04-18T22:33:24","modified_gmt":"2021-04-18T20:33:24","slug":"ansible-in-einer-freeipa-domaene-einrichten","status":"publish","type":"post","link":"https:\/\/pascal-korz.de\/blog\/2021\/05\/05\/ansible-in-einer-freeipa-domaene-einrichten\/","title":{"rendered":"Ansible in einer FreeIPA-Dom\u00e4ne einrichten"},"content":{"rendered":"\n<p><a href=\"https:\/\/www.ansible.com\/\">Ansible<\/a> ist eine Automatisierungsl\u00f6sung zum Configuration Management und Software Deployment (und eigentlich alles, was mit automatisierten Aufgaben zu tun hat), die im Gegensatz zu bekannten L\u00f6sungen wie SCCM, Baramundi oder Empirum nicht auf einen Client oder Agent auf dem entfernten Rechner angewiesen ist, sondern push-basiert \u00fcber SSH auf entfernte Rechner zugreift. Um wiederkehrende Aufgaben auszuf\u00fchren, schreibt man sogenannte Playbooks, die bei Bedarf immer wieder ausgef\u00fchrt und kombiniert werden k\u00f6nnen. Ehemals langwierige Flei\u00dfarbeiten werden so in Sekundenschnelle erledigt.<\/p>\n\n\n\n<p>Mein Ansible-Server basiert wie die anderen Server in meiner Dom\u00e4ne auf CentOS 7, aber grunds\u00e4tzlich 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.<\/p>\n\n\n\n<div class=\"wp-block-group has-green-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>Diese Anleitung steht f\u00fcr sich alleine, kn\u00fcpft aber manchmal an folgende Beitr\u00e4ge an:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" href=\"https:\/\/pascal-korz.de\/blog\/2018\/12\/08\/freeipa-installation-eines-domain-controllers\/\" data-type=\"post\" data-id=\"130\" target=\"_blank\">FreeIPA: Installation eines Domain Controllers<\/a><\/li><li><a href=\"Multi-Master-Umgebung (Replica)\" data-type=\"URL\" data-id=\"FreeIPA: Multi-Master-Umgebung (Replica)\" target=\"_blank\" rel=\"noreferrer noopener\">FreeIPA: Multi-Master-Umgebung (Replica)<\/a><\/li><\/ul>\n<\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">1. Installation des Control Node<\/h3>\n\n\n\n<p>Ich erstelle eine virtuelle Maschine mit folgenden Werten:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hostname: cgn-ansible01.ipa.animentor.de\nDNS-Server: 192.168.111.10; 192.168.111.11\nGateway: 192.168.111.1<\/code><\/pre>\n\n\n\n<p>Der Server soll genau wie alle anderen Rechner im Netzwerk ein Mitglied der Dom\u00e4ne werden. Dazu installiere ich, wie ein fr\u00fcherer Beitrag der Reihe erkl\u00e4rt, den FreeIPA-Client. Damit f\u00fcr Dom\u00e4nenbenutzer ein Benutzerverzeichnis auf dem Server angelegt wird, muss der FreeIPA-Client daf\u00fcr konfiguriert werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo authconfig --enablemkhomedir --update<\/code><\/pre>\n\n\n\n<p>Um eine j\u00fcngere 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\u00f6tig sein:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo yum install epel-release<\/code><\/pre>\n\n\n\n<p>Nun wird Ansible aus den Paketquellen installiert:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo yum install ansible<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. Ansible-Inventory erstellen<\/h3>\n\n\n\n<p>Es ist sinnvoll, die Rechner im Netzwerk zu gruppieren. Bei SCCM w\u00fcrde man von Ger\u00e4tesammlungen 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 <code>\/etc\/ansible\/hosts<\/code> gef\u00fchrt wird. Standardm\u00e4\u00dfig ist das Schema wie folgt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;gruppennameA]\nhostname1\nhostname2\n...\n&#91;gruppennameB]\nhostname3\nhostname4\n...<\/code><\/pre>\n\n\n\n<p>Da meine FreeIPA-Dom\u00e4ne bereits Host-Gruppen pflegt, halte ich es nicht f\u00fcr verkehrt, mich daran zu orientieren. So k\u00f6nnte eine Ansible-Gruppe im Inventory so aussehen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;ipaservers]\ncgn-ipa01.ipa.animentor.de\ncgn-ipa02.ipa.animentor.de<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. SSH-Zugriff f\u00fcr Ansible einrichten<\/h3>\n\n\n\n<p>Jetzt fehlt nur noch eine geeignete M\u00f6glichkeit, 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\u00e4nenweiten Ansible-Benutzer anzulegen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Vorname: Ansible\nNachname: SSH\nAnmeldename: ansible.ssh<\/code><\/pre>\n\n\n\n<p>Das kann man \u00fcber das Webinterface oder \u00fcber die folgenden Befehle tun:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kinit admin\nipa user-add<\/code><\/pre>\n\n\n\n<p>Der frisch angelegte Benutzer hat noch kein Passwort (wenn keines explizit vergeben wurde), darum kann man noch kein Kerberos-Ticket f\u00fcr ihn mit kinit bekommen und kann ihn auch noch nicht f\u00fcr SSH-Verbindungen zu den Rechnern verwenden. Daher erm\u00f6gliche ich dem Benutzer die Anmeldung, indem ich ihm ein Startpasswort vergebe, das er bei der ersten Anmeldung, zum Beispiel \u00fcber SSH, \u00e4ndern muss:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ipa user-mod ansible.ssh --password<\/code><\/pre>\n\n\n\n<p>Der SSH-Zugriff selber ist wegen der standardm\u00e4\u00dfig aktivierten Host-Based-Access-Control-Regel namens allow_all allen Benutzern von allen Rechnern auf alle Rechner der Dom\u00e4ne erlaubt. Sp\u00e4ter wird dieser Zugriff eingeschr\u00e4nkt, aber der Ansible-Benutzer ist erst einmal einsatzbereit.<\/p>\n\n\n\n<p>Zuerst wird die SSH-Verbindung mit dem Benutzer getestet, zum Beispiel zum Ansible-Server selber. Im Zuge dessen wird ein neues Passwort vergeben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh ansible.ssh@192.168.111.15<\/code><\/pre>\n\n\n\n<p>Damit der Ansible-Benutzer in zuk\u00fcnftigen Playbook-Skripts automatisch, ohne Passworteingabe, aber trotzdem sicher SSH-Verbindungen zu entfernten Rechnern aufbauen kann, erstelle ich mit dem Ansible-Benutzer ein SSH-Schl\u00fcsselpaar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-keygen -t rsa -b 4096<\/code><\/pre>\n\n\n\n<p>Der private Schl\u00fcssel wird standardm\u00e4\u00dfig in der Datei <code>~\/.ssh\/id_rsa<\/code> gespeichert. Mithilfe des privaten Schl\u00fcssels kann sich der Ansible-Benutzer auf jedem Rechner ohne Passwort anmelden, auf dem sein \u00f6ffentlicher Schl\u00fcssel bekannt ist. Noch ist er nirgendwo bekannt. Aber der Dienst SSSD, der Bestandteil des FreeIPA-Clients ist, kann stattdessen die \u00f6ffentlichen SSH-Schl\u00fcssel von FreeIPA-Benutzern auf den FreeIPA-Servern suchen und zwischenspeichern: So m\u00fcssen \u00f6ffentliche Schl\u00fcssel nicht auf jeden einzelnen Rechner kopiert werden. Dazu muss der \u00f6ffentliche Schl\u00fcssel in die Benutzerinformationen hochgeladen werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ipa user-mod ansible.ssh --sshpubkey \"$(cat \/home\/ansible.ssh\/.ssh\/id_rsa.pub)\"<\/code><\/pre>\n\n\n\n<p>Als auf dem Ansible-Server angemeldeter Ansible-Benutzer ist es jetzt m\u00f6glich, eine SSH-Verbindung zu anderen Rechnern in der FreeIPA-Dom\u00e4ne herzustellen, ohne ein Passwort einzugeben. Testen l\u00e4sst sich das zum Beispiel mit einer SSH-Verbindung vom Ansible-Server zu einem FreeIPA-Server:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh ansible.ssh@192.168.111.10<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Ansible ist eine Automatisierungsl\u00f6sung zum Configuration Management und Software Deployment (und eigentlich alles, was mit automatisierten Aufgaben zu tun hat), die im Gegensatz zu bekannten L\u00f6sungen wie SCCM, Baramundi oder Empirum nicht auf einen Client oder Agent auf dem entfernten Rechner angewiesen ist, sondern push-basiert \u00fcber SSH auf entfernte Rechner zugreift. Um wiederkehrende Aufgaben auszuf\u00fchren,&hellip; <a class=\"more-link\" href=\"https:\/\/pascal-korz.de\/blog\/2021\/05\/05\/ansible-in-einer-freeipa-domaene-einrichten\/\"><span class=\"screen-reader-text\">Ansible in einer FreeIPA-Dom\u00e4ne einrichten<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":6,"featured_media":468,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,12,8],"tags":[102],"class_list":["post-208","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ansible","category-freeipa","category-linux","tag-artikelreihe-testumgebung","entry"],"_links":{"self":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/comments?post=208"}],"version-history":[{"count":23,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/208\/revisions"}],"predecessor-version":[{"id":476,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/208\/revisions\/476"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/media\/468"}],"wp:attachment":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/media?parent=208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/categories?post=208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/tags?post=208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}