Meine Top 4 Ansible Module
Durch meine zahlreichen Ansible Beiträge sollte bereits klar geworden sein, dass ich dieses Tool gerne und häufig nutze. Eine der großen Stärken von Ansible ist die unglaubliche Vielfalt an Modulen die es mittlerweile gibt, sowohl Herstellerseitig, als auch aus der Community.
In diesem Beitrag soll es nun um meine persönliche Top 4 der Ansible-Module gehen, die ich als am nützlichen betrachte und am liebsten benutze.
ansible.builtin.apt / ansible.builtin.yum
Selbstverständlich wurde den beiden prominenten Paketverwaltungs-Tools APT und YUM, genannt ansible.builtin.apt bzw. ansible.builtin.yum, ein eigenes Ansible-Modul spendiert. Mit ihrer Hilfe ist es nicht nur möglich, die Zielmaschinen auf dem neuesten Update-Stand zu halten, sondern auch neue Pakete zu installieren oder zu deinstallieren. Dabei beinhalten diese Module auch auch noch zahlreiche weitere Funktionen, wie die Auffrischung des Paket-Caches (update_cache: yes), die Löschung nicht mehr benötigter Abhängigkeiten (autoremove: yes), die Installation bestimmter Programmversionen (name: nginx=1.18.0) oder die Verwendung spezieller Repository-Ressourcen (deb: https://example.com/python-ppq_0.1-1_all.deb). Dabei ist die YAML-Syntax beider Module tatsächlich identisch, lediglich die einleitende Angabe des Modul-Namens unterscheidet sich logischerweise.
Als einziger Wermutstropfen ist mir aufgefallen, dass es mit keinem der beiden Modulen möglich, ein komplettes Betriebssystem-Upgrade (also beispielsweise die Aktualisierung der LTS Version) durchzuführen. Dies würde aber wohl ohnehin den Rahmen der Funktionalität sprengen.
Es folgt eine Beispiel-Syntax zur Installation zweier Pakete mit aktualisiertem Pakete-Cache:
### Für APT
- name: Install a list of packages
ansible.builtin.apt:
pkg:
- foo
- foo-tools
update_cache: yes
### Für YUM
- name: Install a list of packages
ansible.builtin.yum:
pkg:
- foo
- foo-tools
update_cache: yes
Link zur Dokumentation:
APT: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/apt_module.html
YUM: https://docs.ansible.com/ansible/9/collections/ansible/builtin/yum_module.html
ansible.builtin.user
Die Benutzerverwaltung darf natürlich auch bei Ansible nicht zu kurz kommen und so hält das Modul ansible.builtin.user ein paar schöne Funktionen für uns parat. Neben dem gewöhnlichen Anlegen eines Benutzers samt Gruppenzugehörigkeit (groups: admins,developers / append: yes), UID / GID und Login-Shell (shell: /bin/bash) können wir dem System auch gleich noch mitgeben, dass dieser Account doch bitte nur einen bestimmten Zeitraum gültig sein soll (expires: 1422403387 -> Das ist diese komische Unix-Time Schreibweise) und der Benutzer ein paar Tage vor Ablauf seiner Frist doch bitte zuvor noch gewarnt werden soll (password_expire_warn: 30). Eine besonders tolle Funktion ist außerdem die Setzung eines neuen Passwortes:
- name: Set new password for user urmel
ansible.builtin.user:
name: urmel
update_password: always
password: "{{ newpassword|password_hash('sha512') }}"
### Anschließend ruft ihr das Playbook in etwa folgendermaßen auf:
ansible-playbook ./<Name des Playbooks> --extra-vars newpassword='neues_passwort'
Das Anlegen eines neuen Benutzers urmel, samt Kommentar, spezieller UID und der primären Gruppe admin mit Hilfe dieses Moduls sähe folgendermaßen aus:
- name: Add the user 'johnd' with a specific uid and a primary group of 'admin'
ansible.builtin.user:
name: urmel
comment: Dies ist einfach nur irgendein Kommentar zum Benutzer
uid: 1040
group: admin
Link zur Dokumentation:
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/user_module.html
community.general.ufw
In einem der vorangegangenen Beiträgen bin ich auf die Administration der UFW (uncomplicated firewall) eingegangen. Ansible hält auch hierfür ein (Community-)Modul bereit. Mit dessen Hilfe können wir im Handumdrehen ganze Firewall-Konfigurationen ausrollen. Dies inkludiert die Aktivierung der Firewall (state: enabled), und dem zulassen (policy: allow) oder verweigern (policy: deny) sämtlichen Datenverkehrs. Limitierungen der Login-Anzahl innerhalb kürzester Zeit lassen sich einrichten (rule: limit / port: ssh / proto: tcp) um beispielsweise Brute-Force Attacken vorzubeugen. Natürlich sind auf die Grundfunktionen enthalten, wie das zulassen oder blockieren einzelner Ports (rule: allow bzw. rule: deny / port: 22) und in welche Richtung diese Restriktion geschehen soll (direction: in bzw. direction: out).
Als kleiner Tipp noch am Rande: Falls ihr mehrere Ports in einem Block zulassen oder blockieren wollt gibt es die Möglichkeit eine Schleife anzuwenden:
- name: Enable some ports
community.general.ufw:
rule: allow
port: '{{ item }}'
proto: typ
loop:
- '22'
- '443'
Link zur Dokumentation:
https://docs.ansible.com/ansible/latest/collections/community/general/ufw_module.html
ansible.builtin.shell
Durch die endlose Anzahl an Anwendungsfällen im Linux-Umfeld, kann es unmöglich ein Modul für jede zu erledigende Aufgabe geben. Deswegen möchte ich zu guter Letzt noch ein nützliches wie simples Modul vorstellen, welches nichts anderes macht, als einfach nur Shell-Befehle auf der Zielmaschine auszuführen. Das ansible.builtin.shell dabei nicht allzu viele Optionen bietet, stört dabei wenig. Wir können vor Ausführung des Befehls lediglich noch in ein anderes Verzeichnis wechseln (chdir: somedir/), den Befehl nur dann ausführen, wenn auch eine bestimmte Datei existiert (creates: somelog.txt) oder die Shell mitgeben, die den Befehl ausführen soll (executable: /bin/bash).
- name: Lade und wende Kernel-Parameter aus der Datei '/etc/sysctl.conf' an und verwende dabei die Bash-Shell
ansible.builtin.shell: sysctl -p /etc/sysctl.conf
args:
executable: /bin/bash
Link zur Dokumentation:
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/shell_module.html
Bildquellen:
Bild von OpenClipart-Vectors auf Pixabay