Ansible 2.8: 커널 업데이트 후에만 머신을 재부팅하는 방법은 무엇입니까? 배열 변수 계산

Ansible 2.8: 커널 업데이트 후에만 머신을 재부팅하는 방법은 무엇입니까? 배열 변수 계산

커널이 업데이트되면 자동으로 머신을 재부팅하는 Ansible Playbook을 사용하여 RHEL7 머신을 업데이트하려고 합니다.

이것이 내가 생각해낸 것입니다:

---
- hosts:  server1
  become: yes
  tasks:
    - name: YUM Update
      yum:
        name:  "*"
        state: latest
      register: yum_updates

    - debug:
        var: yum_updates.changes.updated

    - name: Reboot server1
      reboot:
      when: '"kernel" in yum_updates.changes.updated'
...

물론 지금까지는 업데이트가 작동하지만 필요한 방식으로 출력 변수를 평가하는 방법을 찾을 수 없습니다. 출력은 다음과 같습니다.

PLAY [server1] *********************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************************
ok: [server1]

TASK [YUM Update] **************************************************************************************************************************************************************************************
changed: [server1]

TASK [debug] *******************************************************************************************************************************************************************************************
ok: [de-agb1-smba01t] => {
    "yum_updates.changes.updated": [
        [
            "kernel-headers", 
            "3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms"
        ], 
        [
            "kernel", 
            "3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms"
        ], 
        [
            "sudo", 
            "1.8.23-4.el7_7.1.x86_64 from rhel-7-server-rpms"
        ], 
        [
            "bpftool", 
            "3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms"
        ], 
        [
            "python-perf", 
            "3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms"
        ], 
        [
            "kernel-tools-libs", 
            "3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms"
        ], 
        [
            "kernel-devel", 
            "3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms"
        ], 
        [
            "microcode_ctl", 
            "2:2.1-53.3.el7_7.x86_64 from rhel-7-server-rpms"
        ], 
        [
            "SDL", 
            "1.2.15-14.el7_7.x86_64 from rhel-7-server-rpms"
        ], 
        [
            "kernel-tools", 
            "3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms"
        ], 
        [
            "perf", 
            "3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms"
        ]
    ]
}

TASK [Reboot server1] **************************************************************************************************************************************************************************************
skipping: [server1]

PLAY RECAP *********************************************************************************************************************************************************************************************
server1            : ok=3    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

"kernel"이라는 단어를 찾으면 조건은 어떻게 보일까요?

어떤 아이디어가 있나요?

답변1

허용되는 답변에 표시된 대로 평면화 필터를 사용하십시오.https://unix.stackexchange.com/a/554727/307127패키지 이름과 버전을 목록으로 혼합합니다. 이로 인해 문제가 발생할 가능성은 없지만 그만큼 깨끗하지는 않습니다.

대신, 재시작된 테스트를 다음과 같이 작성할 수 있습니다.
when: dict((yum_updates.changes|default(dict())).updated|default([])).kernel is defined

이는 변경된 패키지 및 버전 목록을 사전(패키지 이름을 키로, 버전을 값으로 사용)으로 변환한 다음 사전에 "커널" 키가 포함되어 있는지 테스트합니다. "기본" 필터는 패키지가 업데이트되지 않는 경우와 같은 극단적인 경우를 처리하기 위해 두 위치에서 사용됩니다. 패키지가 업데이트되지 않으면 "changes" 키가 등록 변수에 존재하지 않기 때문에 이 작업이 필요합니다(예: "yum_updates.changes"가 존재하지 않음).

답변2

간단한 해결책은단조롭게 하다목록, 항목 선택성냥패턴과시험항목이 기준을 충족하는 경우.

when: yum_updates.changes.updated|flatten|select('regex', '^kernel$') is any

답변3

yum.updates.changes.updated각 항목이 두 항목(패키지 이름 및 버전)의 목록인 목록( )이 있습니다 . 패키지만 일치하는 간단한 When 조건은 kernel다음과 같습니다.

---
- debug:
    msg: "{{ item.0 }} was updated to version {{ item.1 }}"
  when: item.0 == "kernel"
  loop: "{{ yum_updates.changes.updated }}"

샘플 데이터를 기반으로 이 작업은 다음을 출력합니다.

TASK [debug] *****************************************************************************************************************************************************************
skipping: [localhost] => (item=['kernel-headers', '3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms'])
ok: [localhost] => (item=['kernel', '3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms']) => {
    "msg": "kernel was updated to version 3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms"
}
skipping: [localhost] => (item=['sudo', '1.8.23-4.el7_7.1.x86_64 from rhel-7-server-rpms'])
skipping: [localhost] => (item=['bpftool', '3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms'])
skipping: [localhost] => (item=['python-perf', '3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms'])
skipping: [localhost] => (item=['kernel-tools-libs', '3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms'])
skipping: [localhost] => (item=['kernel-devel', '3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms'])
skipping: [localhost] => (item=['microcode_ctl', '2:2.1-53.3.el7_7.x86_64 from rhel-7-server-rpms'])
skipping: [localhost] => (item=['SDL', '1.2.15-14.el7_7.x86_64 from rhel-7-server-rpms'])
skipping: [localhost] => (item=['kernel-tools', '3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms'])
skipping: [localhost] => (item=['perf', '3.10.0-1062.4.3.el7.x86_64 from rhel-7-server-rpms'])

관련 정보