Ubuntuシステムを再起動する必要があるかどうかを確認するには?

Ubuntuシステムを再起動する必要があるかどうかを確認するには?

私は最近、ansibleを使用してカーネルパッチ(Debian 10とUbuntu 18.04の混合)を適用しました。更新されている各コンピュータを再起動する必要があるかどうかを確認する方法を見つけたいと思います。私はこれがtest -f /var/run/reboot-required正式な指標であることを読みましたが、これが常に正確ではないことに気づきました。カーネルのアップグレード後にこのファイルが存在する場合もあり、存在しない場合もあります。私はLivePatchを使用していないので、カーネルアップデートがあるたびにこれらすべてのシステムの再起動をスケジュールする必要があります。

Ansibleでは、上記のファイルが存在するかどうかをテストするのは非常に簡単ですが、一貫性がないため、これを行うために次のbashコードを考えました/boot。これは多くの修正なしでAnsibleに直接接続できるわけではありません。

再起動が必要かどうかを確認するより良い方法はありますか?

if [[ $(uname -r) != .*"$(ls -1 /boot/vmlinuz* | sort -V | tail -1)"*. ]]; then
   echo "Needs reboot. Running kernel $(uname -r) is older than $(ls -1 /boot/vmlinuz* | sort -u | tail -1)"
fi

答え1

新しいカーネルをインストールした後だけでなく、マイクロコード、glibc、SSLライブラリなどを更新した後でも再起動が必要になることがあります。したがって、より多くのイベントを再開する必要があります。

RHELには、アップデートの適用後に必要かどうかを問い合わせるスクリプトをyum-utils含む、利用可能なパッケージマネージャベースのユーティリティがあります。needs-restarting

Debianベースのディストリビューションでも似ていますneedrestart利用可能で、そのうちアップデート後に再起動が必要かどうかを確認

はい(RHEL 7基準)

依存関係を解決した後

- name: Install basic admin tools
  yum:
    name: yum-utils
    state: latest

確認は簡単です

- name: Check if reboot_required
  shell:
    cmd: "needs-restarting -r"
  changed_when: false
  failed_when: reboot_required.rc != 0 and reboot_required.rc != 1
  check_mode: false
  register: reboot_required

- name: Report reboot_required
  debug:
    msg: "{{  reboot_required.rc | bool }} "
  changed_when: reboot_required.rc == 1
  check_mode: false

そして出力を生成

TASK [Report reboot_required] **************************************************
ok: [test1.example.com] => {
    "msg": "True "
}
ok: [test2.example.com] => {
    "msg": "False "
}

依存関係解決部分を変更する必要があるかもしれません。man needrestart

答え2

他の人に役立つ場合に備えて、私の解決策は次のとおりです。

---
- hosts: all

  vars:
    kernel_version: "{{ ansible_kernel }}"

  tasks:

    # sort -V specifically sorts software versions :)
    - name: find newest kernel under /boot
      shell   : ls -1 /boot/vmlinuz* | sort -V | tail -1
      register: latest_kernel

    # running kernel does not match latest kernel - can't do <> comparison since text is involved
    - name: test kernel versions different
      when: kernel_version not in latest_kernel.stdout
      debug:
        msg: "WARNING: needs reboot - running kernel {{ kernel_version }} was not found in variable {{ latest_kernel.stdout }}"

関連情報