Wenn es Kernel-Updates gibt, die einen Neustart des Betriebssystems erfordern, wäre es am besten, das reboot ansible-Modul zu verwenden, um den Computer neu zu starten, zu warten, bis er herunterfährt, wieder hochfährt und auf Befehle antwortet
In diesem Handbuch erstellen wir ein Skript, um den Cache von Debian-basierten Systemen zu aktualisieren und die installierten Pakete zu aktualisieren. Wir werden auch eine Aufgabe zum Neustarten des Servers enthalten, wenn es Kernel-Updates gab, die einen Neustart erfordern.
Überprüfen Sie auch:
- SSH – Generieren und Arbeiten mit SSH-Schlüsseln
Inhaltsverzeichnis
- Ansible apt-Modul verwenden, um alle Pakete zu aktualisieren
- Neustart des Systems bei Kernel-Upgrades
- Hosts-Datei erstellen
- Das ganze Playbook
- Playbook ausführen
1. Verwenden des Ansible apt-Moduls zum Aktualisieren aller Pakete
Bevor Sie ein Paket-Upgrade in Debian-basierten Systemen durchführen, wird immer empfohlen, eine apt-Cache-Aktualisierung durchzuführen. Dies kann mit diesem Befehl erreicht werden:
sudo apt-get update
Wir können dasselbe mit Ansible mit dieser Aufgabe erreichen:
- name: Update apt repo and cache on all Debian/Ubuntu boxes
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600
Wo,
- update_cache:ja – Führen Sie das Äquivalent von
apt-get update
aus Befehl auf allen Servern - force_apt_get:ja – Verwenden Sie nicht den aptitude-Befehl, sondern den apt-get-Befehl auf Debian/Ubuntu-Rechnern
- cache_valid_time:3600 – Aktualisieren Sie den apt-Cache, wenn er älter als
cache_valid_time
ist . Diese Option wird in Sekunden eingestellt. In diesem Beispiel ist sie auf 3600 Sekunden eingestellt.
Als nächstes führen wir das Upgrade durch. Normalerweise führen wir diesen apt-get-Befehl aus, um die Funktion zu erreichen:
sudo apt-get upgrade -y
Dies ist die Ansible-Aufgabe, um das Upgrade durchzuführen:
- name: Upgrade all packages on servers
apt:
upgrade: dist
force_apt_get: yes
Wo,
- upgrade:dist – Führen Sie das Äquivalent von
apt-get upgrade
aus Befehl auf allen Ubuntu- oder Debian-Linux-Servern. Mit anderen Worten, aktualisieren Sie alle Pakete auf die neueste Version. - force_apt_get:ja – Verwenden Sie apt-get anstelle von aptitude.
2. Neustart des Systems bei Kernel-Upgrades
Wenn es Kernel-Upgrades gibt, müssen wir das System neu starten, um diese Änderungen zu übernehmen. Wenn ein Neustart erforderlich ist, eine Datei mit diesem Pfad /var/run/reboot-required
wird erstellt.
Was wir tun möchten, ist zu prüfen, ob diese Datei existiert, und dann das System neu zu starten. Wir können eine neue Variable registrieren, wenn die Datei /var/run/reboot-required auf dem System existiert, indem wir den ansiblen Status verwenden:
- name: Check if a reboot is needed on all servers register: reboot_required_file stat: path: /var/run/reboot-required get_md5: no
Wo:
- register:reboot_required_file – Das
register
Das Schlüsselwort entscheidet, in welcher Variable ein Ergebnis gespeichert wird, und wir werden es wie folgt verwenden, um die Box neu zu starten. - Statistik:Pfad:/var/run/reboot-required – Feststellen, ob ein Pfad (/var/run/reboot-required) existiert
- get_md5:nein – Algorithmus zur Ermittlung der Prüfsumme der Datei. In diesem Beispiel verwende ich md5, aber Sie können sha1, sha224, sha256, sha384 und sha512 verwenden.
Nachdem wir nun wissen, ob der Server neu gestartet werden soll oder nicht, fügen wir eine Aufgabe hinzu, um den Server neu zu starten, wenn die Datei vorhanden ist:
- name: Reboot the server if kernel updated
reboot:
msg: "Reboot initiated by Ansible for kernel updates"
connect_timeout: 5
reboot_timeout: 300
pre_reboot_delay: 0
post_reboot_delay: 30
test_command: uptime
when: reboot_required_file.stat.exists
Wo,
- test_command:Betriebszeit – Führen Sie den Uptime-Befehl auf dem neu gestarteten Server aus und erwarten Sie Erfolg von, um festzustellen, dass die Maschine für weitere Aufgaben bereit ist.
- wann:reboot_required_file.stat.exists – Überprüfen Sie zunächst, ob die Datei namens /var/run/reboot-required existiert, indem Sie eine Variable namens reboot_required_file verwenden. Das Neustartmodul funktioniert nur, wenn diese Datei vorhanden ist und mithilfe der Ansible-Bedingung „when:reboot_required_file.stat.exists“ erzwungen wird.
3. Erstellen der Hosts-Datei
Nachdem wir nun die Logik eingerichtet haben, erstellen wir eine hosts.yaml-Datei. Speichern Sie diesen Inhalt in einer Datei namens hosts.yaml
.
all:
hosts:
ubuntusrv:
ansible_ssh_host: 10.2.11.10
ansible_ssh_user: ubuntu
debiansrv:
ansible_ssh_host: 10.2.11.11
ansible_ssh_user: admin
children:
allservers:
hosts:
ubuntusrv:
debiansrv:
4. Das ganze Playbook
Wir können die ganze Logik in ein Playbook packen. Speichern Sie diesen Inhalt in der Datei upgrade.yaml
---
- name: Playbook to Update cache, upgrade packages and reboot os if necessary
hosts: allservers
become: yes
gather_facts: False
tasks:
- name: Update apt repo and cache on all Debian/Ubuntu boxes
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600
- name: Upgrade all packages on servers
apt:
upgrade: dist
force_apt_get: yes
- name: Check if a reboot is needed on all servers
register: reboot_required_file
stat:
path: /var/run/reboot-required
get_md5: no
- name: Reboot the server if kernel updated
reboot:
msg: "Reboot initiated by Ansible for kernel updates"
connect_timeout: 5
reboot_timeout: 300
pre_reboot_delay: 0
post_reboot_delay: 30
test_command: uptime
when: reboot_required_file.stat.exists
5. Playbook ausführen
Stellen Sie sicher, dass Sie SSH-Schlüssel eingerichtet haben, und führen Sie sie wie folgt aus:
ansible-playbook -i hosts.yaml upgrade.yaml -vv
Dies ist die Ausgabe auf meinem Server
➜ ansible-playbook -i hosts.yaml upgrade.yaml -vv
ansible-playbook [core 2.12.1]
config file = /Users/etowett/.ansible.cfg
configured module search path = ['/Users/etowett/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /Library/Python/3.8/site-packages/ansible
ansible collection location = /Users/etowett/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible-playbook
python version = 3.8.2 (default, Apr 8 2021, 23:19:18) [Clang 12.0.5 (clang-1205.0.22.9)]
jinja version = 3.0.3
libyaml = True
Using /Users/etowett/.ansible.cfg as config file
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
Skipping callback 'default', as we already have a stdout callback.
Skipping callback 'minimal', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.
PLAYBOOK: upgrade.yaml ************************************************************************************************************************************************************
1 plays in upgrade.yaml
PLAY [Playbook to Update cache, upgrade packages and reboot os if necessary] ******************************************************************************************************
META: ran handlers
TASK [Update apt repo and cache on all Debian/Ubuntu boxes] ***********************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:7
changed: [ubuntusrv] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"}, "cache_update_time": 1639737368, "cache_updated": true, "changed": true}
TASK [Upgrade all packages on servers] ********************************************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:13
ok: [ubuntusrv] => {"changed": false, "msg": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nCalculating upgrade...\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n", "stderr": "", "stderr_lines": [], "stdout": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nCalculating upgrade...\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n", "stdout_lines": ["Reading package lists...", "Building dependency tree...", "Reading state information...", "Calculating upgrade...", "0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded."]}
TASK [Check if a reboot is needed on all servers] *********************************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:18
ok: [ubuntusrv] => {"changed": false, "stat": {"atime": 1639737351.6237016, "attr_flags": "", "attributes": [], "block_size": 4096, "blocks": 8, "charset": "us-ascii", "checksum": "20f7959b87e8cd55b7c985e46d6fa38a4063037d", "ctime": 1639679787.0725238, "dev": 26, "device_type": 0, "executable": false, "exists": true, "gid": 0, "gr_name": "root", "inode": 1143, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "mimetype": "text/x-diff", "mode": "0644", "mtime": 1639679787.0725238, "nlink": 1, "path": "/var/run/reboot-required", "pw_name": "root", "readable": true, "rgrp": true, "roth": true, "rusr": true, "size": 32, "uid": 0, "version": null, "wgrp": false, "woth": false, "writeable": true, "wusr": true, "xgrp": false, "xoth": false, "xusr": false}}
TASK [Reboot the server if kernel updated] ****************************************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:24
changed: [ubuntusrv] => {"changed": true, "elapsed": 73, "rebooted": true}
META: ran handlers
META: ran handlers
PLAY RECAP ************************************************************************************************************************************************************************
ubuntusrv : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Abschluss
Sie haben gelernt, wie Sie alle Pakete auf Ihren Debian- und Ubuntu-Linux-Boxen aktualisieren und den Server bei Bedarf mithilfe von Ansible-Playbooks neu starten.