GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie ich Ansible verwendet habe, um Updates zu Hause zu automatisieren

Zu Hause besitze ich einige IT-Geräte, die rund um die Uhr laufen. Um sie auf dem neuesten Stand zu halten und Updates automatisch zu installieren, überlasse ich die Arbeit Ansible. Falls Sie komplett neu bei Ansible sind, finden Sie eine gute Einführung in:

  • Erste Schritte mit Ansible
  • Entmystifizierung von Ansible für Linux-Systemadministratoren
  • Kurzanleitung für Ansible für Linux-Systemadministratoren

Mein Heimnetzwerk umfasst die folgenden Geräte:

  • Zwei Raspberry Pi mit Raspbian OS
  • Mein KVM-Host mit Debian 10 Buster
  • Zwei RHEL 8-Hosts
  • Eine Synology DS213air
  • Vier RHEL-Hosts in einem isolierten Netzwerk

Der durch das rote Quadrat markierte Host ist mein Ansible Control Node. Seine Aufgabe ist es, meine Linux-Umgebung zu aktualisieren. Ich habe es gewählt, weil dieser Host alle anderen Hosts in der Umgebung erreichen kann. Andere Hosts, beispielsweise die Red Hat Enterprise Linux 7 (RHEL)-Ansible-Hosts, können nur Hosts innerhalb des isolierten Netzwerks erreichen.

[Das könnte Ihnen auch gefallen: So erstellen Sie ein Ansible Playbook]

Voraussetzungen

Auf allen meinen Hosts gibt es ein Benutzerkonto, das sudo verwenden kann um Befehle mit Root-Rechten auszuführen. Der Einfachheit halber habe ich ein SSH-Schlüsselpaar erstellt und den öffentlichen SSH-Schlüssel mit Ansible an die Hosts verteilt, die ich aktualisieren möchte. Wenn Sie Hilfe beim Generieren der SSH-Schlüssel benötigen, sehen Sie sich Using ssh-keygen and sharing for key-based authentication in Linux von Tyler Carrigan an.

Um den Host RHEL8-Squid zu verwenden Als Ansible Control Node muss ich ein Repo aktivieren, das Ansible bereitstellt, und es installieren:

$ sudo subscription-manager repos --enable=ansible-2.9-for-rhel-8-x86_64-rpms
$ sudo dnf -y install ansible

Informationen zu anderen Distributionen finden Sie in der offiziellen Dokumentation.

Die Ansible-Standardkonfigurationsdatei befindet sich unter /etc/ansible/ansible.cfg . Da diese Datei vom RPM-Paket geliefert und gesteuert wird, erstelle ich gerne eine benutzerdefinierte Konfigurationsdatei unter ~/.ansible.cfg indem Sie einfach das Original kopieren und bearbeiten. Ich habe nur ein paar Änderungen vorgenommen:

$ egrep -v "^$|^#|^\[" ~/.ansible.cfg
inventory      = ~/ansible/hosts
private_key_file = /home/user/.ssh/ansible_id_rsa

Wie Sie sehen können, habe ich ein ansible erstellt Verzeichnis in meinem HOME Verzeichnis zum Speichern meiner Host-Bestandsdatei. Ich habe auch den Pfad zum privaten SSH-Schlüssel angegeben, den Ansible verwenden soll, um sich mit den Knoten im Netzwerk zu verbinden.

Mit dieser Konfiguration wird die gesamte Magie von meinem HOME gesteuert Verzeichnis, und ich benötige keine Root-Rechte auf meinem Ansible Control Node, um die folgende Aufgabe zu erledigen.

Erstellen Sie eine statische Bestandsdatei

In diesem Anwendungsfall verwende ich eine statische Bestandsdatei, indem ich meine Hosts mit ihrem FQDN in ~/ansible/hosts einfüge Datei.

[special]
localhost
tower-pc.lan

[yum]
rhel7-ansible.private1
rhel7-t1.private1
rhel8-t1.private1
rpm-repo-r8.private1
podhost-r8-1.lan

[apt]
raspi-sht21.lan
pi-hole.lan

[ipkg]
diskstation.lan

Wie Sie sehen können, habe ich die Hosts in meinem Netzwerk nach dem von ihnen verwendeten Paketmanager gruppiert. Dies ist praktisch, wenn Sie das Playbook erstellen, um sie zu aktualisieren. Die Gruppe [special] enthält meinen Ansible Control Node selbst und meinen KVM-Hypervisor, auf dem mein Ansible Control Node läuft.

Weitere Informationen zum Inventar von Ansible finden Sie unter:So bauen Sie Ihr Inventar auf.

Überprüfen Sie die Konnektivität

Bevor ich das Playbook erstelle, das meine Hosts aktualisiert, überprüfe ich, ob mein Ansible Control Node RHEL8-Squid kann mit dem folgenden Ad-hoc-Befehl eine Verbindung zu allen meinen Hosts herstellen:

$ ansible all -m ping -T 30
rhel7-t1.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
rhel7-ansible.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
rpm-repo-r8.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
rhel8-t1.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
podhost-r8-1.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host tower-pc.lan is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
tower-pc.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: sftp transfer mechanism failed on [diskstation.lan]. Use
ANSIBLE_DEBUG=1 to see detailed information
[WARNING]: Platform linux on host diskstation.lan is using the discovered
Python interpreter at /usr/bin/python, but future installation of another
Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/
reference_appendices/interpreter_discovery.html for more information.
diskstation.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host pi-hole.lan is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
pi-hole.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host raspi-sht21.lan is using the discovered
Python interpreter at /usr/bin/python, but future installation of another
Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/
reference_appendices/interpreter_discovery.html for more information.
raspi-sht21.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

Das Standard-Timeout für eine Ansible-Verbindung beträgt 10 Sekunden. Weil meine Synology Diskstation die meiste Zeit im Standby-Modus ist, verwende ich die Option -T um ein Timeout von 30 Sekunden anzugeben, um ihm etwas Zeit zum Aufwachen zu geben.

Die Warnungen stören mich derzeit nicht, also mache ich mit der Erstellung des Playbooks weiter.

Falls Sie mehr über die Ad-hoc-Befehle erfahren möchten, lesen Sie Einführung in Ad-hoc-Befehle in den offiziellen Dokumenten.

Das Spielbuch

Mein Playbook enthält drei Stücke. Jedes Spiel führt eine Aufgabe auf Hosts aus, die zu einer bestimmten Gruppe in meinem Inventar gehören, mit Ausnahme von [special] . In diesem einfachen Beispiel verbindet sich jedes Spiel mit einer Gruppe von Hosts, aktualisiert sie und startet sie anschließend neu, falls Updates installiert wurden.

Um festzustellen, ob Updates installiert wurden, registriere ich Variablen, die die Rückgabewerte der Aufgaben speichern, bei denen ich sie registriert habe. Ich verwende diese, um zu prüfen, ob sich der Status einer Aufgabe geändert hat. Ist dies der Fall, wird das System neu gestartet. Hier ist das Playbook:

---
- hosts: yum
  tasks:
  - name: Update all installed packages using YUM module
    yum:
      name: '*'
      state: latest
      update_cache: yes
      update_only: yes
    register: yum_update_status

  - name: Remove packates not needed anymore
    yum:
      autoremove: yes

  - name: Reboot when packages were updated
    reboot:
    when: yum_update_status.changed

- hosts: apt
  tasks:
  - name: Update all installed packages using APT module
    apt:
      name: '*'
      state: latest
      update_cache: yes
      only_upgrade: yes
    register: apt_update_status

  - name: Remove packages not needed anymore
    apt:
      autoremove: yes

  - name: Reboot when packages were updated
    reboot:
      post_reboot_delay: 60
    when: apt_update_status.changed

- hosts: ipkg
  tasks:
  - name: Update the Packages installed on Diskstation
    command: /opt/bin/ipkg update && /opt/bin/ipkg upgrade

Wie Sie vielleicht bemerkt haben, ist die Diskstation wurde nicht neu gestartet. Das liegt daran, dass nur Userspace-Tools aktualisiert werden und ein Neustart nicht erforderlich ist. Wenn eine neue OS-Version für die Diskstation verfügbar ist , ich werde es manuell aktualisieren, da es noch kein Ansible-Modul dafür gibt. Ähnlich verhält es sich mit dem Host tower-pc.lan und rhel8-squid.lan . Ich habe sie absichtlich aus diesem Spielbuch herausgelassen. Mein Ansible Control Node und mein KVM-Hypervisor sind mir wichtig genug, dass ich sie manuell aktualisieren werde.

Hier ist ein Blick auf die erste Ausführung des Playbooks:

$ ansible-playbook -T 30 -b --ask-become-pass pkg_update.yml
BECOME password:

PLAY [yum] **************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [podhost-r8-1.lan]
ok: [rhel7-t1.private1]
ok: [rhel8-t1.private1]
ok: [rpm-repo-r8.private1]
ok: [rhel7-ansible.private1]

TASK [Update all installed packages using YUM module] *******************************************************************************************
ok: [rhel8-t1.private1]
ok: [podhost-r8-1.lan]
ok: [rpm-repo-r8.private1]
ok: [rhel7-t1.private1]
ok: [rhel7-ansible.private1]

TASK [Remove packates not needed anymore] *******************************************************************************************************
ok: [rhel7-t1.private1]
ok: [rhel7-ansible.private1]
ok: [rhel8-t1.private1]
ok: [podhost-r8-1.lan]
ok: [rpm-repo-r8.private1]

TASK [Reboot when packages were updated] ********************************************************************************************************
skipping: [rhel7-ansible.private1]
skipping: [rhel7-t1.private1]
skipping: [rhel8-t1.private1]
skipping: [rpm-repo-r8.private1]
skipping: [podhost-r8-1.lan]

PLAY [apt] **************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [pi-hole.lan]
ok: [raspi-sht21.lan]

TASK [Update all installed packages using APT module] *******************************************************************************************
changed: [pi-hole.lan]
changed: [raspi-sht21.lan]

TASK [Remove packages not needed anymore] *******************************************************************************************************
ok: [pi-hole.lan]
ok: [raspi-sht21.lan]

TASK [Reboot when packages were updated] ********************************************************************************************************
changed: [pi-hole.lan]
changed: [raspi-sht21.lan]

PLAY [ipkg] *************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [diskstation.lan]

TASK [Update the Packages installed on Diskstation] *********************************************************************************************
changed: [diskstation.lan]

PLAY RECAP **************************************************************************************************************************************
diskstation.lan            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
pi-hole.lan                : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
podhost-r8-1.lan           : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
raspi-sht21.lan            : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
rhel7-ansible.private1     : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rhel7-t1.private1          : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rhel8-t1.private1          : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rpm-repo-r8.private1       : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

Wie Sie sehen können, waren meine RHEL-Maschinen bereits auf dem neuesten Stand. Es muss nichts aktualisiert oder entfernt werden, daher ist kein Neustart erforderlich. Bei meinem Raspberry Pis hingegen waren Updates verfügbar und diese wurden installiert. Danach wurden beide Geräte neu gestartet. Die Diskstation hat seinen Status geändert , zu. Aber seien Sie sich bewusst, dass dies daran liegt, dass ich den command verwende Modul, das geändert zurückgibt jedes Mal, wenn es ausgeführt wird, unabhängig davon, ob sich etwas auf Ihrem Knoten geändert hat.

[ Ein kostenloser Leitfaden von Red Hat:5 Schritte zur Automatisierung Ihres Unternehmens. ] 

Abschluss

In diesem Artikel habe ich Ihnen ein einfaches, aber nicht sehr anspruchsvolles Beispiel gezeigt, wie ich meine Linux-Geräte zu Hause mithilfe von Ansible-Automatisierung auf dem neuesten Stand halte. Es zeigt Ihnen, wie Sie die Gruppen aus Ihrem Inventar in verschiedenen Spielen Ihres Playbooks verwenden, indem Sie einige der Ansible-Module und einen einfachen Befehl verwenden.


Linux
  1. So erstellen Sie ein Ansible-Playbook

  2. So fügen Sie mehrere Hosts in phpMyAdmin hinzu

  3. So installieren Sie Ansible unter Oracle Linux 8

  4. Wie sollte strace verwendet werden?

  5. Wie erstelle ich ein Ansible-Playbook, um Betriebssystemversionen der Remote-Hosts zu erhalten?

So installieren Sie Ansible unter Debian 9 (Stretch)

So installieren Sie Ansible unter Ubuntu 16.04 (Xenial)

So setzen Sie ein Windows-Update zurück

So installieren Sie Ansible Server unter Ubuntu 18.04

So installieren Sie Ansible unter Linux Mint 20

So richten Sie einen Heimserver ein