SOLVED

Connect OMS on multiple VMs

%3CLINGO-SUB%20id%3D%22lingo-sub-148023%22%20slang%3D%22en-US%22%3EConnect%20OMS%20on%20multiple%20VMs%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-148023%22%20slang%3D%22en-US%22%3E%3CP%3EHi%20all%3C%2FP%3E%0A%3CP%3EI'm%20managing%20a%20subscription%20with%20400%20VMs.%3CBR%20%2F%3EI%20need%20to%20connect%20them%20all%20to%20one%20OMS%20workspace.%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EIs%20there%20any%20way%20to%20perform%20this%20by%20Powershell%20without%20manually%20connecting%20one%20by%20one%20in%20the%20portal%3F%3CBR%20%2F%3E%3CBR%20%2F%3EThanks%20in%20advance.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-148023%22%20slang%3D%22en-US%22%3E%3CLINGO-LABEL%3EAgents%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EAzure%20Log%20Analytics%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-251360%22%20slang%3D%22en-US%22%3ERe%3A%20Connect%20OMS%20on%20multiple%20VMs%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-251360%22%20slang%3D%22en-US%22%3E%3CP%3EHi%20Dante%2C%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3Eyou%20can%20use%20this.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EAdd-AzureRmAccount%3C%2FP%3E%3CP%3ESet-AzureRmContext%20-Subscriptionid%20%3CYOUR%20sub%3D%22%22%20id%3D%22%22%3E%3C%2FYOUR%3E%3C%2FP%3E%3CP%3E%24workspaceName%20%3D%20%22%3CYOUR%20oms%3D%22%22%20workspace%3D%22%22%20name%3D%22%22%3E%22%3C%2FYOUR%3E%3C%2FP%3E%3CP%3E%24resourcegroup%20%3D%20%22%3CYOUR%20oms%3D%22%22%3E%22%3C%2FYOUR%3E%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%24workspaceId%20%3D%20%22%3CWORKSPACE%20id%3D%22%22%3E%22%3C%2FWORKSPACE%3E%3C%2FP%3E%3CP%3E%24workspaceKey%20%3D%20%22%3CKEY%3E%22%3C%2FKEY%3E%3C%2FP%3E%3CP%3E%24location%20%3D%20%22%3COMS%20workspace%3D%22%22%20location%3D%22%22%3E%22%3C%2FOMS%3E%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%24vms%20%3D%20Get-content%20-Path%20%22C%3A%5Ctemp%5C%3CFILE%20name%3D%22%22%3E.txt%22%3C%2FFILE%3E%3C%2FP%3E%3CP%3E%24vmresourcegroup%20%3D%20%22%3CVMS%3E%22%3C%2FVMS%3E%3C%2FP%3E%3CP%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%3C%2FP%3E%3CP%3Eforeach%20(%24vm%20in%20%24vms)%20%7B%20Set-AzureRmVMExtension%20-ResourceGroupName%20%24vmresourcegroup%20-VMName%20%24vm%20-Name%20%22MicrosoftMonitoringAgent%22%20-Location%20%24location%20-Publisher%20%22Microsoft.EnterpriseCloud.Monitoring%22%20-ExtensionType%20%22MicrosoftMonitoringAgent%22%20-TypeHandlerVersion%20%221.0%22%20-SettingString%20%22%7B'workspaceId'%3A%20'%24workspaceId'%7D%22%20-ProtectedSettingString%20%22%7B'workspaceKey'%3A%20'%24workspaceKey'%7D%22%20%7D%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3Eput%20the%20all%20VM's%20name%20into%20an%20TXT%20or%20an%20CSV%20file%20the%20provide%20the%20location%20and%20then%20run%20it%20into%20the%20powershell.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3Ei%20think%20this%20will%20helpfull.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-222422%22%20slang%3D%22en-US%22%3ERe%3A%20Connect%20OMS%20on%20multiple%20VMs%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-222422%22%20slang%3D%22en-US%22%3E%3CP%3EHi%20Prashant%2C%3C%2FP%3E%0A%3CP%3EI've%20only%20provided%20a%20snippet%20not%20a%20script.%20The%20snippet%20can%20be%20taken%20and%20you%20can%20implement%20whatever%20logic%20you%20want%20to%20walk%20trough%20every%20VM.%20The%20resource%20group%2C%20vm%20name%20and%20the%20location%20are%20all%20values%20that%20can%20be%20taken%20from%20the%20VM%20properties.%20Additionally%20now%20you%20can%20use%20Azure%20Policy%20to%20the%20agent%20installation%20was%20well.%3C%2FP%3E%0A%3CP%3EExamples%20from%20Kristian%20Nese%3A%3C%2FP%3E%0A%3CP%3E%3CA%20href%3D%22https%3A%2F%2Fgithub.com%2Fkrnese%2Farm-sample%2Fblob%2Fmaster%2Fmgmt%2Fpolicies%2Fmgmt%2FomsDeployIfNotExistsWindows.json%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%20noopener%20noreferrer%22%3Ehttps%3A%2F%2Fgithub.com%2Fkrnese%2Farm-sample%2Fblob%2Fmaster%2Fmgmt%2Fpolicies%2Fmgmt%2FomsDeployIfNotExistsWindows.json%3C%2FA%3E%3C%2FP%3E%0A%3CP%3E%3CA%20href%3D%22https%3A%2F%2Fgithub.com%2Fkrnese%2Farm-sample%2Fblob%2Fmaster%2Fmgmt%2Fpolicies%2Fmgmt%2FomsDeployIfNotExistsLinux.json%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%20noopener%20noreferrer%22%3Ehttps%3A%2F%2Fgithub.com%2Fkrnese%2Farm-sample%2Fblob%2Fmaster%2Fmgmt%2Fpolicies%2Fmgmt%2FomsDeployIfNotExistsLinux.json%3C%2FA%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-222256%22%20slang%3D%22en-US%22%3ERe%3A%20Connect%20OMS%20on%20multiple%20VMs%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-222256%22%20slang%3D%22en-US%22%3E%3CP%3EI%26nbsp%3Bthink%20this%20script%20is%20only%20working%20for%20a%20single%20Resource%20Group%20that%20contains%20the%20400%20VMs.%3C%2FP%3E%3CP%3Ewhat%20happens%20if%20we%20having%20all%20the%20VMs%20in%20different-different%20resource%20groups%20and%20regions.%3C%2FP%3E%3CP%3Ewhat%20we%20do%20at%20that%20time%20how%20to%20move%20them%20all%20into%20the%20OMS.%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-148178%22%20slang%3D%22en-US%22%3ERe%3A%20Connect%20OMS%20on%20multiple%20VMs%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-148178%22%20slang%3D%22en-US%22%3E%3CP%3EHi%2C%20Yes%20it%20is%20possible.%20The%20command%20will%20depend%20on%20the%20OS%20-%20Linux%20or%20windows%20but%20in%20general%20here%20is%20the%20code%20for%20Windows%3A%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CPRE%3E%5Bstring%5D%24Settings%20%20%20%20%20%20%20%20%20%20%3D'%7B%22workspaceId%22%3A%22'%20%2B%20%24OMSLogAnalyticsWorkspaceID%20%2B%20'%22%7D'%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Bstring%5D%24ProtectedSettings%20%3D'%7B%22workspaceKey%22%3A%22'%20%2B%20%24OMSLogAnalyticsPrimaryKey%20%2B%20'%22%7D'%3B%0A%0A%0ASet-AzureRmVMExtension%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-ResourceGroupName%20%24ResourceGroupName%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-VMName%20%24VMName%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-Name%20'Microsoft.EnterpriseCloud.Monitoring'%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-Publisher%20'Microsoft.EnterpriseCloud.Monitoring'%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-TypeHandlerVersion%20'1.0'%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-ExtensionType%20'MicrosoftMonitoringAgent'%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-Location%20%24Location%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-SettingString%20%24Settings%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-ProtectedSettingString%20%24ProtectedSettings%20%0A%3C%2FPRE%3E%0A%3CP%3EFor%20Linux%20is%20similar%2C%20only%20extension%20type%20is%20different%26nbsp%3BOmsAgentForLinux%20and%20the%20name%20can%20be%20changed%20as%20well.%3C%2FP%3E%3C%2FLINGO-BODY%3E
Highlighted
Contributor

Hi all

I'm managing a subscription with 400 VMs.
I need to connect them all to one OMS workspace.

 

Is there any way to perform this by Powershell without manually connecting one by one in the portal?

Thanks in advance.

4 Replies
Highlighted
Solution

Hi, Yes it is possible. The command will depend on the OS - Linux or windows but in general here is the code for Windows:

 

[string]$Settings          ='{"workspaceId":"' + $OMSLogAnalyticsWorkspaceID + '"}';
	                [string]$ProtectedSettings ='{"workspaceKey":"' + $OMSLogAnalyticsPrimaryKey + '"}';


Set-AzureRmVMExtension `
                                                -ResourceGroupName $ResourceGroupName `
                                                -VMName $VMName `
                                                -Name 'Microsoft.EnterpriseCloud.Monitoring' `
                                                -Publisher 'Microsoft.EnterpriseCloud.Monitoring' `
                                                -TypeHandlerVersion '1.0' `
                                                -ExtensionType 'MicrosoftMonitoringAgent' `
                                                -Location $Location `
                                                -SettingString $Settings `
                                                -ProtectedSettingString $ProtectedSettings 

For Linux is similar, only extension type is different OmsAgentForLinux and the name can be changed as well.

Highlighted

I think this script is only working for a single Resource Group that contains the 400 VMs.

what happens if we having all the VMs in different-different resource groups and regions.

what we do at that time how to move them all into the OMS. 

Highlighted

Hi Prashant,

I've only provided a snippet not a script. The snippet can be taken and you can implement whatever logic you want to walk trough every VM. The resource group, vm name and the location are all values that can be taken from the VM properties. Additionally now you can use Azure Policy to the agent installation was well.

Examples from Kristian Nese:

https://github.com/krnese/arm-sample/blob/master/mgmt/policies/mgmt/omsDeployIfNotExistsWindows.json

https://github.com/krnese/arm-sample/blob/master/mgmt/policies/mgmt/omsDeployIfNotExistsLinux.json

 

Highlighted

Hi Dante,

 

you can use this.

 

Add-AzureRmAccount

Set-AzureRmContext -Subscriptionid <Your Sub ID>

$workspaceName = "<Your OMS workspace name>"

$resourcegroup = "<Your OMS’s Resource Group>"

 

$workspaceId = "<Workspace ID>"

$workspaceKey = "<Key>"

$location = "<OMS workspace location>"

 

$vms = Get-content -Path "C:\temp\<file name>.txt"

$vmresourcegroup = "<VMs’ Resource Group>"

   

foreach ($vm in $vms) { Set-AzureRmVMExtension -ResourceGroupName $vmresourcegroup -VMName $vm -Name "MicrosoftMonitoringAgent" -Location $location -Publisher "Microsoft.EnterpriseCloud.Monitoring" -ExtensionType "MicrosoftMonitoringAgent" -TypeHandlerVersion "1.0" -SettingString "{'workspaceId': '$workspaceId'}" -ProtectedSettingString "{'workspaceKey': '$workspaceKey'}" } 

 

put the all VM's name into an TXT or an CSV file the provide the location and then run it into the powershell.

 

i think this will helpfull.