もりはやメモφ(・ω・ )

ITとか読書感想文とか

mackerelでWindowsサーバでDNSが引けるかチェック監視をpowershellのワンライナーで追加する

普段はLinuxサーバばかり触っていますが、一部Windowsサーバもあります。 とある日にDNSが引けなくなる問題が発生し、WindowsサーバでDNSが引けるかのチェックを定期的に行いたくなり、mackerelのチェック監視で簡単に行なったのでメモしておきます。 (調べてわかりましたが、mackerel + Windows の情報は多くないんですね...)

mackerel.io

具体的には以下の通り。mackerel-agent.conf へ以下を追加するだけでした。

[plugin.check.dns_google]
command = "powershell -command Resolve-DnsName -Name google.co.jp"

以下のように無事に監視ができています。

f:id:morihaya:20201213234522p:plain
check監視のグラフ

存在しないドメイン (googleeeeeeeeeee.co.jp) を入れると以下のようにエラーになりました。

f:id:morihaya:20201213235149p:plain
dns check error

いくつかハマったことをメモ

最初から上記のようにできたわけではないので、試行錯誤の過程を参考までにメモします。

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で頑張るかーとなっていたところですが、シュッと設定できてよかったです。