Add windows_patch role — KB version tracking, reboot detection, category filtering
This commit is contained in:
@@ -1,2 +1,11 @@
|
|||||||
---
|
---
|
||||||
# windows_patch default variables
|
auto_reboot: false
|
||||||
|
pre_patch_reboot: false
|
||||||
|
packages_updated: []
|
||||||
|
windows_hotfixes_before: []
|
||||||
|
windows_hotfixes_after: []
|
||||||
|
windows_update_categories:
|
||||||
|
- SecurityUpdates
|
||||||
|
- CriticalUpdates
|
||||||
|
- UpdateRollups
|
||||||
|
- DefinitionUpdates
|
||||||
|
|||||||
@@ -1,6 +1,95 @@
|
|||||||
---
|
---
|
||||||
# windows_patch tasks
|
- name: Check for pending reboot before patching
|
||||||
# Implementation to follow
|
ansible.windows.win_reboot:
|
||||||
- name: Placeholder
|
reboot_timeout: 300
|
||||||
|
pre_reboot_delay: 10
|
||||||
|
post_reboot_delay: 30
|
||||||
|
msg: "Rebooting to clear pending reboot state before patching"
|
||||||
|
when: pre_patch_reboot | bool
|
||||||
|
|
||||||
|
- name: Get installed updates before patching
|
||||||
|
ansible.windows.win_shell: |
|
||||||
|
Get-HotFix | Select-Object -Property HotFixID, Description, InstalledOn | ConvertTo-Json
|
||||||
|
register: hotfixes_before
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Store pre-patch hotfix list
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
windows_hotfixes_before: "{{ hotfixes_before.stdout | from_json }}"
|
||||||
|
|
||||||
|
- name: Search for available updates
|
||||||
|
ansible.windows.win_updates:
|
||||||
|
category_names: "{{ windows_update_categories }}"
|
||||||
|
state: searched
|
||||||
|
register: updates_available
|
||||||
|
|
||||||
|
- name: Log available updates
|
||||||
ansible.builtin.debug:
|
ansible.builtin.debug:
|
||||||
msg: "windows_patch role - tasks to be implemented"
|
msg: "{{ updates_available.found_update_count }} updates available on {{ inventory_hostname }}"
|
||||||
|
|
||||||
|
- name: Install Windows updates
|
||||||
|
ansible.windows.win_updates:
|
||||||
|
category_names: "{{ windows_update_categories }}"
|
||||||
|
state: installed
|
||||||
|
reboot: false
|
||||||
|
register: windows_update_result
|
||||||
|
when: updates_available.found_update_count > 0
|
||||||
|
|
||||||
|
- name: Get installed updates after patching
|
||||||
|
ansible.windows.win_shell: |
|
||||||
|
Get-HotFix | Select-Object -Property HotFixID, Description, InstalledOn | ConvertTo-Json
|
||||||
|
register: hotfixes_after
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Store post-patch hotfix list
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
windows_hotfixes_after: "{{ hotfixes_after.stdout | from_json }}"
|
||||||
|
|
||||||
|
- name: Build list of newly installed KBs
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
packages_updated: >-
|
||||||
|
{%- set before_ids = windows_hotfixes_before | map(attribute='HotFixID') | list -%}
|
||||||
|
{%- set updated = [] -%}
|
||||||
|
{%- for fix in windows_hotfixes_after -%}
|
||||||
|
{%- if fix.HotFixID not in before_ids -%}
|
||||||
|
{%- set _ = updated.append({
|
||||||
|
'name': fix.HotFixID,
|
||||||
|
'version_before': 'not installed',
|
||||||
|
'version_after': fix.InstalledOn,
|
||||||
|
'type': fix.Description
|
||||||
|
}) -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
{{ updated }}
|
||||||
|
|
||||||
|
- name: Log newly installed KBs
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg: "Installed: {{ item.name }} — {{ item.type }}"
|
||||||
|
loop: "{{ packages_updated }}"
|
||||||
|
|
||||||
|
- name: Check if reboot is required
|
||||||
|
ansible.windows.win_shell: |
|
||||||
|
$rebootPending = $false
|
||||||
|
if (Get-Item "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired" -ErrorAction SilentlyContinue) { $rebootPending = $true }
|
||||||
|
if (Get-Item "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations" -ErrorAction SilentlyContinue) { $rebootPending = $true }
|
||||||
|
Write-Output $rebootPending
|
||||||
|
register: windows_reboot_check
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Set reboot required fact
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
host_reboot_required: "{{ windows_reboot_check.stdout | trim | bool }}"
|
||||||
|
|
||||||
|
- name: Reboot if required and auto_reboot is enabled
|
||||||
|
ansible.windows.win_reboot:
|
||||||
|
reboot_timeout: 300
|
||||||
|
pre_reboot_delay: 10
|
||||||
|
post_reboot_delay: 60
|
||||||
|
msg: "Rebooting after patch run — initiated by Ansible"
|
||||||
|
when:
|
||||||
|
- host_reboot_required | bool
|
||||||
|
- auto_reboot | bool
|
||||||
|
|
||||||
|
- name: Patching complete
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg: "Windows patching complete on {{ inventory_hostname }} — {{ packages_updated | length }} KBs installed"
|
||||||
|
|||||||
Reference in New Issue
Block a user