Getting started mit Ansible

Ich möchte zukünftig Konfigurationen und Einstellungen über verschiedenen Server hinweg automatisieren. Ziel ist es vor allem Fehler zu vermeiden aber natürlich spielt auch der Aspekt der Vermeidung von Aufwänden bei der manuellen Konfiguration eine Rolle. In vielen Quellen habe ich gelesen das Ansible hier eine gute Wahl sein soll.

Meine ersten Ziele sind

  • einheitliche Definition von virtuellen Hosts im Apache Server
  • einheitliche php einstellungen

Später würde ich dann gerne noch Software Installation automatisieren.

Wie immer sind diese Dokumentationen eher eine Aufzeichnung meiner Lernerfahrung als echte Best practises.

Vorrausetzung ist bei mir, das für alle Server der SSH Zugriff über Certificates erfolgt.

Zuerst die Installation

sudo apt-get install ansible

Zu Begin müssen die Server in ein “Inventar” eingetragen werden

sudo vi /etc/ansible/hosts

www.server1.de ansible_ssh_port=32323
www.server2.de ansible_ssh_port=33232

Als ersten Befehl sollte man wohl den berühmten “Ping” ausprobieren. Damit wird schon mal geprüft ob der Zugriff funktioniert

ansible all -m ping
  www.server1.de | success >> {
  "changed": false, 
  "ping": "pong"
 }

 www.server2.de | success >> {
    "changed": false, 
    "ping": "pong"
  }

Ansible soll es mir ja erlauben mit einem Befehl auf unterschiedlichen Servern gleiche Konfigurationen zu setzen oder Befehle auszuführen. Als ersten Test (der hoffentlich nichts kaputt machen kann) möchte ich eine Datei auf Basis eines Templates auf die beiden vorhandenen Server kopieren. Als Testballon habe ich mir dazu die “Message of the Day” (motd) ausgesucht. Der Inhalt dieser Datei wir angezeigt wenn sich ein Anwender einlogt. Als “Variable” möchte ich einen Servernamen verwenden den ich in der Inventardatei setze.

sudo vi /etc/ansible/hosts

www.server1.de ansible_ssh_port=32323 name="webserver"
www.server2.de ansible_ssh_port=33232 name="torserver"

Das verwendete “Template” soll erstmal ganz einfach sein

vi motd.j2
   Willkommen auf .

Das Playbook sieht dann so aus

vi motd.yml

 ---
 - hosts: all
 sudo: yes
 tasks:
 - name: MOTD
  action: template src=motd.j2 dest="/etc/motd" owner=root mode=0644

Aufgerufen sieht das dann so aus :

ansible-playbook  motd.yml

PLAY [all] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [www.server1.de]
ok: [www.server2.de]

TASK: [MOTD] ****************************************************************** 
ok: [www.server1.de]
changed: [www.server2.de]

PLAY RECAP ******************************************************************** 
www.server1.de    : ok=2    changed=0    unreachable=0    failed=0   
www.server2.de    : ok=2    changed=1    unreachable=0    failed=0   

In diesem Fall wurde auf dem ersten Server die Datei nicht verändert, da dies bereits bei einem vorherigen Testlauf geschehen ist und nur die Datei auf dem zweiten Server wurde verändert.

Ach übrigens, wenn man die Destination im Playbook nicht in “” setzt bekommt man diese Fehlermeldung.

failed to parse json:     add_file_common_args=True,
  File "/home/hbauer/.ansible/tmp/ansible-tmp-1412593058.39-183192779237883/copy", line 450, in __init__
    self._log_invocation()
  File "/home/hbauer/.ansible/tmp/ansible-tmp-1412593058.39-183192779237883/copy", line 1057, in _log_invocation
    syslog.syslog(syslog.LOG_NOTICE, unicode(msg).encode('utf8'))
   UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 144: ordinal not in range(128)