Rhel
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
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”不存在)。