Raspberry Pis verwalten mit Ansible
Wer in seinem Netwerk mehrere Raspberry Pi laufen hat und diese gemeinsam verwalten will, kann mit Ansible diese Aufgabe erledigen ...
Beschreibung
Inzwischen haben immer mehr Leute mehrere Raspberry Pis in ihrem Netzwerk laufen. Eine für die Homeautomation, eine als NAS-Server und vielleicht noch eine mit Kameraaufgaben wie Überwachung oder für die Vögelbeobachtung. Hin und wieder möchte man die Rapsberry Pis dann aber auch aktualisieren oder andere Aktien auf allen durchführen. Einzel kann das dann zur mühevollen Aufgabe werden. Ansible kann hier allerdings einiges vereinfachen und einzelne Befehle oder Befehlsequenzen auf allen System ausführen.
Vorbereitung: SSH Zugriff ohne Passwort
Damit man von einem zentralen PC oder Laptop ohne Passworteingabe auf den Raspberry Pi zugreifen kann muss SSH korrekt eingerichtet sein. Der SSH-Key vom Host muss auf allen Clients (Raspberry Pis) übertragen werden. Dazu muss am Host der SSH-Key einmalig erstellt werden. Das macht man mit dem Befehl ssh-keygen. Man kann hier dann eine Passwort vergeben oder auch leer lassen - wie man möchte. Danach kann der SSH-Key auf die Clients übertragen wwerden. Das macht man am besten mit ssh-copy-id
gefolgt vom username pi und hostname des Clients.
1ls ~/.ssh/id_*.pub || ssh-keygen
2ssh-copy-id pi@homeautomation
3ssh-copy-id pi@piserver
4ssh-copy-id pi@picamera01
Ansible Installation
Nun kann Ansible mit apt install ansible
installiert werden. Dies ist allerdings die etwas ältere Version 2.7.7. Die aktuellste könnte mit pip3 installiert werden. Ich habe allerdings darauf verzichtet und benutze die Version Der Distribution.
1sudo apt-get install python3-pip
2pip3 install --user ansible
Ansible Konfiguration
Nun gibt man die Host in der Datei "etc/ansible/hosts" an. Man kann sie gleich in Gruppen zusammenfassen um später Aktionen für alle Clients einer Gruppe zu starten.
1[pis]
2homeautomation
3piserver
4picamera01
5
6[picams]
7picamera01
Mit dem Befehl ansible all --list-hosts
können alle Hosts aufgelistet und damit die Konfigurationsdatei überprüft werden.
1 hosts (3):
2 homeautomation
3 piserver
4 picamera01
Da wir nur mit Raspberry Pis arbeiten, kann man als user pi verwenden. Das hat Gegenüber root den Nachteil, dass man Befehle oft mit sudo ausführen muss. Allerdings entspricht der pi Benutzer dem üblichen Vorgang. Der Benutzer für den SSH Zugang wird in die Datei "/etc/ansible/ansible.cf" eingetragen
1 remote_user = pi
Nun kann man bereits den ersten Befehl ansible all -m ping
ausprobieren. Wenn alles korrekt eingerichtet und die SSH-Keys übertagen wurden wird der Befehl erfolgreich ausgeführt.
1piserver | SUCCESS => {
2 "changed": false,
3 "ping": "pong"
4}
5homeautomation | SUCCESS => {
6 "changed": false,
7 "ping": "pong"
8}
9picamera01 | SUCCESS => {
10 "changed": false,
11 "ping": "pong"
12}
Ansible Playbook
Playbooks sind Anweisungs-Dateien die ein oder mehrere Befehlr enthalten, die auf den Clients ausgeführt werden sollen. Als Beispiel gibt es ein upgrade Playbook und ein reboot Playbook.
Playbook upgrade:
1---
2- hosts: all
3 tasks:
4 - name: Wait for automatic system updates
5 shell: while sudo fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done;
6 - name: apt-get update && apt-get upgrade
7 sudo: yes
8 apt:
9 upgrade: "yes"
10 update_cache: "yes"
11 cache_valid_time: 0
Playbook reboot:
1---
2- hosts: all
3 tasks:
4 - name: Reboot host
5 sudo: yes
6 shell: sleep 2 && /sbin/shutdown -r now "Ansible reboot"
7 async: 1
8 poll: 0
9 - name: Wait for host to come back up
10 become: false
11 wait_for_connection:
12 delay: 15
13 sleep: 2
14 timeout: 120
Nun kann man die Playbooks ausführen:
1ansible-playbook upgrade
2ansible-playbook reboot