Antwort für 2021

Antwort für 2021

Ich verwende Ansible, um Hosts zu überprüfen, ob sie neu gestartet werden müssen, wenn der /vmlinuzKernel nicht auf aufgelöst wird uname -r.

Der ifZustand 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 -rFolgendem ü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, dnfhat jetzt ein needs-restartingModul, 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-restartingdnf-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.shellansible.builtin.commandneeds-restarting -rdnf needs-restarting -r/usr/bin/dnf needs-restarting -r

Das -rFlag scheint keine Root-Rechte zu erfordern und meldet lediglich, ob ein Neustart erforderlich ist. Der Rückgabecode ist, 0wenn kein Neustart erforderlich ist und 1wenn 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 serverum 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:

verwandte Informationen