Ansible: Installation und Einstieg

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.