snmpdのprocとprocfixでhttpdを起動できるDockerイメージを作るDockerfile

前回はsnmpの復旧コマンドを叩くのを紹介しました。
snmpdでexecに失敗したらexecfixだけど、認証も必要 | 曖昧/旬.
その記事でDockerイメージ作っとけば、みたいなことを書いたので、Dockerfileを書いてみました。

さっそくだけど、こんな感じ。

$ more Dockerfile
FROM centos:centos7
MAINTAINER user@example.com
RUN yum -y update; yum clean all
RUN yum -y install net-snmp net-snmp-utils httpd
RUN yum clean all
RUN agentAddress udp:161 > /etc/snmp/snmpd.conf
RUN echo proc httpd 0 1 >> /etc/snmp/snmpd.conf
RUN echo procfix httpd /usr/sbin/httpd >> /etc/snmp/snmpd.conf
RUN net-snmp-create-v3-user -A secretsecret -X privpriv -a SHA -x AES useruser
ENTRYPOINT snmpd -f

自分はGentooが好きなんだけど、扱いやすさでCentOSをベースに選択。アップデートして、必要なパッケージ入れて、snmpの設定して、起動設定して、完了。snmpd.confにechoしてるけど、ファイルを作っておいてCOPYしてもいいよね。

snmpの方ですが、今回はprocとprocfixで作りました。

proc httpd 0 1

procがプロセスの監視。名前で検索して最大0で最小1。1個以上であれば何個でもいいってことだね。それがエラーになった時に発行できるのがprocfix。使い方は、なんとなく分かるでしょう。

という感じでDockerfile作って、そこで docker build . すればイメージができます。ユーザはrootじゃなくてもdockerグループに入っていれば大丈夫。システムでdockerサービスが起動している必要があるけどね。

イメージが出来たら次はインスタンスの起動。docker images でイメージIDを確認したら、docker run -d <イメージID> を叩けば起動します。docker ps でインスタンスIDを確認して、docker exec <インスタンスID> ip ad でIPを確認しましょう。

さて、やっとsnmpコマンドを叩けます。まずはsnmpwalk。

$ snmpwalk -v 3 -lauthPriv -u useruser -a SHA -A secretsecret -x AES -X privpriv <IPアドレス> prTable
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prNames.1 = STRING: httpd
UCD-SNMP-MIB::prMin.1 = INTEGER: 1
UCD-SNMP-MIB::prMax.1 = INTEGER: 0
UCD-SNMP-MIB::prCount.1 = INTEGER: 0
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: error(1)
UCD-SNMP-MIB::prErrMessage.1 = STRING: No httpd process running
UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrFixCmd.1 = STRING: /usr/sbin/httpd

httpdプロセスいないです。そりゃいないさ。起動コマンドとして設定していないからね。でも復旧コマンドは設定してあります。prErrFixCmdがそれ。これはprErrFixに1を設定したら発動します。というわけで、発動。

$ snmpset -v 3 -lauthPriv -u useruser -a SHA -A secretsecret -x AES -X privpriv <IPアドレス> UCD-SNMP-MIB::prErrFix.1 integer 1
UCD-SNMP-MIB::prErrFix.1 = INTEGER: runFix(1)

これで起動したはず。snmpwalkで確認してみる。

$ snmpwalk -v 3 -lauthPriv -u useruser -a SHA -A secretsecret -x AES -X privpriv 172.17.0.44 prTable
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prNames.1 = STRING: httpd
UCD-SNMP-MIB::prMin.1 = INTEGER: 1
UCD-SNMP-MIB::prMax.1 = INTEGER: 0
UCD-SNMP-MIB::prCount.1 = INTEGER: 6
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrMessage.1 = STRING:
UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrFixCmd.1 = STRING: /usr/sbin/httpd

起動してるね。

というわけで、後はこれをNagiosとかの監視ツールで実行すればいいわけだ。nagiosユーザをdockerグループに入れておけばインスタンスの起動もできそうだね。それがいいか悪いかは考えた方がいいと思うけど。