Tips
Windowsサーバーを複数台管理されている方の中に、SNMPの設定を一括で流し込みたいなと考えている方って結構いらっしゃるかと思います。
SNMPの設定を行うためには、サーバーマネージャーから「役割と機能の追加ウィザード」を立ち上げ、SNMPサービスを追加し、GUIでぽちぽち設定していく必要があります。
1〜2台なら大した問題では無いのですが、これが10台、100台レベルになってくると、非常に面倒かつ打ち間違い等のミスが目立つようになります。
この大規模展開の労力の削減と、打ち間違いを無くすために、さくっとPowerShellで解決してみましょう。
コード
まずはコードをサクッとご紹介します。
# $pmanagersは、セキュリティタブの「これらのホストからSNMPパケットを受け付ける」で指定するホスト # $trap_destinationは、トラップタブのトラップ送信先 # $commstringは、コミュニティ名 $pmanagers = "localhost","pmanager.syobon.local","smanager.syobon.local","bcp-osa-manager.syobon.local","bcp-us.syobon.local" $trap_destination = "pmanager.syobon.local" $commstring = "sy0b0n" $servers = Get-Content "C:\servers.txt" #指定したサーバー毎にSNMP設定を行います。 foreach ($server in $servers) { #SNMPサービスがインストールされていなければインストール $test = Get-WindowsFeature -Name SNMP-Service -Computer $server If ($test.Installed -ne "True") { Write-Host "SNMPサービスを有効化します。" Get-WindowsFeature -name SNMP* -Computer $server | Add-WindowsFeature -IncludeManagementTools -Computer $server | Out-Null } #サーバーとPing疎通が取れるか確認 if (Test-Connection $server -Quiet) { #SNMPサービスが正常にインストールできているか、サービスが起動しているか確認 $check = Get-Service -ComputerName $server -ErrorAction silentlycontinue | Where-Object {$_.DisplayName -eq "SNMP Service"} -ErrorAction silentlycontinue If ($check.status -ne "Running") { #SNMPサービスを開始 $check.Start() } #SNMPサービスが起動しているか判断 If ($check.status -eq "Running") { #Deletes all SNMP Permitted Manager(s) $server reg DELETE "\\$server\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\PermittedManagers" /va /f #「これらのホストからSNMPパケットを受け付ける」に$pmanagersで指定したホストを一つずつ追加 $i = 1 Foreach ($manager in $pmanagers) { reg add "\\$server\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\PermittedManagers" /v $i /t REG_SZ /d $manager /f | Out-Null $i++ } #SNMPコミュニティの権利を読み取りのみに指定 Foreach ($string in $commstring) { reg add "\\$server\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\ValidCommunities" /v $string /t REG_DWORD /d 4 /f | Out-Null } #SNMPのトラップのコミュニティ名を指定 Foreach ($string in $commstring) { reg add "\\$server\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$string" /f } $string='' $j = 1 #トラップの送信先を指定 Foreach ($string in $commstring) { reg add "\\$server\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$string" /v $j /t REG_SZ /d $trap_destination /f | Out-Null reg delete "\\$server\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$string" /ve /f $j++ } #認証トラップを送信しない Foreach ($string in $commstring) { reg add "\\$server\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SNMP\Parameters" /t REG_DWORD /v EnableAuthenticationTraps /d 0 /f | Out-Null } } Else { "Error on " + $server + ": SNMPサービスが正常にインストールされていません。" } } Else { $server + ": が利用できません。" } }
使い方
まずC:\にservers.txtを作成し、そのテキストファイルへ設定対象のホスト名を1行ずつ入力していきます。
servers.txt例
osaka
tokyo
us-east
次に、上記のコードの対応する変数について、ご自身の環境にあわせて変更します。
変更するところは、$pmanagers、$trap_destination、$commstringの3つです。
$pmanagers
こちらの変数には、セキュリティタブの「これらのホストからSNMPパケットを受け付ける」で指定するホスト名を入力します。
$pmanagers = “localhost”,”pmanager.syobon.local”のように、ホスト名をダブルクォートで囲み、追加ホストが存在する場合は「,」で区切ります。
$trap_destination
こちらの変数には、トラップタブの「トラップ送信先」に指定するホスト名を入力します。
$commstring
こちらの変数には、SNMPのコミュニティ名を入力します。
編集が完了したら、Powershellを立ち上げ、
./snmp_setting.ps1
を実行すれば、C:\servers.txtで指定したホストに対して、SNMPの設定を自動で行います。
注意すること
設定先のWindows Serverが再起動保留中でかつ、SNMPサービスがインストールされていない場合は、処理がスキップされます。
まとめ
複数台のWindowsサーバーを管理していると、痒いところに手が届かない!なんて場面に多々遭遇します。
以前まではバッチファイルや、vbsを使って脳筋解決していたのですが、Windows Server 2008 R2から新たにPowershellが標準搭載されるようになりましたので、新たな脳筋解決方法が増えました。
Powershellはちょっとクセがありますが、慣れれば結構好き放題使えるので、これを機にPowershellにも手を出してみてくださいね。
Source: PowerShell Daily