Synchronisierung mittels unison und ansible

Unison

Ansible

Ansible ist ein Programm, mit dessen Hilfe man beispielsweise Konfigurations-Dateien gleichzeitig auf beliebig vielen Rechnern aktuell halten kann; man kann sogar ganze Betrieb-Systeme mittels Ansible auf dem jeweils gleichen Stand halten.

Ansible kann mittels apt über das gleichnamige Paket installiert werden:

sudo aptitude install ansible

Der grundlegende Workflow von Ansible ist etwa folgender:

  • Auf einem Hauptrechner („Server“) werden einzelne Vorgänge („Tasks“) definiert, die dann auf den Zielrechnern („Hosts“) ausgeführt werden sollen.
  • Die einzelnen Hosts werden beim Aufruf von Ansible via SSH kontaktiert. Anstelle der manuellen Eingabe von Passwörtern werden dabei meist SSH-Schlüssel verwendet.

Ähnlich wie man sich mit ssh auf einem entfernten Rechner mit einem bestimmten Benutzernamen einloggen und dort Programme aufrufen kann, so kann man dies mittels Ansible tun; dabei kann allerdings zum einen die Festlegung der einzelnen Programm-Aufrufe sehr übersichtlich organisiert werden, zum anderen kann man derartige Task-Listen gleichzeitig vom Server aus auf mehreren Client-Rechnern ausführen lassen.

Jeder Rechner, auf dem Ansible installiert ist, kann als Server Tasks auf beliebig vielen Rechnern ausführen, sofern diese über das Netzwerk erreichbar sind und man sich auf diesen via SSH einloggen kann. Auf Benutzer-Ebene kann dies beispielsweise zur Synchronisierung von Konfigurationsdateien nützlich sein, auf Administrator-Ebene beispielsweise zur parallelen Installation von Programmen auf mehreren Rechnern, zum Neustart von Server-Diensten, usw.

Zur Festlegung der Zielrechner, die auch mit Alias-Namen versehen und/oder zu Gruppen gebündelt werden können, sowie der eigentlichen Verwaltungsaufgaben werden Konfigurationsdateien mit YAML-Syntax verwendet.

Beispiel: Aktualisierungen im lokalen Netzwerk

Mittels Ansible kann man als einfaches Beispiel auf mehreren Rechnern des lokalen Netzwerks eine Aktualisierung der Paketquellen sowie einen Upgrade aller installierten Programme auf die aktuell verfügbare Version erreichen; Ansible unterstützt dabei sowohl das beispielsweise unter Debian, Ubuntu und Linux Mint übliche Paketverwaltungs-Programm apt wie auch den in Python geschriebenen Paket-Manager yum.

Zur Festlegung der Zielrechner kann man beispielsweise einen Ordner ~/ansible anlegen und darin eine Datei ~/ansible/ansible_hosts mit folgendem Inhalt anlegen:

---

# Ansible Hosts

[servers]
192.168.2.101
192.168.2.102
192.168.2.103

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, die man sich beispielsweise mittels nmap -sP 192.168.2.0/24 anzeigen lassen kann (die meisten Router weisen lokalen Rechnern standardmäßig die Adressen 192.168.1.XXX oder 192.168.2.XXX zu).

Möchte man, dass Ansible standardmäßig auf diese Host-Datei zurückgreift, so kann man folgende Anweisung in einer Shell eingeben (oder an die Konfigurationsdatei ~/.bashrc beziehungsweise ~/.zshrc anfügen):

export ANSIBLE_HOSTS=~/ansible/ansible_hosts

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:

- hosts: servers
  sudo: true
  tasks:
    - name: update apt sources
      apt:  update_cache=yes

   - name: upgrade apt packages
     apt:  upgrade=yes

Hat man auf all diesen Rechnern Netzwerk-Zugriff und Admin-Rechte, so kann man anschließend Ansible mit folgender Anweisung aufrufen:

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

Ansible Modules: http://docs.ansible.com/ansible/modules_by_category.html

Relevant für Backups!?: http://docs.ansible.com/ansible/copy_module.html http://docs.ansible.com/ansible/fetch_module.html