普段はLinuxサーバばかり触っていますが、一部Windowsサーバもあります。 とある日にDNSが引けなくなる問題が発生し、WindowsサーバでDNSが引けるかのチェックを定期的に行いたくなり、mackerelのチェック監視で簡単に行なったのでメモしておきます。 (調べてわかりましたが、mackerel + Windows の情報は多くないんですね...)
具体的には以下の通り。mackerel-agent.conf へ以下を追加するだけでした。
[plugin.check.dns_google] command = "powershell -command Resolve-DnsName -Name google.co.jp"
以下のように無事に監視ができています。
存在しないドメイン (googleeeeeeeeeee.co.jp) を入れると以下のようにエラーになりました。
いくつかハマったことをメモ
最初から上記のようにできたわけではないので、試行錯誤の過程を参考までにメモします。
nslookup -> 解決できてもできなくてもリターンコードが0だったので却下
最初に nslookup
で実装を試みました。
しかし以下のように、名前が引けても引けなくても正常リターンとなってしまうために諦めました。コマンドプロンプトに詳しくないので何かオプションを入れれば良いのかもしれませんが、少し調べて出てこないので別の方法を探しました。
# 正常パタン C:\Users\administrator.morihaya>nslookup google.co.jp サーバー: UnKnown Address: ::1 権限のない回答: 名前: google.co.jp Addresses: 2404:6800:4004:80c::2003 172.217.31.163 C:\Users\administrator.morihaya> C:\Users\administrator.morihaya>echo %ERRORLEVEL% 0 # 異常パタン C:\Users\administrator.morihaya>nslookup googleeeeeeeeeeeeee.co.jp サーバー: UnKnown Address: ::1 *** UnKnown が googleeeeeeeeeeeeee.co.jp を見つけられません: Non-existent domain C:\Users\administrator.morihaya>echo %ERRORLEVEL% 0 C:\Users\administrator.morihaya>
Powershellのスクリプトファイルを作成したが、やはりリターンコードが取れない
コマンドプロンプトがダメならPowershellでいくのがWindowsでしょう(多分)、 check-dns.ps1
のような名前で、以下のファイルを作成しました。
Resolve-DnsName -Name googleeeeee.co.jp
ただしこれも、リターンコードが成否にかかわらずTrueになり、諦めました。Windowsのスクリプト事情がわからなすぎて凹む感じです。しかしVBは手を出したくない。。。
# 正常パタン PS C:\Program Files\Mackerel\mackerel-agent> powershell.exe -file check-dns.ps1 Name Type TTL Section IPAddress ---- ---- --- ------- --------- google.co.jp AAAA 117 Answer 2404:6800:4004:80c::2003 google.co.jp A 93 Answer 172.217.31.163 PS C:\Program Files\Mackerel\mackerel-agent> PS C:\Program Files\Mackerel\mackerel-agent> echo $? True PS C:\Program Files\Mackerel\mackerel-agent> # 異常パタン PS C:\Program Files\Mackerel\mackerel-agent> powershell.exe -file check-dns.ps1 Resolve-DnsName : googleeeeee.co.jp : DNS 名がありません。 発生場所 C:\Program Files\Mackerel\mackerel-agent\check-dns.ps1:1 文字:1 + Resolve-DnsName -Name googleeeeee.co.jp + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ResourceUnavailable: (googleeeeee.co.jp:String) [Resolve-DnsName], Win32Exception + FullyQualifiedErrorId : DNS_ERROR_RCODE_NAME_ERROR,Microsoft.DnsClient.Commands.ResolveDnsName PS C:\Program Files\Mackerel\mackerel-agent> echo $? True
ああ、もうやってられない、直接コマンドに書いてしまえ!->期待した動作!
そして冒頭にも書いたように、直接コマンドを書いて見たところ無事に期待した動作となりましたとさ。ちゃんちゃん。*1
[plugin.check.dns_google] command = "powershell -command Resolve-DnsName -Name google.co.jp"
*1:これがダメだった場合はGoで頑張るかーとなっていたところですが、シュッと設定できてよかったです。