イントロ
以前自分の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した内容を見ればイイのですが、抜粋。
# -*- 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
#!/bin/sh
cd /vagrant/zabbix
sudo docker-compose up -d --build
docker-compose.yml はこちら
Docker上にZabbixサーバを構築するときにうごいた 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
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した内容を見ればイイのですが、抜粋。
# -*- 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
は下記のコマンドの実行結果となります。
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
リストア完了です。
起動
最後に「各サーバを起動」しましょう。おつかれさまでした!