Raspberry Pis verwalten mit Ansible

Teilen:

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