In diesem Beitrag zu meiner kleinen Ansible-Reihe beschäftige ich mich mit den Modulen copy
[1. Ansible: copy – Copies files to remote locations] und cron
[2. Ansible: cron – Manage cron.d and crontab entries].
Hinweis: Die folgende Konfiguration ist nicht zur Nachahmung empfohlen. Es handelt sich dabei um meine ersten Schritte mit Ansible. Es ist daher wahrscheinlich, dass die Konfiguration noch Fehler enthält, nicht optimiert ist und ein großes Verbesserungspotenzial besitzt. Die Nachahmung erfolgt ausdrücklich auf eigene Gefahr. Über Hinweise, wie man es besser machen kann, freue ich mich jederzeit.
Anforderungen
In diesem Szenario sollen Shell-Skripte auf das Zielsystem kopiert werden. Anschließend sind Einträge in der crontab
zu erstellen, um diese Shell-Skripte auszuführen. Beim Zielsystem handelt es sich um die Gruppe [i-stage]
, in der sich aktuell nur ein Host namens host-i1.example.com befindet.
Vorbereitungen
Die zu verteilenden Skripte werden auf der Ansible-Control-Machine im Verzeichnis /root/src/
gesammelt. Anschließend wurde eine Rolle für dieses Vorhaben erstellt. Die auf meiner Spielwiese verwendete Verzeichnisstruktur wurde bereits in den vergangenen Beiträgen[3. Linux-Benutzerkonten mit Ansible verwalten] zu dieser Reihe beschrieben.
Umsetzung
Zur Umsetzung der Anforderungen wird ein Playbook erstellt, welches die geforderten Tasks ausführt. Der folgende Code-Block listet die benötigten Dateien inkl. ihres kommentierten Inhalts auf:
# Begin of file: local_scripts_i-stage.yml --- - hosts: i-stage roles: - local_scripts # End of file ############################ # Begin of file: roles/local_scripts/tasks/main.yml --- ## Copy local script files to target hosts - copy: src=/root/src/sript1.sh dest=/root/src/sript1.sh owner=root group=root mode=755 - copy: src=/root/src/sript2.sh dest=/root/src/sript2.sh owner=root group=root mode=755 ## Create cron jobs for local script files - cron: name="local script1" minute="10" hour="1" job="/root/src/sript1.sh" - cron: name="local script2" minute="12" hour="1" job="/root/src/sript2.sh" # End of file #############################
Nach der Ausführung des Playbooks liegen die Skripte auf dem oder den Zielsystemen im gewünschten Verzeichnis /root/bin/
. Lässt man sich die Crontab des Benutzers root anzeigen, so erkennt man die von Ansible hinzugefügten Einträge:
# crontab -l # DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontabaf5r8i installed on Mon Jul 18 11:52:09 2016) # (Cronie version 4.2) #Ansible: local script1 10 1 * * * /root/bin/script1.sh #Ansible: local script2 12 1 * * * /root/bin/script2.sh
Fazit
Wieder konnte eine Anforderung schnell und einfach mit Ansible umgesetzt werden. Ob dies bereits der Königsweg ist bzw. ob dieser überhaupt existiert, steht jedoch noch nicht fest. Anstatt die Dateien zuerst auf das Ziel zu kopieren und dort Cron-Einträge für die Ausführung zu erstellen, könnte auch das Modul script
[4. Ansible: script – Runs a local script on a remote node after transferring it] genutzt werden. Dieses Modul transferiert ein lokales Skript zum Zielsystem und führt es dort aus.
Bisher habe ich mich gegen den Einsatz des script
-Moduls entschieden, da mir noch nicht klar ist, ob das Skript auf dem Zielsystem verbleibt oder bei jeder Ausführung erneut übertragen wird. Letzteres wäre bei einer großen Anzahl Zielsysteme nicht unbedingt wünschenswert.