I used Azure Update Manager to centralize OS patching across Azure VMs and Azure Arc-enabled servers. I set up assessment, recurring maintenance schedules, Azure Policy onboarding, reporting, and staged rollouts.

The Azure Update Manager getting-started experience.

The Azure Update Manager getting-started experience.

Portal screens, pricing, supported regions, and service behavior change. The screenshots show my environment at the time. Check current Microsoft docs before building a production process from these exact settings.

The shots come from a few test runs. Machine counts and VM names differ between them. Early shots also show the old name, Update management center (Preview). It is the same tool.

Where Update Manager fits

With IaaS, Azure runs the platform but patching the guest OS is on me. Update Manager gives me one place to assess and install those updates.

The Update Manager architecture for Azure and Arc-enabled machines.

The Update Manager architecture for Azure and Arc-enabled machines.

Azure VMs use the Azure VM agent. Servers outside Azure can join once they’re connected through Azure Arc. The old Automation Update Management is retired. The new model doesn’t need that same Automation Account and Log Analytics setup.

What I checked first

Before setting anything up, I made sure I had:

  • An Azure subscription and an appropriate management scope
  • Owner or Contributor permissions for the configuration work
  • Supported Azure VMs or Azure Arc-enabled servers
  • A working Azure VM agent on Azure machines
  • Supported operating systems and regions

The older setup had a feature registration step for guest automatic patch assessment. I kept the screenshot for reference. It isn’t part of normal onboarding anymore.

The older guest automatic patch-assessment registration screen.

The older guest automatic patch-assessment registration screen.

1. Checking machines and compliance

For a single VM, I could open it and go to its update page.

Opening Update Manager from an individual VM.

Opening Update Manager from an individual VM.

For the whole fleet, I opened Update Manager in the portal.

The central Azure Update Manager dashboard.

The central Azure Update Manager dashboard.

The overview filters by subscription, resource group, location, and machine type. Machines with no recent assessment stood out right away.

The compliance-oriented Update Manager overview.

The compliance-oriented Update Manager overview.

2. Turning on periodic assessment

Periodic assessment checks machines for missing updates on a regular basis. I could turn it on for specific machines or use Azure Policy across a wider scope.

Enabling periodic update assessment.

Enabling periodic update assessment.

Update Manager has built-in policies for Azure VMs and Arc-enabled servers.

Built-in Azure Policy definitions for Update Manager.

Built-in Azure Policy definitions for Update Manager.

When assigning the policy, I picked the management group, subscription, or resource group.

Assigning the policy that configures periodic update checks.

Assigning the policy that configures periodic update checks.

I set the assessment mode to AutomaticByPlatform and picked the OS type. Windows and Linux may need separate assignments.

Configuring the assessment mode and operating-system type.

Configuring the assessment mode and operating-system type.

For existing resources, I created a remediation task so the policy would actually apply the setting.

Creating a remediation task for existing machines.

Creating a remediation task for existing machines.

Azure Policy then showed me which machines didn’t match the expected config.

Policy compliance for required system updates.

Policy compliance for required system updates.

3. Changing update settings

I could also change settings right from Update Manager.

Opening the machine update-settings workflow.

Opening the machine update-settings workflow.

I added the machines I wanted to configure.

Adding machines to the update-settings change.

Adding machines to the update-settings change.

Then I reviewed the list and confirmed the assessment and orchestration settings.

Reviewing the machines managed by Update Manager.

Reviewing the machines managed by Update Manager.

For customer-managed schedules on Azure VMs, these settings matter:

Patch mode = AutomaticByPlatform
BypassPlatformSafetyChecksOnUserSchedule = True

4. Building a recurring schedule

Recurring deployments use maintenance configurations. I created one that set the patch scope and maintenance window.

Creating an Azure maintenance configuration.

Creating an Azure maintenance configuration.

I picked a recurrence and window that fit. It could be weekly, monthly, or lined up with Patch Tuesday.

Defining the recurring maintenance schedule.

Defining the recurring maintenance schedule.

Dynamic scope picks machines by their properties. I didn’t have to maintain a fixed list by hand.

Adding a dynamic machine scope.

Adding a dynamic machine scope.

I added the Azure VMs and checked that their patch orchestration settings supported a customer-managed schedule.

Configuring Azure VMs for scheduled updates.

Configuring Azure VMs for scheduled updates.

Next I chose the update classifications and any specific KBs or packages to include.

Selecting update classifications and specific updates.

Selecting update classifications and specific updates.

I could also exclude classifications, KBs, or packages that shouldn’t install in this window.

Defining update inclusions and exclusions.

Defining update inclusions and exclusions.

Once created, the maintenance configuration became a reusable schedule.

The completed maintenance configuration.

The completed maintenance configuration.

I saved its Resource Manager ID. Policies and automation use it to point at the schedule.

Finding the maintenance configuration resource ID.

Finding the maintenance configuration resource ID.

5. Enrolling machines with Azure Policy

For a bigger environment, I used policy to link qualifying machines to the schedule. A management group assignment applies the same standard across many subscriptions.

Assigning recurring-update policy at management-group scope.

Assigning recurring-update policy at management-group scope.

I picked the built-in policy for recurring updates.

The recurring-update policy assignment.

The recurring-update policy assignment.

It needed the maintenance configuration’s resource ID.

Supplying the maintenance configuration ARM ID.

Supplying the maintenance configuration ARM ID.

I read the optional filters carefully. They decide which resources qualify.

Optional policy parameters and resource filters.

Optional policy parameters and resource filters.

Remediation needed to create assignments, so I created a managed identity for the policy assignment.

Creating the managed identity used for remediation.

Creating the managed identity used for remediation.

I gave that identity Contributor.

Granting the managed identity permissions for recurring schedules.

Granting the managed identity permissions for recurring schedules.

In production I’d swap that for a custom role with only the actions remediation needs. After deploying, I checked the remediation tasks. One completed and one failed, so I looked into the failure before trusting the schedule.

Remediation tasks for the recurring-update policy. One completed and one failed.

Remediation tasks for the recurring-update policy. One completed and one failed.

6. Monitoring results

Update Manager exposes its data through Azure Resource Graph.

Update Manager logs and Resource Graph access.

Update Manager logs and Resource Graph access.

Three useful categories:

Patchassessmentresources
Patchinstallationresources
Maintenanceresources

I used this query to see installed patches:

patchinstallationresources
| extend Date = tostring(properties.lastModifiedDateTime)
| extend Status = tostring(properties.installationState)
| extend PatchName = tostring(properties.patchName)
| extend KBID = tostring(properties.kbId)
| extend ID = split(id,"/")
| extend VMName = ID[8]
| mv-expand Classification = properties.classifications
| where Status == "Installed"
| project Date, VMName, Classification, PatchName, KBID
Querying installed patch resources.

Querying installed patch resources.

To find machines with failures or warnings in the last day:

patchinstallationresources
| where type in~ ("microsoft.compute/virtualmachines/patchinstallationresults",
                  "microsoft.hybridcompute/machines/patchinstallationresults")
| where properties.status in~ ("Failed", "CompletedWithWarnings")
| where properties.lastModifiedDateTime > ago(1d)
| parse id with vmResourceId "/patchInstallationResults" *
| project vmResourceId
| distinct vmResourceId

And to see which VMs had periodic assessment on:

resources
| where type =~ "microsoft.compute/virtualmachines"
| where properties.storageProfile.osDisk.osType in~ ('Windows','Linux')
| extend patchSettingsObject =
    iff(properties.storageProfile.osDisk.osType =~ "windows",
        properties.osProfile.windowsConfiguration.patchSettings,
        properties.osProfile.linuxConfiguration.patchSettings)
| extend assessMode = tostring(patchSettingsObject.assessmentMode)
| extend periodicAssessment =
    iff(isnotnull(assessMode) and assessMode =~ "AutomaticByPlatform", "Yes", "No")
Checking periodic-assessment status with Resource Graph.

Checking periodic-assessment status with Resource Graph.

An Azure Workbook gave me a more visual summary.

The Update reports workbook gallery.

The Update reports workbook gallery.

The built-in reports are another way to review compliance and deployments.

Update Manager reports.

Update Manager reports.

7. Staged patch rings

Patching everything at once is asking for trouble. I set up a staged model that moves updates through dev, pre-production, and production rings.

A staged patching model for Azure Update Manager.

A staged patching model for Azure Update Manager.

It combines maintenance configurations with Azure Automation. Later stages only get created after earlier ones have had time to prove out.

Azure Automation coordinating staged maintenance.

Azure Automation coordinating staged maintenance.

The Automation Account needs modules like Az.Accounts, Az.Resources, and Az.ResourceGraph. I also created a custom role with read access plus the maintenance configuration, assignment, and deployment actions the runbook needs.

Assigning the staged-patching custom role to the Automation Account identity.

Assigning the staged-patching custom role to the Automation Account identity.

I imported the Create-StagedMaintenanceConfiguration.ps1 runbook.

Importing the staged-maintenance runbook.

Importing the staged-maintenance runbook.

Machines get grouped with tags like:

aum-stage=dev
aum-stage=preprod
aum-stage=prod
aum-stage=prod-ha-instance1
aum-stage=prod-ha-instance2

I also grouped by OS with tags like os-name=windows2022 or os-name=ubuntu22. Then I created the first maintenance schedule for one OS group.

Creating a maintenance schedule for an operating-system group.

Creating a maintenance schedule for an operating-system group.

Then I linked the runbook schedule.

Linking the runbook schedule.

Linking the runbook schedule.

The runbook takes the maintenance configuration ID and a JSON stage definition. That definition can set delay offsets, subscriptions, resource types, tags, locations, and OS.

Parameters for the next staged maintenance configuration.

Parameters for the next staged maintenance configuration.

Now the delay between rings is written down and repeatable. Nobody has to kick off each stage by hand.

8. The Updates view

The Updates blade starts from pending updates, not machines. It’s handy when the question is “Which updates are missing, and where?”

The pending-updates view in Azure Update Manager.

The pending-updates view in Azure Update Manager.

9. Governance with policy

Azure Policy holds it all together. It enforces assessment settings, maintenance assignments, and schedules across the hierarchy.

Test policy assignments on a small resource group before rolling them out to a management group. That goes double when remediation or managed identity permissions are involved.

10. Migrating from Automation Update Management

If you still have the retired Automation Update Management setup, Microsoft has a migration tool inside the Automation Account.

The Update Management migration tool.

The Update Management migration tool.

It checks prerequisites, migrates workloads, and lists what to do after.

The guided migration to Azure Update Manager.

The guided migration to Azure Update Manager.

Complex schedules may need extra work. That’s especially true if they use pre/post tasks or saved-search queries. Any deadlines in older migration material are out of date. Check current Microsoft guidance.

The order I’d roll it out

For a real deployment I’d go in this order:

Inventory Azure and Arc-enabled servers
        |
Confirm operating-system and agent support
        |
Enable periodic assessment
        |
Review compliance and missing updates
        |
Create maintenance configurations
        |
Define schedules and update classifications
        |
Enroll machines with static or dynamic scopes
        |
Use Azure Policy for wider governance
        |
Monitor installation results
        |
Introduce staged rings for production

What I learned

The big win is that assessment, scheduling, installation, and reporting all live in Azure’s own management plane. Maintenance configurations give repeatable windows. Azure Policy scales enrollment. Resource Graph shows what actually happened. Staged rings keep an unproven update from hitting everything at once.

The tool doesn’t replace patch governance. I still need clear owners, tested windows, rollback plans, exception handling, and a process for failed installs. What it gives me is one place to apply that process across a mixed set of servers.