私は最近、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 }}"