Task 05: Configure Azure Update Manager
DOCUMENT CATEGORY: Runbook SCOPE: Patch management and update orchestration PURPOSE: Configure Azure Update Manager for Azure Local clusters and Arc-enabled servers MASTER REFERENCE: Microsoft Learn - Azure Update Manager
Status: Active
Azure Update Manager provides centralized patch management for Azure Local clusters, Arc-enabled servers, and Azure VMs. It enables update assessment, scheduling, and compliance reporting without requiring additional agents or Log Analytics workspace dependencies.
Overview
Azure Update Manager is a native capability that works directly with:
- Azure Local cluster nodes (Arc-enabled)
- Arc-enabled Windows and Linux servers
- Azure VMs
- Arc-enabled VMware vSphere and SCVMM machines
Unlike legacy Azure Automation Update Management, Azure Update Manager does not require Log Analytics workspace or Automation account. All data is stored in Azure Resource Graph.
Prerequisites
| Requirement | Description | Validation |
|---|---|---|
| Azure Arc connectivity | Cluster nodes and servers Arc-enabled | Arc agents reporting connected |
| VM agent (Azure VMs) | Azure VM agent running | Agent status healthy |
| Outbound connectivity | Access to Windows Update or WSUS | Port 443, 80 outbound |
| RBAC permissions | Contributor or Update Manager role | On resource scope |
| Maintenance windows | Defined change windows | Documented in ITSM |
Variables from variables.yml
| Variable | Config Path | Example |
|---|---|---|
AZURE_SUBSCRIPTION_ID | azure.subscription.id | 00000000-0000-0000-0000-000000000000 |
AZURE_RESOURCE_GROUP | azure.resource_group.name | rg-azurelocal-prod-eus2 |
AZURE_REGION | azure.resource_group.location | eastus2 |
MACHINE_NAME | nodes[0].name | azl-dal-node-01 |
MAINTENANCE_CONFIG_NAME | patching.maintenance_config_name | mc-prod-saturday-patch |
MAINTENANCE_START_TIME | patching.start_time | 23:00 |
MAINTENANCE_DURATION | patching.duration_hours | 3 |
TIME_ZONE | patching.time_zone | Central Standard Time |
Architecture
Azure Update Manager uses extensions managed by the Azure VM agent or Arc agent:
| Platform | Extensions Installed |
|---|---|
| Azure VMs (Windows) | Microsoft.CPlat.Core.WindowsPatchExtension |
| Azure VMs (Linux) | Microsoft.CPlat.Core.LinuxPatchExtension |
| Arc-enabled (Windows) | WindowsPatchExtension (assessment) + WindowsOsUpdateExtension (patching) |
| Arc-enabled (Linux) | LinuxPatchExtension (assessment) + LinuxOsUpdateExtension (patching) |
Extensions are automatically installed when Update Manager operations are triggered.
Configuration Steps
Step 5.1: Enable Periodic Assessment
Enable automatic update assessment to continuously check for available updates:
- Azure Portal
- Direct Script (On Node)
- Standalone Script
For individual machines:
- Navigate to Azure Arc → Machines (or Virtual machines for Azure VMs)
- Select the machine
- Go to Updates → Settings
- Enable Periodic assessment: Set to On
- Click Save
For multiple machines at scale:
- Navigate to Azure Update Manager → Overview
- Click Settings → Update settings
- Select subscription and resource groups
- Filter to machines of interest
- Select machines and click Configure
- Set Periodic assessment to On
- Click Save
# Enable periodic assessment for Arc-enabled server
az connectedmachine machine-extension update \
--resource-group "{{AZURE_RESOURCE_GROUP}}" \
--machine-name "{{MACHINE_NAME}}" \
--name "WindowsPatchExtension" \
--settings '{"patchMode": "AutomaticByPlatform", "assessmentMode": "AutomaticByPlatform"}'
# Enable periodic assessment via Azure Policy (recommended for scale)
$policyDefinition = Get-AzPolicyDefinition |
Where-Object { $_.Properties.DisplayName -like "*periodic assessment*" }
# Assign policy to resource group
New-AzPolicyAssignment `
-Name "EnablePeriodicAssessment" `
-PolicyDefinition $policyDefinition `
-Scope "/subscriptions/{{AZURE_SUBSCRIPTION_ID}}/resourceGroups/{{AZURE_RESOURCE_GROUP}}"
Use Azure Policy to enable periodic assessment at scale. Built-in policies:
Configure periodic checking for missing system updates on Azure Arc-enabled serversConfigure periodic checking for missing system updates on Azure virtual machines
Step 5.2: Check for Updates (On-Demand)
Perform immediate update assessment:
- Azure Portal
- Direct Script (On Node)
- Standalone Script
- Navigate to Azure Update Manager → Overview
- Click Check for updates
- Select machines to assess
- Click Check for updates
- Monitor progress in History tab
# Trigger update assessment for Arc-enabled server
az rest --method post \
--uri "https://management.azure.com/subscriptions/{{AZURE_SUBSCRIPTION_ID}}/resourceGroups/{{AZURE_RESOURCE_GROUP}}/providers/Microsoft.HybridCompute/machines/{{MACHINE_NAME}}/assessPatches?api-version=2024-03-01-preview"
# Check for updates on Arc-enabled server
Invoke-AzRestMethod -Method POST `
-Path "/subscriptions/{{AZURE_SUBSCRIPTION_ID}}/resourceGroups/{{AZURE_RESOURCE_GROUP}}/providers/Microsoft.HybridCompute/machines/{{MACHINE_NAME}}/assessPatches?api-version=2024-03-01-preview"
Step 5.3: Create Maintenance Configuration
Define scheduled maintenance windows for automated patching:
- Azure Portal
- Direct Script (On Node)
- Navigate to Azure Update Manager → Machines
- Click Scheduled updates → Create a maintenance configuration
- Configure basics:
- Name:
{{MAINTENANCE_CONFIG_NAME}} - Resource group:
{{AZURE_RESOURCE_GROUP}} - Region:
{{AZURE_REGION}} - Maintenance scope: Guest (Azure VM, Azure Arc-enabled VMs/servers)
- Configure schedule:
- Start date and time:
{{MAINTENANCE_START_TIME}} - Duration:
{{MAINTENANCE_DURATION}}hours - Time zone:
{{TIME_ZONE}} - Recurrence: Weekly/Monthly
- Configure updates:
- Windows:
- Classifications: Critical, Security, Update Rollup, Definition
- KB numbers to include/exclude (optional)
- Linux:
- Classifications: Critical, Security
- Packages to include/exclude (optional)
- Configure reboot option:
- IfRequired: Reboot only if updates require it
- AlwaysReboot: Always reboot after updates
- NeverReboot: Never reboot (may leave updates pending)
- Click Review + create
# Create maintenance configuration
az maintenance configuration create \
--resource-group "{{AZURE_RESOURCE_GROUP}}" \
--name "{{MAINTENANCE_CONFIG_NAME}}" \
--location "{{AZURE_REGION}}" \
--maintenance-scope "InGuestPatch" \
--install-patches-linux-classifications "Critical" "Security" \
--install-patches-windows-classifications "Critical" "Security" "UpdateRollup" \
--reboot-setting "IfRequired" \
--start-date-time "{{MAINTENANCE_START_DATETIME}}" \
--duration "02:00" \
--time-zone "{{TIME_ZONE}}" \
--recurrence "Week" \
--day-of-week "Saturday"
Step 5.4: Assign Machines to Maintenance Configuration
Associate machines with maintenance schedules:
- Azure Portal
- Direct Script (On Node)
- Navigate to maintenance configuration
- Go to Resources → Add
- Select machines to include
- Click Add
Or use Dynamic Scopes:
- Go to Dynamic scopes → Add a dynamic scope
- Configure filters:
- Subscriptions
- Resource groups
- Resource types
- Tags (e.g.,
Environment=Production)
- Click Save
# Assign Arc-enabled server to maintenance configuration
az maintenance assignment create \
--resource-group "{{AZURE_RESOURCE_GROUP}}" \
--name "assignment-{{MACHINE_NAME}}" \
--maintenance-configuration-id "/subscriptions/{{AZURE_SUBSCRIPTION_ID}}/resourceGroups/{{AZURE_RESOURCE_GROUP}}/providers/Microsoft.Maintenance/maintenanceConfigurations/{{MAINTENANCE_CONFIG_NAME}}" \
--provider-name "Microsoft.HybridCompute" \
--resource-type "machines" \
--resource-name "{{MACHINE_NAME}}"
Use dynamic scopes with tag-based filtering for automatic inclusion of new machines matching criteria.
Step 5.5: Install Updates (On-Demand)
For immediate patching outside maintenance windows:
- Azure Portal
- Standalone Script
- Navigate to Azure Update Manager → Machines
- Select machines to update
- Click One-time update
- Configure:
- Machines: Selected or add more
- Updates: All or specific classifications/KBs
- Reboot option: IfRequired, AlwaysReboot, or NeverReboot
- Click Install
- Monitor progress in History
# Install updates on Arc-enabled server via REST API
$body = @{
maximumDuration = "PT2H"
rebootSetting = "IfRequired"
windowsParameters = @{
classificationsToInclude = @("Critical", "Security")
kbNumbersToExclude = @()
}
} | ConvertTo-Json -Depth 4
Invoke-AzRestMethod -Method POST `
-Path "/subscriptions/{{AZURE_SUBSCRIPTION_ID}}/resourceGroups/{{AZURE_RESOURCE_GROUP}}/providers/Microsoft.HybridCompute/machines/{{MACHINE_NAME}}/installPatches?api-version=2024-03-01-preview" `
-Payload $body
Step 5.6: Configure Azure Local Cluster Updates
For Azure Local clusters specifically:
Azure Local 23H2 and later uses Lifecycle Manager (LCM) for cluster-aware updates. Azure Update Manager integrates with LCM for orchestrated updates.
- Navigate to Azure Local → Select cluster → Updates
- Review available updates (Platform, Solution Extension, OS)
- Click Check for updates to refresh
- Review update readiness checks
- Click Install to begin update orchestration
LCM handles:
- Pre-update health checks
- Cluster-aware rolling updates
- Node drain and resume
- Post-update validation
Step 5.7: Configure Alerts
Set up alerts for update compliance:
- Azure Portal
- Navigate to Azure Update Manager → Settings → Alerts
- Click Create alert rule
- Configure conditions:
- Update assessment: Machines with pending critical updates
- Compliance: Machines not compliant with maintenance configuration
- Configure action group for notifications
- Click Create
Validation
Check Update Compliance
- Azure Portal
- Standalone Script
- Navigate to Azure Update Manager → Overview
- Review compliance dashboard:
- Machines with pending updates
- Critical/Security updates pending
- Machines needing attention
# Query update compliance via Azure Resource Graph
$query = @"
patchassessmentresources
| where type == 'microsoft.hybridcompute/machines/patchassessmentresults'
| extend machineId = tostring(split(id, '/patchAssessmentResults')[0])
| extend criticalUpdates = properties.availablePatchCountByClassification.critical
| extend securityUpdates = properties.availablePatchCountByClassification.security
| project machineId, criticalUpdates, securityUpdates, lastModified = properties.lastModifiedDateTime
"@
Search-AzGraph -Query $query
Verify Extension Installation
# On Arc-enabled server, check extensions
az connectedmachine machine-extension list \
--resource-group "{{AZURE_RESOURCE_GROUP}}" \
--machine-name "{{MACHINE_NAME}}" \
--output table
Expected extensions:
WindowsPatchExtensionorLinuxPatchExtension(assessment)WindowsOsUpdateExtensionorLinuxOsUpdateExtension(patching)
Validation Checklist
| Component | Verification | Expected Result |
|---|---|---|
| Periodic assessment | Machine settings | Enabled |
| Extension installed | Extension list | Provisioning succeeded |
| Update visibility | Update Manager → Machine | Updates listed |
| Maintenance config | Configuration status | Active, machines assigned |
| Schedule execution | History tab | Successful runs |
Monitoring
Azure Workbooks
Use built-in workbooks for update reporting:
- Navigate to Azure Update Manager → Workbooks
- Available workbooks:
- Update compliance - Compliance across all machines
- Update deployment status - Scheduled deployment results
- Machine updates - Per-machine update history
Azure Resource Graph Queries
// Machines with critical updates pending
patchassessmentresources
| where type == 'microsoft.hybridcompute/machines/patchassessmentresults'
| extend critical = toint(properties.availablePatchCountByClassification.critical)
| where critical > 0
| project
Machine = tostring(split(id, '/patchAssessmentResults')[0]),
CriticalUpdates = critical,
LastAssessment = todatetime(properties.lastModifiedDateTime)
| order by CriticalUpdates desc
// Update installation history
patchinstallationresources
| where type == 'microsoft.hybridcompute/machines/patchinstallationresults'
| extend status = tostring(properties.status)
| extend installedCount = toint(properties.installedPatchCount)
| summarize
TotalInstalled = sum(installedCount),
SuccessCount = countif(status == 'Succeeded'),
FailedCount = countif(status == 'Failed')
by bin(todatetime(properties.lastModifiedDateTime), 1d)
Troubleshooting
| Symptom | Likely Cause | Resolution |
|---|---|---|
| Updates not showing | Assessment not run | Trigger manual assessment |
| Extension not installing | Agent connectivity | Check Arc agent status |
| Scheduled patch fails | Maintenance window too short | Increase duration |
| Reboot not occurring | Reboot setting misconfigured | Verify IfRequired/AlwaysReboot |
| WSUS updates not detected | WSUS connectivity | Verify WSUS server reachable |
| Group Policy conflict | GPO overriding settings | Review Windows Update GPOs |
Extension Troubleshooting
# Check extension logs (Windows)
Get-Content "C:\WindowsAzure\Logs\Plugins\Microsoft.CPlat.Core.WindowsPatchExtension\*\CommandExecution.log" -Tail 50
# Reinstall extension if needed
az connectedmachine machine-extension delete \
--resource-group "{{AZURE_RESOURCE_GROUP}}" \
--machine-name "{{MACHINE_NAME}}" \
--name "WindowsPatchExtension"
# Extension will auto-reinstall on next operation
Best Practices
| Practice | Recommendation |
|---|---|
| Classification selection | Always include Critical and Security |
| Maintenance duration | Minimum 2 hours for thorough patching |
| Reboot handling | Use IfRequired for most scenarios |
| Pre/post scripts | Use for application-specific actions |
| Dynamic scopes | Tag-based for automatic inclusion |
| Testing | Patch dev/test before production |
Variables Reference
| Variable | Description | Example |
|---|---|---|
{{MAINTENANCE_CONFIG_NAME}} | Maintenance configuration name | mc-prod-saturday-patch |
{{MAINTENANCE_START_TIME}} | Scheduled start time | 23:00 |
{{MAINTENANCE_DURATION}} | Duration in hours | 3 |
{{TIME_ZONE}} | Time zone for schedule | Central Standard Time |
Next Steps
After configuring Azure Update Manager:
- ➡️ Phase 21: Licensing and Telemetry — Configure Azure Benefits and Windows licensing
- Create update rings (dev → test → prod)
- Document exception procedures for emergency patches
- Configure compliance alerts and notifications
- Schedule monthly patch review meetings
Navigation
| Previous | Up | Next |
|---|---|---|
| ← Task 04: Security Logging | Phase 04: Security & Governance | Phase 05: Licensing & Telemetry → |
| Version | Date | Author | Changes |
|---|---|---|---|
| 1.0.0 | 2026-03-24 | Azure Local Cloudnology Team | Initial release |