.. _ansible: .. _Konfigurations-Verwaltung mittels ansible: Konfigurations-Verwaltung mittels ``ansible`` ============================================= `Ansible `__ ist ein Konfigurations-Verwaltungs-Programm, mit dessen Hilfe es möglich ist, von einem Computer aus Installations- und Konfigurations-Routinen simultan auf beliebig vielen anderen Rechnern auszuführen. Die Voraussetzung dafür ist lediglich, dass der auf dem Tower angemeldete Benutzer sich via :ref:`SSH ` auf den anderen Rechnern anmelden kann und dort gegebenenfalls SuperUser-Rechte bekommen kann. Auf den Clients selbst muss keine weitere Software installiert werden. .. _Tower: Der grundlegende Workflow von Ansible ist also folgender: * Auf einem Hauptrechner ("Tower") werden einzelne Routinen ("Tasks") definiert, die dann auf den Zielrechnern ("Hosts") ausgeführt werden sollen. * Die einzelnen Hosts werden beim Aufruf von Ansible via :ref:`SSH ` kontaktiert. Anstelle der manuellen Eingabe von Passwörtern werden dabei meist :ref:`SSH-Schlüssel ` verwendet. Ein Vorteil von Ansible ist es, dass es erst die vorliegenden Bedingungen prüft, bevor es irgendwelche Routinen aufruft. Sind beispielsweise die gewünschten Programme bereits installiert oder die entsprechenden Konfigurationsdateien angepasst, so bedeutet dies, dass ein erneuter Aufruf einer Ansible-Task keine weiteren Veränderungen mit sich bringt (beispielsweise kann so vermieden werden, dass Server-Dienste erneut gestartet werden, wenn sie bereits aktiv sind). Unter Debian/Ubuntu/LinuxMint kann Ansible folgendermaßen installiert werden: .. code-block:: sh sudo aptitude install ansible .. _Zielserver festlegen: Zielserver festlegen -------------------- Nach der Installation befindet sich in der Konfigurationsdatei ``/etc/ansible/hosts`` eine Beispiel-Liste von Servern, auf denen Installationen beziehungsweise Konfigurationen vorgenommen werden sollen. Die einzelnen Ziel-Rechner können optional (mittels einer einfachen `YAML `__-Syntax) gruppiert und mit einem Label versehen werden. Eine solche Server-Liste kann beispielsweise folgendermaßen aussehen: .. code-block:: yaml [myweb] 192.168.2.11 192.168.2.12 .. Mit dieser einfachen Form können alle aufgelisteten Netzwerk-Adressen unter der .. Sammel-Bezeichnung ``servers`` angesprochen werden; im realen Einsatz müssen die .. obigen Netzwerk-Adressen durch die tatsächlichen Netzwerk-Adressen ersetzt .. werden. Für die Festlegung der Zielrechner und der einzelnen Tasks ist es empfehlenswert, ein eigenes lokales Verzeichnis anzulegen, das auch ohne SuperUser-Rechte verwaltet werden kann: .. code-block:: sh mkdir ~/ansible cp /etc/ansible/hosts ~/ansible/hosts Beim Aufruf von ``ansible`` kann der Pfad der gewünschten Hosts-Datei mittels der Option ``-i hostfile`` explizit angegebenen werden. Möchte man allerdings, dass Ansible standardmäßig auf die Host-Datei im Verzeichnis ``~/ansible`` zurückgreift, so kann man folgende Zeile in einer Shell eingeben (oder diese am Ende der Konfigurationsdatei ``~/.bashrc`` beziehungsweise ``~/.zshrc`` einfügen): .. code-block:: sh export ANSIBLE_HOSTS=~/ansible/hosts Diese Hosts-Datei kann nun auch ohne SuperUser-Rechte nach Belieben angepasst werden. Zu Test-Zwecken kann man beispielsweise auch ein virtuelles Betriebsystem einrichten und die Ansible-Tasks auf diesem ablaufen lassen. Hierzu sollte die Server-Liste um folgenden Eintrag ergänzt werden: .. code-block:: yaml [local] 127.0.0.1 .. Die Adresse ``127.0.0.1`` steht für den Localhost. Auf diese Weise kann man Ansible ausprobieren, ohne Änderungen auf anderen Rechnern durchzuführen. Die Anmeldung auf dem virtuellen Betriebsystem erfolgt allerdings mittels Benutzername und Passwort, nicht mittels SSH-Schlüsseln. .. _Tasks und Playbooks: .. _Task: .. _Playbook: Tasks und Playbooks ------------------- Bei der Verwendung von Ansible wird angegeben, welchen "Status" das Zielsystem haben sollte. Ansible führt dann (und nur dann) einzelne Routinen aus, bis der Soll-Status erreicht ist. Die auszuführenden Tasks können ebenfalls in einer YAML-Datei ('Playbook') abgelegt werden. So kann man beispielsweise eine Datei ``~/ansible/upgrade-servers.yml`` mit folgendem Inhalt anlegen: .. code-block:: yaml - hosts: myweb sudo: true tasks: - name: update apt sources apt: update_cache=yes - name: upgrade apt packages apt: upgrade=yes Hat man Netzwerk-Zugriff auf den/die Host-Computer Netzwerk-Zugriff und kann auf diesen SuperUser-Rechte erlangen, so kann man anschließend Ansible mit folgender Anweisung aufrufen: .. code-block:: sh ansible-playbook ~/ansible/upgrade-server.yml -u -K Durch die Option ``-u`` wird der Benutzer auf dem entfernten Rechner festgelegt, durch die Option ``-K`` wird nach dem jeweiligen Passwort gefragt. .. ansible-playbook update-servers.yml --ask-sudo-pass .. https://techsomnia.net/2013/11/ansible-apt-get-updateupgrade/ .. Ansible unterstützt dabei sowohl das beispielsweise unter Debian, Ubuntu und .. Linux Mint übliche Paketverwaltungs-Programm :ref:`apt ` wie auch den in .. Python geschriebenen Paket-Manager ``yum``. Ansible-Module -------------- Zum Durchführen der einzelnen Tasks bietet Ansible einige Module, die jeweils Funktion für bestimmte Aufgaben bereitstellen. Das wohl einfachste Modul heißt ``command``, und erlaubt das Ausführen einer gewöhnlichen Shell-Anweisung. Auch ohne Definition eines Playbooks kann man dies beispielsweise folgendermaßen nutzen: .. code-block:: sh # Shell-Anweisung via Ansible ausführen: ansible myweb -m command -a "uptime" .. -u root Durch die Option ``-m`` wird ein Modulname angegeben, mit ``-a`` wird ein Kommandozeilen-Argument für dieses Modul übergeben (mittels ``-u username`` könnte zudem wiederum ein Benutzername angegeben werden, mit dem man sich via SSH bei den Zielrechnern anmelden möchte). Anstelle einer einzelnen Anweisung kann man auch ein Shell-Skript mittels Ansible ausführen lassen. Ein solches könnte beispielsweise folgenden Inhalt haben: .. code-block:: sh #!/bin/bash # Filename: script-example.sh uptime echo "Hello World!" Speichert man dieses Mini-Skript als Datei ``script-example.sh``, so kann man das Ansible-Modul ``script`` nutzen, um es auf den Zielrechnern auszuführen: .. code-block:: sh # Shell-Skript via Ansible ausführen: ansible myweb -m script -a script-example.sh Wiederum wird mit der Option ``-m`` der Modulname angegeben, und mit der Option ``-a`` der Name des Skripts als zusätzliches Argument. ... to be continued ... .. rubric:: Links * `Ansible Tutorial (en.) `__ * `Ansible Modules Documentation (en.) `__ * `Ansible Python API (en.) `__ * `Jinja2 Documentation (en.) `__ .. Relevant für Backups!?: .. http://docs.ansible.com/ansible/copy_module.html .. http://docs.ansible.com/ansible/fetch_module.html