Ich verwende Ansible, um Hosts zu überprüfen, ob sie neu gestartet werden müssen, wenn der /vmlinuz
Kernel nicht auf aufgelöst wird uname -r
.
Der if
Zustand besteht darin, dass immer ein Neustart erkannt wird, obwohl die Testmaschine neugestartet wurde und der Kernel auf denselben Kernel aufgelöst wird:
wenn [ $(readlink -f /vmlinuz) != /boot/vmlinuz-$(uname -r) ]; dann echo 'reboot'; sonst echo 'no'; fi
- name: Check for reboot hint.
shell: if [ $(readlink -f /vmlinuz) != /boot/vmlinuz-$(uname -r) ]; then echo 'reboot'; else echo 'no'; fi
ignore_errors: true
register: reboot_hint
- name: Rebooting ...
command: shutdown -r now "Ansible kernel update applied"
async: 0
poll: 0
ignore_errors: true
when: kernelup|changed or reboot_hint.stdout.find("reboot") != -1
register: rebooting
- name: Wait for thing to reboot...
pause: seconds=45
when: rebooting|changed
Antwort1
Die aktuellste installierte Kernel-Version lässt sich zuverlässig über die folgende RPM-Abfrage ermitteln:
rpm -q kernel --queryformat '%{installtime} %{version}-%{release}.%{arch}\n' | sort -n -k1 | tail -1 | cut -d ' ' -f 2
Beispielausgabe unter RHEL 7:
3.10.0-229.11.1.el7.x86_64
Überprüfen Sie nun einfach, ob die Ausgabe mit uname -r
Folgendem übereinstimmt:
3.10.0-229.1.2.el7.x86_64
In diesem Beispiel stimmt es nicht überein und ein Neustart ist erforderlich.
Sie können „Test“ verwenden, um die Zeichenfolgen zu vergleichen:
if [ "`rpm -q kernel --queryformat '%{installtime} %{version}-%{release}.%{arch}\n' | sort -n -k1 | tail -1 | cut -d ' ' -f 2`" = "`uname -r`" ]; then echo "latest kernel already booted."; else echo "new kernel. reboot required."; fi
Antwort2
Antwort für 2021
Wie @kawing-chiu inIhre Antwort, dnf
hat jetzt ein needs-restarting
Modul, das genau das tut, was die Frage erfordert. Es ermittelt, ob Systempakete seit dem letzten Start aktualisiert wurden, obwohl dies nicht nur auf Kerneländerungen beschränkt ist. Dieses Verhalten ist wohl besser, als einfach die Kernelversion mit den installierten Paketen zu vergleichen.
Auf das needs-restarting
dnf-Modul kann nicht über das Ansible-Modul zugegriffen werden , es kann jedoch über oder mit seinem Alias ansible.builtin.dnf
aufgerufen werden , direkter mit oder noch expliziter mit .ansible.builtin.shell
ansible.builtin.command
needs-restarting -r
dnf needs-restarting -r
/usr/bin/dnf needs-restarting -r
Das -r
Flag scheint keine Root-Rechte zu erfordern und meldet lediglich, ob ein Neustart erforderlich ist. Der Rückgabecode ist, 0
wenn kein Neustart erforderlich ist und 1
wenn doch. Daher sollten wir in der Lage sein, eine Aufgabe wie diese zu verwenden, die von der von vorgeschlagenen angepasst istJoël Cattin:
- name: Check if a reboot is required
ansible.builtin.command: needs-restarting -r
register: reg_reboot_required
ignore_errors: yes
failed_when: false
changed_when: reg_reboot_required.rc != 0
notify:
- Reboot server
Sie benötigen außerdem einen Handler namens oder der auf ihn hört, Reboot server
um den Neustart auszuführen. So etwas funktioniert:
- name : Reboot server
ansible.builtin.reboot:
msg: "Reboot initiated by Ansible after OS update"
reboot_timeout: 3600
test_command: uptime
Ich hoffe, dass diese Antwort jedem hilft, der auf der Suche nach einer Lösung für dieses Problem ist.
Antwort3
ALTER Thread – aber er hat mir geholfen, dieses schnelle Ansible-Skript zusammenzustellen, das jemandem helfen könnte.
---
- hosts: allhosts
gather_facts: False
tasks:
- name: check latest kernel installed
shell: rpm -q kernel --queryformat '%{installtime} %{version}-%{release}.%{arch}\n' | sort -n -k1 | tail -1 | cut -d ' ' -f 2
register: kernel_installed_latest
- name: Check running kernel version
shell: uname -r
register: kernel_version
- fail:
msg: "latest kernel version {{kernel_installed_latest.stdout}} doesnt match running kernel {{kernel_version.stdout}}"
when: (kernel_installed_latest.stdout != kernel_version.stdout)
Antwort4
Eine andere Alternative besteht darin, Kernel-Updates separat durchzuführen und einen Handler zum Neustart des Systems auszulösen, wenn das Kernel-Update erforderlich war.
tasks
- name: Upgrade all packages, excluding kernel
ansible.builtin.yum:
name: '*'
state: latest
exclude: kernel*
- name: Upgrade kernel
ansible.builtin.yum:
name: 'kernel*'
state: latest
notify: restart host
handlers:
- name: restart host
ansible.builtin.reboot: