Rhel

Ansible 2.8:如何僅在核心更新後重啟機器?評估數組變數

  • April 30, 2021

我正在嘗試使用 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   

when Condition 怎麼可能會找到“kernel”這個詞?

任何的想法?

一個簡單的解決方案是展平列表,選擇與模式匹配的項目並測試是否有任何項目滿足條件。

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

使用已接受的答案https://unix.stackexchange.com/a/554727/307127中所示的 flatten 過濾器將包名稱和版本混合到一個列表中。儘管這不太可能引起任何問題,但它可能不是一個乾淨的。

相反,您可以將重啟測試編寫為

when: dict((yum_updates.changes|default(dict())).updated|default([])).kernel is defined

這會將更改的包和版本列表轉換為字典(以包名作為鍵,版本作為值),然後測試字典是否包含鍵“核心”。請注意在兩個地方使用“預設”過濾器來覆蓋邊緣情況,例如沒有更新包時。這是必要的,因為當沒有更新包時,註冊變數中不存在“changes”鍵(即“yum_updates.changes”不存在)。

引用自:https://unix.stackexchange.com/questions/554692