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.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | 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:
1 2 3 4 5 6 | # 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:
1 2 3 | Import-Csv ".\snmplist.csv" -Delimiter ";" | ForEach-Object { Add -SnmpDevice -FromIpAddress $_.IpFrom -ToIpAddress $_.IpTo -SnmpCommunityString $_.Community -ManagementServer $_.MgmtServer -MonitoringProxy $_.Proxy } |