2021년의 답

2021년의 답

/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.shellansible.builtin.commandneeds-restarting -rdnf 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:

관련 정보