저는 최근 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
데비안 기반 배포판에서도 비슷합니다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 }}"