LoginSignup
1
2

More than 1 year has passed since last update.

snmp agentのコンテナ化

Posted at

はじめに

サーバーやネットワークを監視する環境を構築するには一般的にはマネージャーと呼ばれる監視を管理するサーバー、そしてエージェントと呼ばれる監視対象ホストのアプリケーションが必要となる。
つまり100台監視したい場合にはそれぞれにエージェントを導入する必要がありまあまあ面倒くさい。

このようなエージェント監視型に対してエージェント不要のエージェントレス監視型というのがあり、後者の方が圧倒的に便利だと思うけどOSSでの実績で言うとまだ物足りないのかなと思っている(勉強不足ならごめん)。そのため今の所エージェント型を利用している。

またエージェントにもいくつかあるがここでは多くの監視マネジャーが対応している古典的なsnmpエージェントのコンテナ化を紹介したい。

実装

実を言うとsnmpエージェントはわざわざコンテナ化するまでもなくapt-getなどで簡単に導入できる。

apt-get(Debina/Ubuntu)
sudo apt-get install -y snmp snmpd

しかし、設定やMIB情報の登録を含めるとコンテナ化するメリットはある。
今回ベースとした「hakengineer/snmp-agent」を元に手を加えてみる。

最初のステップ〜ざっくり実装

元ネタはDockerfile単体で完結しているがentrypointを別ファイルに起こす。

Dockerfile
FROM ubuntu:18.04

RUN apt-get update && apt-get install -y \
    snmp snmpd --no-install-recommends && \
    rm -rf /var/cache/apk/*

COPY entrypoint.sh /

ENTRYPOINT ["sh", "/entrypoint.sh"]

entrypointの設定は、すべてのMIBを受け入れるのとコミュニティ名はpublicのまま使うようにしている。

entrypoint.sh
#!/bin/sh

set -e

OPTIONS=$@

# =============================================================
# Settings - Replace variables
# =============================================================
## Modify snmp.conf
sed -i".orig" "s/mibs :/mibs all/" /etc/snmp/snmp.conf

# Modify snmpd.conf
cp -p /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.orig
sed -i -e "s/agentAddress  udp:127.0.0.1:161/agentAddress  udp:161/" \
    -i -e "s/view   systemonly  included   .1.3.6.1.2.1.1/#view   systemonly  included   .1.3.6.1.2.1.1/" \
    -i -e "s/view   systemonly  included   .1.3.6.1.2.1.25.1/#view   systemonly  included   .1.3.6.1.2.1.25.1/" \
    -i -e "s/rocommunity public  default    -V systemonly/rocommunity public default/" \
    -i -e "s/rocommunity6 public  default   -V systemonly/#rocommunity6 public  default   -V systemonly/" /etc/snmp/snmpd.conf


# =============================================================
# Run service
# =============================================================
service snmpd start && /bin/bash


exec "$@"

ubuntu 20.04に上げようとしたがagentAddressの設定でエラーが出て起動しないため18.04にした。
server - Failed to start snmpd.service on UBUNTU Linux OS - Ask Ubuntu

次のステップ〜MIBの追加

これだけではMIBの情報が足らないため追加する。

Dockerfile(変更箇所)
RUN apt-get update && apt-get install -y \
    snmp snmpd snmp-mibs-downloader ca-certificates --no-install-recommends && \
    rm -rf /var/cache/apk/*

ca-certificateswgetssl通信する時に必要である。
なおwgetsnmp-mibs-downloaderとの依存関係で含まれる。

entrypoint.sh(サービス起動の前に追加)
# =============================================================
# Download mibs
# =============================================================
MIBS_DIR=/usr/share/snmp/mibs

download-mibs

## Additional MIBs
# wget http://www.iana.org/assignments/ianaippmmetricsregistry-mib/ianaippmmetricsregistry-mib -O ${MIBS_DIR}/iana/IANA-IPPM-METRICS-REGISTRY-MIB
wget http://pastebin.com/raw/p3QyuXzZ -O ${MIBS_DIR}/ietf/SNMPv2-PDU
wget http://pastebin.com/raw/gG7j8nyk -O ${MIBS_DIR}/ietf/IPATM-IPMC-MIB

上記MIBを追加する例をあちこちで見かけるがコメントアウトしているIANA-IPPM-METRICS-REGISTRY-MIBは既に存在するので不要だと思う。

最後のステップ〜docker-compose化する

ついでにdocker-compose化してみる。

docker-compose.yml
version: "3.7"

services:
  app:
    container_name: snmp-agent
    restart: unless-stopped
    tty: true
    ports:
      - "161:161/udp"

この場合のメリットとしてzabbix-agentnode exportercAdvisor等他のエージェントもまとめてパッケージ化できるといういところ。
たとえばnode exporterを追加したければ以下のようにすればよい。

docker-compose.yml
version: "3.7"

services:
  snmp-agent:
    container_name: snmp-agent
    restart: unless-stopped
    tty: true
    ports:
      - "161:161/udp" 
  node-exporter:
    image: prom/node-exporter:v1.3.1
    container_name: node-exporter
    restart: unless-stopped
    command:
      - '--path.rootfs=/host'
    ports:
      - "9100:9100"
    volumes:
      - '/:/host:ro,rslave'

補足〜プライベートMIBの登録

caribou_hyさんの記事「ルーター、スイッチの情報をSNMPで取得 by WSL2(Ubuntu)」にあるようにルーターやスイッチ用のMIBを登録したいならentrypoint.shに以下を追加する。

entrypoint.sh(サービス起動の前にさらに追加)
# Private MIBs
# NEC MIBs
mkdir -p ${MIBS_DIR}/nec
wget https://jpn.nec.com/univerge/ix/Manual/MIB/PICO-SMI-MIB.txt -O ${MIBS_DIR}/nec/PICO-SMI-MIB.txt
wget https://jpn.nec.com/univerge/ix/Manual/MIB/PICO-SMI-ID-MIB.txt -O ${MIBS_DIR}/nec/PICO-SMI-ID-MIB.txt
wget https://jpn.nec.com/univerge/ix/Manual/MIB/PICO-IPSEC-FLOW-MONITOR-MIB.txt -O ${MIBS_DIR}/nec/PICO-IPSEC-FLOW-MONITOR-MIB.txt

## Fujitsu MIBs
mkdir -p ${MIBS_DIR}/fujitsu
cd /var/tmp
wget https://fenics.fujitsu.com/products/downloads/products/download/sr-s/firm/rev22/SRS-MIB.zip
unzip SRS-MIB.zip
unzip SRS-MIB/srs.zip
mv srs.txt ${MIBS_DIR}/fujitsu/SRS-MIB.txt
rm -fr SRS-MIB*
cd

# YAMAHA MIBs
cd ${MIBS_DIR}
wget -O - 'http://www.rtpro.yamaha.co.jp/RT/docs/mib/yamaha-private-mib.tar.gz' | tar zxf -
mv yamaha-private-mib yamaha
chmod -x yamaha/*.txt*
cd

完成版

完成版はいつものMakefileで実装。

ちなみに環境変数で値を変更できるようにしているがdocker-compose+Dockerfileで環境変数を使う場合ってこんな面倒なことしなければならないのは自分の勉強不足のせい?

コミュニティ名をpublicから変更したい場合は同様に環境変数で定義してentrypoint.shにてsedで置換してやればよい。

snmpwalksnmpgetや更にはsnmptrapの使用例もMakefile内のタスクで定義しているので参考にされたし。

最後に

やっぱりエージェントレスだよなとしみじみ思いつつ、ここはk8sを使えば一括デプロイなんかも楽になるんだろうな。使ったこと無いけど。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2