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)