Das Ansible-Projekt wurde 2012 gestartet und hat sich seitdem zu einer der, wenn nicht der führenden Automatisierungslösung entwickelt. Das System ist sehr einfach zu installieren und zu handhaben. Diese Reihe von Artikeln soll den Einstieg in Ansible erleichtern und durch die ersten Schritte führen. Allerdings soll hier nur die CLI-Bedienung betrachtet werden, Grafische Oberflächen, wie Ansible Tower oder AWS sind daher ‘out of scope’.
Geht man von einem installierten Linux-System aus, ist die Installation sehr einfach.
Es braucht lediglich das Paket ansible installiert werden:
- Debian/Ubuntu: apt install ansible - RedHat etc: dnf install ansible bei älteren Distros muss hier vorher noch das epel-release installiert werden. - SuSE: zypper install ansible
Die einfachste Variante zu prüfen ob die Installation geklappt hat ist der Berfehl ansible –version
Die darauf folgende Ausgabe enhält alle relevanten Konfigurations- und Versionsinformationen.
[root@ansible ~]# ansible --version ansible 2.9.21 config file = /etc/ansible/ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.9/site-packages/ansible executable location = /usr/bin/ansible python version = 3.9.5 (default, May 14 2021, 00:00:00) [GCC 11.1.1 20210428 (Red Hat 11.1.1-1)]
Der nächste Schritt besteht jetzt darin, Ansible die Zugriffsparameter für die Systeme bekannt zu machen, auf die zugegriffen werden soll. Diese Werte werden im Config-File und in der Datei hosts eingetragen. Zuerst wird also in /etc/ansible/ansible.cfg editiert.
Im ersten Schritt wird die Variable inventory gesetzt, die die weiteren Gruppierungen enthält.
inventory = /etc/ansible/hosts
Nachdem dieser Eintrag gemacht in der ansible.cfg gemacht ist kann sie gespeichert und verlassen werden.
Weiter geht es in der Datei /etc/ansible/hosts mit der Definition der Ziel-Systeme.
Die Struktur dabei st sehr einfach. Eine Sektion in eckigen Klammer enthält den Gruppennamen gefolgt von den IPs und/oder DNS-Namen der Ziel-Hosts. Die Folgesektion mit Namen:vars enhält spezifische Infos wie Usernamen, Passworten (sofern man nicht den Passwort-Vault verwendet), Key-Exchange-Infos wie sieauch beim Zugriff auf Cisco-Devices beötigt werden etc.
[TEST] 172.16.199.222 172.16.199.223 [TEST:vars] ansible_user=ansible ansible_password=AnSiBLE3210
In diesem Beispiel könnte man mit einem Ansible-Befehl entweder einen enzelnen Host durch direkte Angabe der IP ansprechen oder gleich die gesamte Gruppe durch nennung des Gruppennamen.
Ein Ping-Test eines einzelnen Hosts oder der gesamten Test-Gruppe kann wie folgt durchgeführt werden:
Ping für einen einzelnen Host: [root@ansible ansible]# ansible 172.16.199.223 -m ping [WARNING]: Platform linux on host 172.16.199.223 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. 172.16.199.223 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" Ping für eine Hostgruppe: [root@ansible ansible]# ansible TEST -m ping [WARNING]: Platform linux on host 172.16.199.223 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. 172.16.199.223 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } [DEPRECATION WARNING]: Distribution fedora 34 on host 172.16.199.222 should use /usr/bin/python3, but is using /usr/bin/python for backward compatibility with prior Ansible releases. A future Ansible release will default to using the discovered platform python for this host. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. This feature will be removed in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg. 172.16.199.222 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong"
Der Parameter -m definiert das zu verwendende Modul, hier also ping. Wird stattdessen das Command-Modul verwendet lassen sich auch Befehle ausführen, wie im nächsten Beispiel gezeigt:
[root@ansible ansible]# ansible TEST -m command -a "ip address show" [WARNING]: Platform linux on host 172.16.199.223 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. 172.16.199.223 | CHANGED | rc=0 >> 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether e2:43:52:59:7c:7b brd ff:ff:ff:ff:ff:ff inet 172.16.199.223/24 brd 172.16.199.255 scope global dynamic ens18 valid_lft 3963sec preferred_lft 3963sec inet6 fe80::e043:52ff:fe59:7c7b/64 scope link valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:70:70:26:9a brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever [DEPRECATION WARNING]: Distribution fedora 34 on host 172.16.199.222 should use /usr/bin/python3, but is using /usr/bin/python for backward compatibility with prior Ansible releases. A future Ansible release will default to using the discovered platform python for this host. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. This feature will be removed in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg. 172.16.199.222 | CHANGED | rc=0 >> 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 66:74:cb:65:24:17 brd ff:ff:ff:ff:ff:ff altname enp0s18 inet 172.16.199.222/24 brd 172.16.199.255 scope global dynamic noprefixroute ens18 valid_lft 7011sec preferred_lft 7011sec inet6 fe80::6474:cbff:fe65:2417/64 scope link noprefixroute valid_lft forever preferred_lft forever
Hier wird das Command-Modul angezogen (-m command) und der mit -a definierte Befehl ausgeführt. Da das Command-Modul sehr häufig genutzt wird, kann es auch einfach ausgelassen werden. ansible TEST -a “ip address show” würde also das selbe bewirken.
Natürlich kann Ansible nicht nur interaktiv aufgerufen werden. Um verkettete Aufgaben auf mehreren Systemen durchführen zu können gibt es Playbooks. Die Erstellung und Verwendung von Playbooks folgt in einem eigenen Artikel.