Happy Holidays! Here’s a quick post to share some code that will inventory Azure VMs, install the AMA if necessary, and then assign a DCR to the VM.
# Ensure you're logged in to Azure Connect-AzAccount # Define the Data Collection Rule (DCR) resource ID $dcrResourceId = "<Your-DCR-Resource-ID>" # Get all VMs in the subscription $vms = Get-AzVM # Use ForEach-Object with -Parallel to process VMs concurrently $vms | ForEach-Object -Parallel { $vm = $_ $osType = $vm.StorageProfile.OsDisk.OsType $extensionName = if ($osType -eq "Windows") { "AzureMonitorWindowsAgent" } else { "AzureMonitorLinuxAgent" } $extensionPublisher = "Microsoft.Azure.Monitor" $vmResourceId = "/subscriptions/$using:vm.SubscriptionId/resourceGroups/$using:vm.ResourceGroupName/providers/Microsoft.Compute/virtualMachines/$using:vm.Name" try { # Check if the Azure Monitor Agent extension is installed $amaExtension = Get-AzVMExtension -ResourceGroupName $using:vm.ResourceGroupName -VMName $using:vm.Name -Name $extensionName -ErrorAction SilentlyContinue if (-not $amaExtension) { try { # Install the Azure Monitor Agent extension Set-AzVMExtension -ResourceGroupName $using:vm.ResourceGroupName -VMName $using:vm.Name -Name $extensionName -Publisher $extensionPublisher -ExtensionType $extensionName -TypeHandlerVersion "1.0" -Location $using:vm.Location Write-Host "Installed Azure Monitor Agent on $($using:vm.Name)" } catch { Write-Host "Failed to install Azure Monitor Agent on $($using:vm.Name): $_" } } else { Write-Host "Azure Monitor Agent is already installed on $($using:vm.Name)" } } catch { Write-Host "Error checking Azure Monitor Agent on $($using:vm.Name): $_" } try { # Assign the DCR to the VM $settings = @{ "dataCollectionRuleResourceIds" = @($using:dcrResourceId) } Set-AzVMExtension -ResourceGroupName $using:vm.ResourceGroupName -VMName $using:vm.Name -Name "AzureMonitorVmExtension" -Publisher $extensionPublisher -ExtensionType $extensionName -Settings $settings -Location $using:vm.Location Write-Host "Assigned DCR to $($using:vm.Name)" } catch { Write-Host "Failed to assign DCR to $($using:vm.Name): $_" } } -ThrottleLimit 5 # Adjust the ThrottleLimit as necessary