Bulk import of SNMP devices to OpsMgr
If you want to import a larger bunch of SNMP-devices in to OpsMgr you will probably go thru the disovery wizard way to many times.
Instead of walking thru that wizard every time I asked the network team to write a CSV-file with all the devices and then used this function to import them.
Function Add-SnmpDevice { PARAM ( [Parameter(Mandatory=$true )][string] $FromIpAddress, [Parameter(Mandatory=$true )][string] $MonitoringProxy, [string] $ManagementServer, [string] $ToIpAddress = "", [string] $SnmpCommunityString = "public", [int32] $SnmpVersion = 2 ) # Single ip ? If ($ToIpAddress.Length -eq 0) { $ToIpAddress = $FromIpAddress } # Check SNMP version if ($SnmpVersion -ne 1 -and $SnmpVersion -ne 2) { Throw "Only SNMP version 1 and 2 supported" } Write-Host "Setting up discovery for SNMP-devices..." Write-Host " From: $($FromIpAddress)" Write-Host " To: $($ToIpAddress)" Write-Host " Community: $($SnmpCommunityString)" Write-Host " SNMP ver: $($SnmpVersion)" $networkDeviceClass = Get-MonitoringClass -name "System.NetworkDevice" $DeviceDiscoveryConfig = New-DeviceDiscoveryConfiguration -MonitoringClass $networkDeviceClass -FromIpAddress $FromIpAddress -ToIpAddress $ToIpAddress # Set Community String $encoding = New-Object System.Text.UnicodeEncoding $encodedCommunityString = $encoding.GetBytes($SnmpCommunityString) $DeviceDiscoveryConfig.ReadOnlyCommunity = [System.Convert]::ToBase64String($encodedCommunityString) # Set SNMP version $DeviceDiscoveryConfig.SnmpVersion = $SnmpVersion # Get management server If ($ManagementServer.Length -eq 0) { $mgmtServer = Get-RootManagementServer } else { $mgmtServer = Get-ManagementServer | Where-Object {$_.Name -eq $ManagementServer} } If ($mgmtServer -eq $null) { Throw "Cant find management server named $($ManagementServer)" } else { Write-Host "Found management server: $($mgmtServer.name)" } # Find proxy agent Write-Host "Lookup of proxy agent named $($MonitoringProxy) ..." $ProxyAgent = Get-Agent | Where-Object {$_.Name -eq $MonitoringProxy} If ($ProxyAgent -eq $null) { Write-Host "No agent named $($MonitoringProxy) found, checking managementservers" $ProxyAgent = Get-ManagementServer | Where-Object {$_.Name -eq $MonitoringProxy} $ProxyIsMgmtServer = $true } else { $ProxyIsMgmtServer = $false } If ($ProxyAgent -eq $null) { Throw "Can't find agent or managementserver named $($MonitoringProxy)" } else { Write-Host "Found $($ProxyAgent.Name)" } Write-Host "Starting discovery..." $DiscResults = Start-Discovery -ManagementServer: $mgmtServer -DeviceDiscoveryConfiguration: $DeviceDiscoveryConfig If ($DiscResults.CustomMonitoringObjects.Count -eq 0) { Write-Host "Cant discover any objects" Return 0 } else { $ObjectCount = 0 Write-Host "Found objects" $discresults | select-object -expandproperty CustomMonitoringObjects | Select-Object Name | Format-Table -HideTableHeaders $DiscResults | ForEach-Object { Write-Host "Adding object to proxy..." if ($ProxyIsMgmtServer -eq $true) { $ProxyAgent.InsertRemotelyManagedDevices($_.CustomMonitoringObjects) | Format-Table SnmpDevice, ProxyAgentPrincipalName, ManagementGroup -HideTableHeaders } else { Add-RemotelyManagedDevice -proxyagent $ProxyAgent -device $_.CustomMonitoringObjects } $ObjectCount++ } Return $ObjectCount } }
And two examples on how you can use it to add some devices:
# Add a devices in the range 192.168.100.240-.254 with the community "SomeSecret" # Use mgmtserver.snowland.demo to do the discovery and add the devices with snmpmonitor.snowland.demo as monitoring proxy Add-SnmpDevice -FromIpAddress "192.168.100.240" -ToIpAddress "192.168.100.254" -SnmpCommunityString "SomeSecret" -ManagementServer "mgmtserver.snowland.demo" -MonitoringProxy "snmpmonitor.snowland.demo" # Add a single SNMPv1 device with the "public" community, use the RMS to do discovery Add-SnmpDevice -FromIpAddress "192.168.100.10" -MonitoringProxy "snmpmonitor.snowland.demo" -SnmpVersion 1
So we ended up with something like this:
Import-Csv ".\snmplist.csv" -Delimiter ";" | ForEach-Object { Add-SnmpDevice -FromIpAddress $_.IpFrom -ToIpAddress $_.IpTo -SnmpCommunityString $_.Community -ManagementServer $_.MgmtServer -MonitoringProxy $_.Proxy }