Ansible+dockerでZabbix applianceを立ててエージェント監視を行う

OSSの監視サーバソフトウェアとして有名なZabbixは、通常Maria DBなどのデータベースサーバ、httpdなどのWebサーバ、Zabbixアプリケーションサーバを立て、phpをインストールして、などと複数のコンポーネントを組み合わせて構築する必要がありますが、公式がZabbix applianceなる全部入りのOSイメージを展開しています。さらに、OSイメージだけではなくdockerイメージとしても配布されているため、今回はdockerを作ってZabbixを構築し、エージェント監視を行うまでをAnsibleでやりました。ZabbixサーバのコンテナをインストールしたdockerホストにインストールしたエージェントとZabbixサーバの疎通に若干手間取ったので、それもメモします。

構成

う~ん図示能力がうんこ!w Zabbixサーバに入れるzabbix_agentdとZabbixエージェントに入れるzabix_agentdでPoling/Trap通信の流れが異なることがポイント。後で詳述します。

環境

本ブログを書く検証用にZabbixサーバ、ZabbixエージェントはVagrantで作成しました。実際に運用中のZabbixサーバはおうちESXi上で稼働しており、エージェントはいろんなサーバに入っています。

Zabbixサーバ

Zabbixエージェント

zabbid_agentdについては同じものをZabbixサーバにも入れます。

Ansibleサーバ

Ansibleでdockerを構築

まずはAnsibleサーバで作業。dockerをインストールするroleを作ります。CentOS7にしか対応していない作りこみの浅いRole。構築手順自体はdocker公式にありますので、それをしこしこRoleに落とし込んでいく。

tasks/main.yml

作業用フォルダを作るtaskがありますが、本手順ではなくてもいいです。

handlers/main.yml

dockerインストール用インベントリファイル

Ansibleの構築対象の情報を記載するファイルです。

dockerインストール用 Playbook

roleを呼び出すだけのPlaybookを作成します。

ansible-playbookコマンド実行

ansible-playbookコマンドを利用します。-kオプションでansible_ssh_userのログインパスワードを対話的に入力します。sudo時にパスワード入力が必要な環境では、-Kオプションを付与してsudoパスワードも対話的に入力するようにします。

Ansibleを実行してしまう前に、 –syntax-checkオプションで文法確認を、–checkオプションを付与してdry runをしたほうがいいです。ただdry runでは、前のtaskにて起こった変更内容に依存するtaskを後ろで走らせる場合など、うまくチェックできないことがあります。

ちなみに事前にAnsibleサーバから手動でsshで構築対象に接続しておかないと、known_hostsにない知らないサーバだよって怒られるのでやっておきます。

ずらっと構築内容が表示されて、最後のPLAY RECAPでunreachableやfailedが出ていなければOK。ユーザのdockerグループへの追加があったため、一旦Zabbixサーバをリブートします。これリブートもhandlerでやればいいのに後で気付いた。

Zabbix Applianceの起動

ここからはZabbixサーバで作業します。Zabbix Appliance公式のdockerイメージのサイトにコマンドやイメージ名、タグについて説明してあります。

-pオプションの80:80や10051:10051はdocker仮想ブリッジのNAPT設定。XX:YYと記載した場合、dockerホストのXX番ポートにアクセスが来たらコンテナのYY番ポートにNAPTします。なおホスト側のfirewalldは穴を空けるか切るかしておいてください。-eオプションはコンテナに環境変数を渡すオプション。dockerは大体そうなのですが、細かい設定はこのように環境変数で渡すことが多いです。Zabbix Applianceの公式サイトに記載がある通り、PHPのタイムゾーンは環境変数として渡せます。-dオプションはデーモンとしてコンテナを起動するオプション。つけないと標準出力をコンテナに奪われます。

起動が完了したらブラウザからdockerホストのIPアドレスにアクセス。ユーザ名Admin、パスワードzabbixでログオンできます。zabbixサーバがzabbid_agentd と通信できていないよってProblemが出ていますので次のステップで入れます。

zabbid_agentdをAnsibleでインストール

ここからはまたAnsibleサーバで作業。zabbid_agentdは、エージェントの検証用に立てたZabbixエージェントマシンと、Zabbix Applianceを動かしているdockerホストのZabbixサーバマシンの両方に入れ、両方監視します。後者については要注意なので、あとで詳述します。なお、zabbid_agentdはdockerコンテナではなく直接インストールします。

作成したRoleはCentOS7とDebian系に対応しています。CentOS7の方はfirewalldが動いていることを前提とします。動いていないとfirewalldのルールを作成しようとした際にこけます。

tasks/main.yml

handlers/main.yml

zabbid_agentd用インベントリファイル

ここが一番はまったところ。インベントリファイルの実物は以下の通り。


同じzbxsv_addressという変数に対し、zabbixサーバマシンとzabbixエージェントマシンで、違う値のIPアドレスが記載されています。この変数はtasks/main.ymlから呼ばれていて、zabbid_agentd が接続するZabbixサーバのIPアドレスを、zabbid_agentd の設定ファイル(/etc/zabbix/zabbix_agentd.conf)に書き込むためのものです。

Zabbixエージェントマシンのzabbix_agentd.confの場合、普通にZabbixサーバマシンのIPアドレス(192.168.100.121)を記載すれば良いです。しかし、Zabbixサーバマシンにインストールするzabbid_agentdが参照するZabbixサーバのIPアドレスは、通常使用する(外からアクセスできる)IPアドレスではなく、docker仮想ブリッジからZabbix Applianceコンテナに動的に割り当てられたほうのIPアドレスを利用してください。

zabbid_agentdの設定ファイルに記載するZabbixサーバのIPアドレスは、zabbid_agentdがそのZabbixサーバ以外を信用しないということを意味します。つまり、zabbid_agentdとZabbixサーバが通信するためには、zabbid_agentdの設定ファイルに記載しているZabbixサーバのIPアドレスと、Zabbixサーバがzabbid_agentdに対しアクセスしてくるIPアドレスが一致していなければなりません。

dockerコンテナに対するインバウンドの通信はdocker仮想ブリッジで作成されたNAPTを利用して行います。しかし、dockerコンテナからのアウトバウンドの通信は、同一ホスト内である限りNAPTではなく単純なルーティングとして行うようです。ホスト側でtcpdumpを動かして確認しました。なぜそうなっているのかについては、ここのサイトに詳しくdockerとiptablesに関する解説があるのですが、iptables難しい……。多分同一ホスト内だとS-NAPTするルールの前にルーティングしてしまうルールが入ってると思うんですけど。今度じっくり読み解いてみます。

というわけで、dockerコンテナがdockerホスト内で通信通信を行う際は、ルーティングで出ていくため、ZabbixサーバのdockerコンテナからZabbixエージェントがインストールされているdockerホストに対する通信は、IPが変更されずに行われます。そのためdockerコンテナに設定されているIPアドレスを、dockerサーバマシンのdockerエージェントの設定ファイルに記載する必要があるのです。

dockerコンテナに設定されているIPアドレスの確認は、dockerホストにログインし、そこからコンテナのシェルに入って行います。docker psでコンテナのIDを確認し、docker execを使ってシェルに入ってhostname -Iコマンドを使います。dockerホスト側からdocker network inspect bridgeを打ってもいいです。

こうして確認できたdockerコンテナのIPアドレスを、dockerホストのzabbid_agentdの設定ファイルに記載します。

zabbid_agentdインストール用 Playbook

またroleを実行するだけのPlaybookを作成します。

ansible-playbookコマンド実行

Ansibleサーバにて。

同じくPLAY RECAPでunreachableやfailedが出ていなければOK。

Zabbixサーバからエージェントを確認

Zabbixのブラウザ画面に戻ります。Configuration→Hostsをクリック。まずはZabbixサーバマシンに入れたzabbid_agentdの確認から。Zabbix Server をクリック。

Host nameを「Zabbix Server」から実際のホスト名に変更。これはzabbix_agentd.confのHostnameItem=system.hostnameにて、zabbid_agentdが自動で読み取るものです。zabbid_agentdが自動で読み取った実際のホスト名と、Zabbixサーバ側のHostの設定が一致していないと監視できません。実際にZabbixサーバのブラウザで表示されるのはHost nameではなくVisible Nameのため、そっちを「Zabbix Server」 に変更しておきます。Agent interfacesはZabbixサーバの外向きIPアドレスでOK。docker仮想ブリッジからdockerホスト側に付与されたIPアドレスでもいいはずです。終わったら「Update」をクリック。この設定を入れてしばらくすると、Agentと通信ができないというProblemが消えるはずです。

実際にデータが取れているか見てみます。Monitoring→Screens→Zabbix serverをクリックすると、デフォルトで定義されているZabbixサーバーのScreen(サーバごとの監視ダッシュボードのようなもの)が見れて、そこでCPUに関するグラフが見れます。

続いてZabbixエージェントマシンを監視対象に追加。Configuration→Hosts画面の右上の「Create host」をクリックします。

Hostタブでは、Host nameには実際のホスト名を記載。GroupsはSelectを押して「Linux servers」を選択します。Agent interfacesにIPアドレスを記入。

Templatesタブに移動。監視テンプレートをホストに対して設定することで、テンプレートで定義された監視ができます。今回は何もサービスを入れていないので、「Template OS Linux」のみを選択して「Add」。このテンプレートにはZabbixエージェントが監視を行うという監視テンプレートである「Template App Zabbix Agent」が内包されています。そしたら「Update」をクリック。

しばらくすると監視が開始されます。ビルトインで監視が設定されているZabbixサーバと違い、今回手作業で監視対象に追加したZabbixエージェントマシンは、Screenが設定されていないため、取り急ぎ他の方法で監視できていることを確認します。Monitering→Latest data画面のHostsにZabbixエージェントマシンのホスト名を記入して「Apply」をクリック。こんな感じで各監視項目と実際に取得できた値が表示されます。

以上。Zabbixって普通に建てるのはそこそこめんどいので、docker-composeもなしのdockerイメージ一発で公式が展開してくれてるのはすごく楽。簡単な検証にはすごい便利だとわかりました。Zabbix監視テンプレートの自作(というかネットに転がってるものの改造とインポート)もやったので、近々メモしたいです。

しかしなんかAnsibleは全然スマートな書き方ができない。vagrant + Ansible + dockerももっとうまいこと組み合わせて検証を爆速化させたい。こんなところでモタモタしている場合ではないんだよな。おわり。

参考

「Ansible+dockerでZabbix applianceを立ててエージェント監視を行う」への5件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。

*

  • メールアドレス、サイトは必須ではありません。
  • 日本語が含まれない投稿は無視されます。
  • URLはh抜き(ttp://もしくはttps://)で記載してください。