Edited at

Vagrant環境のDockerで、Zabbixサーバとエージェントを構築する


イントロ

以前自分のWikiに「Vagrant環境のDockerサーバに、Zabbixのサーバとエージェントを構築する」って記事を書いたのですが、そのときはVagrantのProvision機能でDockerをチマチマ実行してました。

今回は同じ環境を docker-compose で作成します。


作成する環境


  • 1つのVagrantfileで Zabbixサーバを1つ、別のVagrantfileで、監視されるエージェント側のOSを二つ構築します。

  • ZabbixサーバはUbuntu Linux 上のDocker上に構築します。

  • エージェント側もUbuntu Linuxとします。

  • それぞれの仮想マシンはネットワーク的に到達可能である必要がありますが、Vagrantはデフォルトではおなじネットワークを共有しないようなので1、ウラLANとして 192.168.33.0/24 のネットワークを構築します。

  • Zabbixサーバは80番ポートでWEBサーバが起動しますが、VagrantはNATかけないとアクセス出来ないので、port forwardingで 8888番ポートアクセスを80番ポートへ転送します。

図にするとこんな感じ。

ちなみに今回作業する環境は下記の通り。

$ sw_vers

ProductName: Mac OS X
ProductVersion: 10.14.5
BuildVersion: 18F132
$

Zabbixのバージョンは、日本語化の手順がエラーになる場合があるようで、 ubuntu-4.0.7 を指定しています。


コードの取得

使用するファイル群をGitHubから取得します。

$ git clone https://github.com/masatomix/environment_template.git

$ cd environment_template/
$ git checkout -t origin/feature/for_qiita_zabbix


Zabbixサーバの構築

サーバの構築はVagrantで一発です。

$ vagrant up

と実行することで、Ubuntu Linuxの構築から Dockerのインストール、Dockerサーバ上でのZabbixサーバのインストール、そのサーバ自体を監視するためのZabbixエージェントのコンテナのインストール、と設定と起動、までが行われます。

Vagrantが動いてるOS上のブラウザからhttp://127.0.0.1:8888/ へアクセスして、Zabbixサーバのログイン画面が表示されればOKです。admin/zabbix で入れることを確認しておきましょう。


ちなみにVagrantfile などはこんな

cloneした内容を見ればイイのですが、抜粋。


Vagrantfile

# -*- mode: ruby -*-

# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.network "forwarded_port", guest: 80, host: 8888
config.vm.network "private_network", ip: "192.168.33.10"

# コレを行わないと
# http://www.masatom.in/pukiwiki/Vagrant/TIPS%BD%B8/#ab1dd863
# vagrant packageでexportしたBoxが正しく動かないため記述
config.vm.provider "virtualbox" do |vb|
vb.customize [ "modifyvm", :id, "--uartmode1", "disconnected", "--memory", 4096 ]
end

config.vm.provision :shell, :path => "./script/provision_init.sh",:privileged => false
config.vm.provision :shell, :path => "./script/provision_ja.sh",:privileged => false

config.vm.provision :shell, :path => "./script/provision_docker.sh",:privileged => false
config.vm.provision :shell, :path => "./script/provision_docker_zabbix.sh",:privileged => false
end



provision_docker_zabbix.sh

#!/bin/sh

cd /vagrant/zabbix
sudo docker-compose up -d --build



docker-compose.yml はこちら

Docker上にZabbixサーバを構築するときにうごいた docker-compose.yml はこちらです。


docker-compose.yml

version: '3.5'

services:

mysql-server:
image: mysql:5.7
command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
environment:
- MYSQL_DATABASE=${DB_DATABASE}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
volumes:
- /etc/localtime:/etc/localtime:ro
- ./db/mysql_data:/var/lib/mysql
user: "1000:50" # remove at Photon
restart: always

zabbix-java-gateway:
image: zabbix/zabbix-java-gateway:${VERSION}
volumes:
- /etc/localtime:/etc/localtime:ro
restart: always

zabbix-server-mysql:
image: zabbix/zabbix-server-mysql:${VERSION}
depends_on:
- mysql-server
- zabbix-java-gateway
environment:
- DB_SERVER_HOST=mysql-server
- MYSQL_DATABASE=${DB_DATABASE}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
volumes:
- /etc/localtime:/etc/localtime:ro
ports:
- 10051:10051
restart: always

zabbix-web-nginx-mysql:
build: ./nginx/
depends_on:
- mysql-server
- zabbix-server-mysql
- zabbix-java-gateway
environment:
- DB_SERVER_HOST=mysql-server
- MYSQL_DATABASE=${DB_DATABASE}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- ZBX_SERVER_HOST=zabbix-server
- PHP_TZ="Asia/Tokyo"
volumes:
- /etc/localtime:/etc/localtime:ro
links:
- zabbix-server-mysql:zabbix-server
ports:
- 80:80
restart: always

zabbix-agent:
image: zabbix/zabbix-agent:${VERSION}
links:
- zabbix-server-mysql:zabbix-server
volumes:
- /etc/localtime:/etc/localtime:ro
restart: always



.env

VERSION=ubuntu-4.0.7

DB_DATABASE=zabbix
DB_USER=zabbix
DB_PASSWORD=zabbix
DB_ROOT_PASSWORD=zabbix


構築している内容は 以前記事にした モノとほとんど同じなので、細かい説明は省略します。


Zabbixエージェントの構築

つづいてエージェント側。

$ cd agent

$ vagrant up

と実行することで、Ubuntu Linuxの構築から Zabbixエージェントのインストールと設定と起動、までが行われます。

vagrant up が完了したらOSが二つ立ち上がっているはずので、ログイン出来ることを確認しておきましょう。

$ vagrant ssh agent001 (agent002)

Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-139-generic x86_64)
...
vagrant@agent001:~$


ちなみにVagrantfile などはこんな

cloneした内容を見ればイイのですが、抜粋。


agent/Vagrantfile

# -*- mode: ruby -*-

# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"

config.vm.define :agent001 do | agent001 |
agent001.vm.hostname = "agent001"
agent001.vm.network :private_network, ip: "192.168.33.11"
agent001.vm.provision :shell, :path => "./script/provision.sh",:privileged => true
end

config.vm.define :agent002 do | agent002 |
agent002.vm.hostname = "agent002"
agent002.vm.network :private_network, ip: "192.168.33.12"
agent002.vm.provision :shell, :path => "./script/provision.sh",:privileged => true
end
end



Zabbix Server自体の監視開始

ブラウザからZabbixの環境設定をおこないます。

http://127.0.0.1:8888/ へアクセスし、admin/zabbix でログイン します。

あ、まずは右上のヒトのアイコンをクリックして、LanguageをJapaneseにしておきます。

さて、まずはZabbix サーバ自体の監視を行います。

設定 >> ホスト >> Zabbix server で、DNS名に「zabbix-agent」と入力、接続方法を「DNS」へ変更し、更新をクリックします2

上記の通り、ほどなくして「ZBX」のアイコンが緑になっていればOKです。


各OSのエージェントでの監視開始(自動登録)

続いて、各OS agent001/agent002 の監視設定を追加します。元の記事 では手動登録していますが、同じようにやってもおもしろくないので、今回はディスカバリ機能を用いた自動登録を行ってみます。

手順はこんな感じ。


  • 設定 >> ディスカバリ の画面で、特定のローカルネット上の Zabbixエージェントを定期的に検索する設定を追加。そのときに、system.uname の値を取得するようにしておく

  • 設定 >> アクション の画面で、さきの検索にヒットした エージェントのうち、登録したいエージェントをフィルタする設定を記述

  • 設定 >> アクション >> 実行内容 で、ホストを追加したり、それをホストグループに入れたり、テンプレートをリンクしたりなど、実行したい処理を記述。

という流れになるようです。


ディスカバリルールの作成

設定>>ディスカバリで「ディスカバリルールの作成」を選択

名前に「My Local Network」、IPアドレスの範囲を今回設定した「192.168.33.1-20」くらいに設定、監視間隔を一旦60sに(たぶん有効なはず)。またチェックの欄の「新規」をクリック。

チェックのタイプを指定出来るので「Zabbixエージェント」を選択

キーに「system.uname」を選択して、「追加」をクリックします。

追加されました。最後に全体の「追加」ボタンを押せば完了です。

ディスカバリルールが作成できました。

監視データ >> ディスカバリ に遷移してみると、条件に合致したエージェント(192.168.33.11,12)が発見されていることが確認できるとおもいます。


ちなみに system.uname って。

途中ででてきた、チェックのキーとして設定したsystem.uname についてですが、ここにはZabbixがエージェントから取得できるデータ名を指定することが出来るようで、たとえばsystem.uname は下記のコマンドの実行結果となります。


(Server側のUbuntuで)

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker-compose exec zabbix-server-mysql zabbix_get -s zabbix-agent  -k system.uname

Linux fdd3e6a15327 4.4.0-139-generic #165-Ubuntu SMP Wed Oct 24 10:58:50 UTC 2018 x86_64

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker-compose exec zabbix-server-mysql zabbix_get -s 192.168.33.11 -k system.uname
Linux agent001 4.4.0-139-generic #165-Ubuntu SMP Wed Oct 24 10:58:50 UTC 2018 x86_64

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker-compose exec zabbix-server-mysql zabbix_get -s 192.168.33.12 -k system.uname
Linux agent002 4.4.0-139-generic #165-Ubuntu SMP Wed Oct 24 10:58:50 UTC 2018 x86_64

vagrant@ubuntu-xenial:/vagrant/zabbix$


このあとのアクションの設定で「この戻り値(受信した値) に agent00 が含まれていたら」など条件を指定できます。なので、このあとで使用したい値を記載しておく、という感じになります。


アクションの定義

続いて、アクションを定義していきます。

設定 >> アクションに移動し、イベントソースを「ディスカバリ」にして、「アクションの作成」をクリック。

名前を「Auto discovery (Local Network)」、新規条件を「サービスのタイプ」にして、「Zabbixエージェント」を選択し、追加 をクリック。

実行条件が追加出来ました。実行条件は複数設定できるので、たとえば「受信した値」に「agent00」を含む3 なんて条件を追加してみましょう。



追加。

つづいて「実行内容」を選択します。実行内容は条件に合致するエージェントに対する処理のことで「ホストを追加」「ホストグループに追加」「テンプレートとのリンクを作成」などを実施します。

「実行内容」タブをクリックして「新規」をクリック

実行内容のタイプ は「ホストを追加」を選んで「追加」



追加されました。

また「新規」を選択し「ホストグループに追加」、ホストグループ名に「Discovered hosts」を設定し



「追加」をクリック。



追加されました。

また「新規」を選択し「テンプレートとのリンクを作成」、テンプレートに「linux」などと入れると「Template OS Linux」などと補完候補が出てくるのでそれを選択。



「追加」をクリックすると、、

追加されました。最後にボタンの「追加」をクリックすれば、、、

アクションの登録も完了です。

設定>>ホスト をしばらく見ていると、、、agent001(192.168.33.11),agent002(192.168.33.12)が追加されましたねー。。。

ちなみにアクションには他にも、「あのディスカバリルールで検知したエージェントのときだけ」なんて設定も可能です。

以上で、基本的なZabbixサーバ/Zabbixエージェントの環境構築は完了です。

今回はVagrantでコマンド一発で環境構築をしましたが、オンプレやAWSに構築する場合も基本的に同じコマンドを叩けばOKでしょう。

おつかれさまでした。


おまけ。データのバックアップ

ついでに、MySQLのデータベースのバックアップ手順もまとめておきます。

vagrant sshでZabbix サーバにログイン後、

vagrant@ubuntu-xenial:~$ cd /vagrant/zabbix/

に移動しておきます。


MySQL以外のコンテナの停止

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker-compose ps

Name Command State Ports
-------------------------------------------------------------------------------------------------------------------
zabbix_mysql-server_1_bbe6d5af81da docker-entrypoint.sh --cha ... Up 3306/tcp, 33060/tcp
zabbix_zabbix-agent_1_e8a8079c2325 /sbin/tini -- docker-entry ... Up 10050/tcp
zabbix_zabbix-java-gateway_1_92505d90c8f9 docker-entrypoint.sh Up 10052/tcp
zabbix_zabbix-server-mysql_1_e37acaaa644d /sbin/tini -- docker-entry ... Up 0.0.0.0:10051->10051/tcp
zabbix_zabbix-web-nginx-mysql_1_432a2d375844 docker-entrypoint.sh Up 443/tcp, 0.0.0.0:80->80/tcp
vagrant@ubuntu-xenial:/vagrant/zabbix$

起動しているコンテナを、docker-compose の機能で停止します。引数はdocker-compose.ymlに書いてある「サービス名」もしくは上記のNameの一部分を使用します。

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker-compose stop zabbix-agent zabbix-java-gateway zabbix-server-mysql zabbix-web-nginx-mysql

Stopping zabbix_zabbix-web-nginx-mysql_1_432a2d375844 ... done
Stopping zabbix_zabbix-agent_1_e8a8079c2325 ... done
Stopping zabbix_zabbix-server-mysql_1_e37acaaa644d ... done
Stopping zabbix_zabbix-java-gateway_1_92505d90c8f9 ... done

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------------------------------
zabbix_mysql-server_1_bbe6d5af81da docker-entrypoint.sh --cha ... Up 3306/tcp, 33060/tcp
zabbix_zabbix-agent_1_e8a8079c2325 /sbin/tini -- docker-entry ... Exit 0
zabbix_zabbix-java-gateway_1_92505d90c8f9 docker-entrypoint.sh Exit 143
zabbix_zabbix-server-mysql_1_e37acaaa644d /sbin/tini -- docker-entry ... Exit 0
zabbix_zabbix-web-nginx-mysql_1_432a2d375844 docker-entrypoint.sh Exit 0

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d44071b826a6 mysql:5.7 "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 3306/tcp, 33060/tcp zabbix_mysql-server_1_bbe6d5af81da

MySQL以外が停止されました。

以後「MySQL以外のコンテナの停止」といったらこの作業を指すこととしましょう。


データのバックアップ

MySQLコンテナに入って、データをバックアップします。

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker-compose exec mysql-server /bin/bash

I have no name!@d44071b826a6:/$ mysqldump --single-transaction -uzabbix -pzabbix zabbix > /tmp/db20190722.dump
mysqldump: [Warning] Using a password on the command line interface can be insecure.

I have no name!@d44071b826a6:/$ exit
exit

コンテナ内の/tmpにバックアップデータが出力されました。

つづいてコンテナからこのデータを取り出します。

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker cp d44071b826a6:/tmp/db20190722.dump ./

vagrant@ubuntu-xenial:/vagrant/zabbix$ ls -lrt
合計 2736
drwxr-xr-x 1 vagrant vagrant 96 7月 22 00:07 nginx
drwxr-xr-x 1 vagrant vagrant 96 7月 22 00:07 db
-rw-r--r-- 1 vagrant vagrant 2091 7月 22 00:07 docker-compose.yml
-rw-r--r-- 1 vagrant vagrant 2796867 7月 22 00:35 db20190722.dump <- コレ
vagrant@ubuntu-xenial:/vagrant/zabbix$

コンテナからの取り出しが完了しました。dumpによるフルバックアップは、このデータを保管しておけばOKです。

最後に各サーバを起動して、バックアップは完了です。

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker-compose start zabbix-agent zabbix-java-gateway zabbix-server-mysql zabbix-web-nginx-mysql

Starting zabbix-java-gateway ... done
Starting zabbix-server-mysql ... done
Starting zabbix-web-nginx-mysql ... done
Starting zabbix-agent ... done

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------------------
zabbix_mysql-server_1_bbe6d5af81da docker-entrypoint.sh --cha ... Up 3306/tcp, 33060/tcp
zabbix_zabbix-agent_1_e8a8079c2325 /sbin/tini -- docker-entry ... Up 10050/tcp
zabbix_zabbix-java-gateway_1_92505d90c8f9 docker-entrypoint.sh Up 10052/tcp
zabbix_zabbix-server-mysql_1_e37acaaa644d /sbin/tini -- docker-entry ... Up 0.0.0.0:10051->10051/tcp
zabbix_zabbix-web-nginx-mysql_1_432a2d375844 docker-entrypoint.sh Up 443/tcp, 0.0.0.0:80->80/tcp
vagrant@ubuntu-xenial:/vagrant/zabbix$

起動されました。以後「各サーバを起動」といったらこの作業を指すこととしましょう。


おまけ。データのリストア


コンテナ停止

既出の手順「MySQL以外のコンテナの停止」を実施します。


リストア準備

さてMySQL以外が停止している状態で、リストアを開始します。手順は、すでに存在するデータベースを削除したのち、事前に取得しておいたバックアップデータを戻すという流れです。

まずはMySQLコンテナにバックアップデータをコピーします。

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker cp ./db20190722.dump d44071b826a6:/

vagrant@ubuntu-xenial:/vagrant/zabbix$ sudo docker-compose exec mysql-server /bin/bash

I have no name!@d44071b826a6:/$ ls -lrt
total 2800
...
-rw-r--r-- 1 1000 1000 2796867 Jul 22 00:35 db20190722.dump
I have no name!@d44071b826a6:/$

コンテナへデータを転送出来ました。


DB削除・空DB作成・リストア

I have no name!@d44071b826a6:/$  mysql -uzabbix -pzabbix

...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> drop database zabbix;
Query OK, 144 rows affected (1.70 sec)

mysql> create database zabbix;
Query OK, 1 row affected (0.01 sec)

mysql> exit
Bye

さて、データを入れていきます。

I have no name!@d44071b826a6:/$ mysql -uzabbix -pzabbix zabbix < ./db20190722.dump

mysql: [Warning] Using a password on the command line interface can be insecure.
I have no name!@d44071b826a6:/$

I have no name!@d44071b826a6:/$ exit
exit

リストア完了です。


起動

最後に「各サーバを起動」しましょう。おつかれさまでした!


関連リンク





  1. publicにBridgeすりゃイイんですが 



  2. Zabbixサーバ自体にインストールされたエージェントのコンテナは、「zabbix-agent」で名前解決される 



  3. 受信した値ってのは、system.unameのことで、ココにはホスト名(agent001,agent002など)が含まれているんでしたよね。