snmpdでexecに失敗したらexecfixだけど、認証も必要

最近、ansibleというオーケストレーションのツールをいじっていたのだが、sudoログが大量に出ることと、SSHでログインする前提というので何とも言えない気持ちになったので、昔ながらの手法でどこまでできるのか再確認する活動を始めました。あ、ansibleバッシングじゃないですよ。構築時には活用したい、素晴らしいツールだと思います。
Ansible is Simple IT Automation.

で、とりあえずsnmpdでコマンド叩けたよなー、って思いだして、久しぶりに設定してみました。/etc/snmp/snmpd.confにこれを追記。

sh apache2 /etc/init.d/apache2
execfix apache2 /etc/init.d/apache2 start

snmpwalkで確認してみる。

# snmpwalk -v 2c -c public localhost extTable
UCD-SNMP-MIB::extIndex.1 = INTEGER: 1
UCD-SNMP-MIB::extNames.1 = STRING: apache2
UCD-SNMP-MIB::extCommand.1 = STRING: /etc/init.d/apache2
UCD-SNMP-MIB::extResult.1 = INTEGER: 768
UCD-SNMP-MIB::extOutput.1 = STRING:  * status: stopped
UCD-SNMP-MIB::extErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::extErrFixCmd.1 = STRING: /etc/init.d/apache2 start

取れた。execfixで設定した復旧コマンドがextErrFixCmdで確認できます。

でも、確認できたのはexecfix設定のみ。勝手にfixはしてくれない。fixする場合はextErrFixに1を書き込まなければならないらしい。書き込む。どうやって?たぶんsnmpsetだけど、そもそもユーザがない。作らなければならない。前にやったことあるはずだけど記憶がない。うーん。

というわけで、こちらを参考にユーザを追加。
簡単SNMP(ACL設定 v3編) – LinuxとApacheの憂鬱.
対話的にも入力できるらしいが、自分はコマンドラインで指定してみました。

# net-snmp-create-v3-user -A secretsecret -X privpriv -A SHA -x AES useruser
adding the following line to /var/lib/net-snmp/snmpd.conf:
   createUser useruser SHA "secretsecret" AES privpriv
adding the following line to /usr/share/snmp/snmpd.conf:
   rwuser useruser

snmpd.conf のパスが変。Gentooさ~ん。というわけで、その分は手作業で /etc/snmpd.conf に記入。で、起動。これで認証かつ暗号化してsnmpwalkできる。

# snmpwalk -v 3 -lauthPriv -u useruser -a SHA -A secretsecret -x AES -X privpriv localhost extTable
UCD-SNMP-MIB::extIndex.1 = INTEGER: 1
UCD-SNMP-MIB::extNames.1 = STRING: apache2
UCD-SNMP-MIB::extCommand.1 = STRING: /etc/init.d/apache2
UCD-SNMP-MIB::extResult.1 = INTEGER: 768
UCD-SNMP-MIB::extOutput.1 = STRING:  * status: stopped
UCD-SNMP-MIB::extErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::extErrFixCmd.1 = STRING: /etc/init.d/apache2 start

ここまできたら、あとはsnmpsetするだけ。その前にhttpdが停止していることを確認。snmpwalkでも確認済みだけど。

# /etc/init.d/apache2 status
 * status: stopped

そしてset。

# snmpset -v 3 -lauthPriv -u useruser -a SHA -A secretsecret -x AES -X privpriv localhost UCD-SNMP-MIB::extErrFix.1 integer 1
UCD-SNMP-MIB::extErrFix.1 = INTEGER: runFix(1)

そしてwalk。

# snmpwalk -v 3 -lauthPriv -u useruser -a SHA -A secretsecret -x AES -X privpriv localhost extTable
UCD-SNMP-MIB::extIndex.1 = INTEGER: 1
UCD-SNMP-MIB::extNames.1 = STRING: apache2
UCD-SNMP-MIB::extCommand.1 = STRING: /etc/init.d/apache2
UCD-SNMP-MIB::extResult.1 = INTEGER: 0
UCD-SNMP-MIB::extOutput.1 = STRING:  * status: started
UCD-SNMP-MIB::extErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::extErrFixCmd.1 = STRING: /etc/init.d/apache2 start

起動しましたね。

その後、復旧コマンドをrestartにしてみましたが、何度も叩いてもApacheのプロセスIDが入れ替わることはありませんでした。execで指定したコマンドの戻り値が0以外の状態でないと復旧コマンドは点火しないってことだね。賢い。

というわけで、Dockerfileとかでサービス定義済みのイメージを構築して、イメージを起動したらNagiosとかでsnmpsetしてサービス起動、なんてこともできるかも?継続的な監視体制がシステムを起動する。まさにテスト駆動。ちょっと違うかな?