Ein Thema das ich schon seit einiger Zeit mal behandeln wollte ist Ansible. Auf Ansible bin ich eigentlich nur durch Bekannte im IRC gekommen, die sehr begeistert davon erzählt haben. Weil mir Tools wie Chef und Puppet zu komplex sind (für meine Ansprüche), war ich auch erst skeptisch was Ansible betrifft.

Denn die meisten Tools in dem Bereich, sind ausgelegt für riesige Infrastrukturen und Admins die tausende Server verwalten. In meinem beruflichen Alltag und privat kümmere ich mich insgesamt um 10-15 Server. Das sind nicht immer Server die komplett von mir verwaltet werden, es sind aber Maschinen auf denen ich regelmäßig arbeite.

Fast alle Server die ich in letzter Zeit installiert habe, waren für Ruby on Rails Apps bestimmt. Es war immer mal wieder auch ein LAMP Server dabei, aber das war eher die Ausnahme.

Wenn ich einen Server für ein neues Projekt brauchte, ist es meistens so gewesen, dass ich "mal eben schnell" alles per Hand installiert habe. Es dauerte dann aber doch meistens länger als geplant. Denn heutzutage ist es ja nicht einfach mit Apache, MySQL und PHP getan. Für Rails zum Beispiel, benötigt man Nginx, Puma oder Passenger, MySQL oder PostgreSQL, Redis, Memcached, Sidekiq, Monit usw.

Wieso Ansible und nicht Chef oder Puppet?

Ein Grund wieso ich mich von Tools wie Chef oder Puppet ferngehalten habe, war unter anderem die Tatsache, dass sie am besten mit einem zentralen Verwaltungsserver funktionieren. Für meine überschaubare Anzahl an Servern, hielt ich das aber immer für einen technischen Overkill. Schließlich will auch der Verwaltungsserver verwaltet werden.

Ansible hingegen, benötigt keinen zentralen Server, sondern wird einfach auf dem eigenen, lokalen, Rechner ausgeführt. Ansible verbindet sich mit einem oder mehreren Hosts und nimmt dort Installationen, Konfigurationen und sonstige Anpassungen vor.

Installation

Ansible sollte in allen gängigen Linux Distros zu bekommen sein. Da ich an einem Mac arbeite, nutze ich Homebrew um ansible zu installieren:

brew update && brew install ansible

Playbooks

Ansible bietet einem die Möglichkeit, sogenannte Playbooks zu erstellen. Playbooks werden im Yaml Format beschrieben und können aus einer einzigen Datei bestehen. Meistens jedoch, wird man ein Playbook über mehrere Ordner und Dateien verteilen, um es übersichtlich zu halten.

Ein einfaches Playbook, dass nur Nginx installiert, könnte so aussehen:

---
- hosts: webservers
  remote_user: root
  tasks:
  - name: install nginx
    apt: name=nginx state=latest
Tasks Ein Playbook kann beliebig viele Tasks beinhalten, die verschiedene Tätigkeiten beschreiben und mit Hilfe eines sogenannten Modules auf dem Server ausgeführt werden. Man kann z.B. Software installieren, User anlegen, Konfigurationen manipulieren, Dateien hochladen und vieles mehr. Alle Module findet man hier.

Inventory / Hosts

Außerdem benötigt man noch eine hosts Datei, die im gleichen Verzeichnis wie das Playbook abgelegt wird. In dieser Datei wird das "Inventory" definiert. Ein Inventory ist im Grunde eine Liste (optional in Gruppen unterteilt: Webserver, Database, usw.), in der alle Server eingetragen werden, welche durch dieses Playbook verwaltet werden sollen.

Die Datei könnte z.B. wie folgt aussehen:

[webservers]
<server ip>

Benötigt man zum Beispiel 3 identische Server, könnte man an dieser Stelle einfach 3 IP Adressen eintragen (eine pro Zeile). Es wäre auch möglich, bestimmte Tasks eines Playbooks nur in einer bestimmten Gruppe auszuführen. Teilt man die Liste in Webservers und Database auf, könnte man bestimmte Tasks (z.B. die Installation von MySQL) nur in der Database Gruppe ausführen. Ansible macht einem hier aber auch keine Vorgaben, dies kann man weitestgehend selbst entscheiden.

Playbook ausführen

Hat man die beiden Dateien erstellt, kann man das Playbook auf die in der hosts Datei definierten Server anwenden. Man muss dazu nur das Playbook und die hosts Datei als Parameter angeben:

ansible-playbook playbook.yml -i hosts

Ansible verbindet sich nun mit dem Server, führt alle Tasks aus, und zeigt für jeden Task einen entsprechenden Status an.

Das Coole ist aber eigentlich, dass man so ein Playbook beliebig oft ausführen kann. Ansible erkennt den Status der festgelegten Tasks und wird auf dem Server nur Änderungen durchführen, wenn diese laut Playbook nötig sind. Eine ziemlich coole Sache also!

Ansible kann noch deutlich mehr und es lohnt sich auf jeden Fall, mal in die Modules Liste zu sehen. Dabei bekommt man schon einen relativ guten Überblick, was mit Ansible alles möglich ist.

Ich werde noch weitere Beiträge zu dem Thema veröffentlichen, aber das sollte es nun vorerst gewesen sein. :)