/vmlinuz
커널 이 uname -r
.
조건 if
은 테스트 머신이 재부팅되고 커널이 동일한 커널로 해석되는 경우에도 항상 재부팅을 식별하는 것입니다.
if [ $(readlink -f /vmlinuz) != /boot/vmlinuz-$(uname -r) ]; 그런 다음 '재부팅'을 에코합니다. 그렇지 않으면 '아니요'를 에코합니다. 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
답변1
다음 rpm 쿼리를 통해 설치된 최신 커널 버전을 안정적으로 확인할 수 있습니다.
rpm -q kernel --queryformat '%{installtime} %{version}-%{release}.%{arch}\n' | sort -n -k1 | tail -1 | cut -d ' ' -f 2
RHEL 7의 샘플 출력:
3.10.0-229.11.1.el7.x86_64
이제 출력이 uname -r
일치하는지 확인하십시오.
3.10.0-229.1.2.el7.x86_64
이 예에서는 일치하지 않으며 재부팅이 필요합니다.
테스트를 사용하여 문자열을 비교할 수 있습니다.
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
답변2
2021년의 답
@kawing-chiu가 언급했듯이그들의 대답, dnf
이제 needs-restarting
질문에 필요한 작업을 수행하는 모듈이 있습니다. 커널 변경에만 국한되지는 않지만 마지막 부팅 이후 시스템 패키지가 업데이트되었는지 확인합니다. 이 동작은 단순히 커널 버전과 설치된 패키지를 비교하는 것보다 훨씬 낫습니다.
dnf needs-restarting
모듈은 Ansible 모듈을 통해 액세스할 수 없지만 별칭을 통해 또는 를 사용하여 더 직접적으로 또는 을 사용하여 더 명시적으로 ansible.builtin.dnf
호출할 수 있습니다 .ansible.builtin.shell
ansible.builtin.command
needs-restarting -r
dnf needs-restarting -r
/usr/bin/dnf needs-restarting -r
이 -r
플래그는 루트 권한을 요구하지 않는 것으로 보이며 재부팅이 필요한지 여부만 보고합니다. 반환 코드는 0
재부팅이 필요하지 않은 경우와 재부팅이 1
필요한 경우입니다. 그러므로 우리는 다음과 같은 작업을 사용할 수 있어야 합니다.조엘 캐틴:
- 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
Reboot server
재부팅 작업을 수행하려면 이름을 지정하거나 수신 대기하는 핸들러도 필요합니다 . 다음과 같은 것이 트릭을 수행할 것입니다.
- name : Reboot server
ansible.builtin.reboot:
msg: "Reboot initiated by Ansible after OS update"
reboot_timeout: 3600
test_command: uptime
이 답변이 이 문제에 대한 해결책을 찾는 모든 사람에게 도움이 되기를 바랍니다.
답변3
오래된 스레드 - 그러나 이는 누군가에게 도움이 될 수 있는 빠른 Ansible 스크립트를 구성하는 데 도움이 되었습니다.
---
- 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)
답변4
또 다른 대안은 커널 업데이트를 별도로 수행하고 커널 업데이트가 필요한 경우 시스템을 다시 시작하도록 핸들러를 트리거하는 것입니다.
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: