【入門編】Zabbixネットワーク機器のコンフィグバックアップ自動化:RANCIDやOxidizedを使わずにZabbixだけでスイッチ設定変更を検知・保存する裏技 – 運用監視・オブザーバビリティ活用バイブル

こんにちは!インフラの現場を支えるエンジニアの皆さん、日々のネットワーク機器の管理、本当にお疲れ様です。

「誰がいつスイッチの設定を変えたんだ……?」
障害対応の最中にこんな絶望的な状況に直面したことはありませんか?ネットワーク機器のコンフィグ管理といえば、RANCIDやOxidizedといった専用ツールを導入するのが王道ですが、「そのためだけに専用のLinuxサーバーを立てて、RubyやGitの環境をメンテして……」と考えると、ちょっと腰が重くなりますよね。

実は、すでに皆さんの職場で稼働しているZabbixを使えば、外部の専門ツールに頼らなくても、「スイッチの設定変更を即座に検知し、自動でGitに保存して、差分をアラートする」という最高にスマートな仕組みが作れてしまうんです。

今回は、Zabbixのポテンシャルを限界まで引き出す「裏技」を、基礎から優しく丁寧に解説していきます。これをマスターすれば、あなたの運用作業は劇的に楽になりますよ!

—

1. ネットワーク機器のコンフィグ管理における課題とZabbix活用のアプローチ

なぜコンフィグ管理は泥臭くなるのか?

ネットワーク機器(Cisco、YAMAHA、Juniperなど)のコンフィグは、Web GUIやCLIから手軽に変更できる反面、「変更履歴が残らない」「担当者が退職すると誰も変更理由がわからない」という属人化の温床になりやすい資産です。

通常、これを防ぐにはRANCIDなどの専用ツールを cron で定期実行させます。しかし、小規模な環境や、すでにZabbixで統合監視を行っている現場において、「監視サーバーとは別にもう一台、コンフィグ管理用のサーバーを建てる・維持する」というコストは、地味に運用者を苦しめます。

Zabbixアプローチの美しさ

「おいおい、Zabbixは監視ツールだろ? コンフィグ管理なんてできるのか?」と思われるかもしれませんが、Zabbixの核心である「Remote Command(リモートコマンド)」と「ダミーの監視アイテム(パッシブ/アクティブチェック)」を組み合わせれば、立派な構成管理(CMDB)の要塞に変貌します。

  • Zabbixの役割: 機器へのログイン、コンフィグ取得スクリプトのキック、差分検知のアラート発砲
  • Gitの役割: 取得したコンフィグの世代管理と、誰が・いつ・何を変えたかの可視化

余計なツールを増やさず、既存の監視基盤に仕事を集約する。これこそが、優秀なオブザーバビリティ・アーキテクトが好む設計思想です。

—

2. Remote Commandと外部スクリプト(Git連携)を組み合わせたコンフィグ自動取得の仕組み

それでは、実際にどのような仕組みで動くのか、全体像を頭に思い描いてみましょう。

1. トリガー: Zabbixが定期的に(例えば1時間に1回)スイッチのコンフィグをチェックする。
2. アクション(Remote Command): コンフィグに変更があれば、Zabbixサーバー(またはプロキシ)上でシェルスクリプトが走る。
3. スクリプトの仕事:

  • `ssh`や`expect`を使ってネットワーク機器に接続し、最新のコンフィグをダウンロードする。
  • そのファイルをGitリポジトリに保存する。
  • `git diff`を取って、変更があればZabbixに「障害(または警告)」として通知する。

言葉で書くとシンプルですが、これを安全かつ確実に動かすための実装手順をステップバイステップで見ていきましょう。

—

3. 実装手順:Zabbixだけで実現するコンフィグ自動保存&差分検知

ステップ①:コンフィグ取得&Git保存スクリプトの準備

まずは、ZabbixサーバーのOS側(例: `/etc/zabbix/scripts/`)に、コンフィグを引っ張ってくるシェルスクリプトを配置します。今回はCiscoを想定したサンプルですが、YAMAHAやFortinetなどでも考え方は同じです。

`/etc/zabbix/scripts/get-config.sh`

!/bin/bash
引数の受け取り (第1引数: 機器のIPアドレス, 第2引数: 機器名)
DEVICE_IP=$1
DEVICE_NAME=$2

保存先ディレクトリ(あらかじめ git init しておくこと)
REPO_DIR=”/var/lib/zabbix/configs”
cd “$REPO_DIR” || exit 1

ディレクトリ構造を機器ごとに整理
mkdir -p “$DEVICE_NAME”
TARGET_FILE=”$DEVICE_NAME/config.txt”

expect や sshpass を使ってコンフィグを取得し、一時ファイルに保存
※実際の現場では秘密鍵認証か安全なクレデンシャル管理を使用してください
sshpass -p ‘your_password’ ssh -o StrictHostKeyChecking=no admin@”$DEVICE_IP” “show running-config” > “$TARGET_FILE”

Gitで変更があったかチェック
git add “$TARGET_FILE”
if ! git diff-index –quiet HEAD –; then
# 変更がある場合のみコミット
git commit -m “Auto-backup: Config changed on $DEVICE_NAME ($DEVICE_IP)”

# 差分を標準出力に出す(Zabbixのアラートメッセージやログに利用するため)
git diff HEAD~1 HEAD — “$TARGET_FILE”

# 変更ありを示す終了コード 2 を返す(後続のZabbix連携で利用)
exit 2
else
# 変更なし
exit 0
fi

> ★先輩のワンポイントアドバイス: スクリプト内で `sshpass` や `expect` を使う際は、パスワードがプロセス一覧に露出しないよう、環境変数や安全なパスワードストアを活用してくださいね。

ステップ②:Gitリポジトリの初期化

スクリプトが参照するディレクトリをGitの管理下に置きます。

sudo mkdir -p /var/lib/zabbix/configs
cd /var/lib/zabbix/configs
sudo git init
Zabbix実行ユーザー(zabbix等)に権限を付与するのを忘れずに!
sudo chown -R zabbix:zabbix /var/lib/zabbix/configs

ステップ③:Zabbixでのアイテムとトリガーの設定

ここからがZabbix側の魔法です。外部スクリプトを実行する「外部チェック(External check)」、またはZabbixエージェント(リモートコマンド)を利用します。今回は、シンプルにZabbixサーバー側から定期実行する「外部チェック」または「Zabbix内部でのスクリプト実行」を想定します。

1. アイテムの作成:

  • 名前: Config Backup & Check
  • タイプ: `Zabbix エージェント (アクティブ)` または `SSHエージェント`(今回はサーバー側でスクリプトを叩くため `Zabbix 内部` もしくは外部スクリプト定義を利用)
  • ※ここでは確実性の高い「外部チェック(External check)」として、Zabbixの `externalscripts` ディレクトリにスクリプトを配置する手法をとります。
  • キー: `get-config.sh[{HOST.CONN}, {HOST.NAME}]`
  • 更新間隔: `1h`(1時間に1回)

2. トリガーの作成:
スクリプトの戻り値(Exit Code)を利用してアラートを発砲します。

  • 名前: `{HOST.NAME}: ネットワーク機器のコンフィグ変更を検知しました`
  • 条件式: `last(/Network Switch Template/get-config.sh[{HOST.CONN}, {HOST.NAME}]) = 2`
  • 深刻度: `警告 (Warning)`

このトリガーが火を吹いた瞬間、チャットツール(SlackやTeamsなど)に「誰かがスイッチの設定を変えたぞ!」という通知飛び、同時にGitには美しく差分が記録されます。

—

まとめ:監視と構成管理の融合がもたらす余裕

いかがでしたでしょうか?

わざわざ専用の重厚な構成管理サーバーを建てなくても、使い慣れたZabbixと数行のシェルスクリプト、そしてGitを組み合わせるだけで、立派な「コンフィグ自動バックアップ&差分検知システム」が手に入りました。

  • 専用ツールの学習コストがゼロ
  • 変更履歴がGitで完全担保される
  • 障害発生時の「コンフィグ変わったっけ?」という不安からの解放

これをマスターすれば、あなたの毎日の運用作業は劇的に楽になり、トラブルシューティングのスピードも桁違いに上がります。「監視ツールはメトリクスを見るだけ」という固定観念を捨て、Zabbixをあなたの最高の相棒に仕立て上げてください。

それでは、素晴らしいオブザーバビリティライフを!

タイトルとURLをコピーしました