我最近使用 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 }}"