LoginSignup
1
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-24

イントロ

以前自分の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番ポートへ転送します。

図にするとこんな感じ。
Vagrant_Docker_zabbix.png

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

$ 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 で入れることを確認しておきましょう。
top.png

ちなみに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
hosts001.png

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

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

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

手順はこんな感じ。

  • 設定 >> ディスカバリ の画面で、特定のローカルネット上の Zabbixエージェントを定期的に検索する設定を追加。そのときに、system.uname の値を取得するようにしておく
  • 設定 >> アクション の画面で、さきの検索にヒットした エージェントのうち、登録したいエージェントをフィルタする設定を記述
  • 設定 >> アクション >> 実行内容 で、ホストを追加したり、それをホストグループに入れたり、テンプレートをリンクしたりなど、実行したい処理を記述。

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

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

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

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

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

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

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

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

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

ちなみに 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 が含まれていたら」など条件を指定できます。なので、このあとで使用したい値を記載しておく、という感じになります。

アクションの定義

続いて、アクションを定義していきます。
設定 >> アクションに移動し、イベントソースを「ディスカバリ」にして、「アクションの作成」をクリック。
08.png

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

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

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

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

実行内容のタイプ は「ホストを追加」を選んで「追加」
14.png
追加されました。
15.png

また「新規」を選択し「ホストグループに追加」、ホストグループ名に「Discovered hosts」を設定し
17.png
「追加」をクリック。
18.png
追加されました。
19.png

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

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

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

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

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

以上で、基本的な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など)が含まれているんでしたよね。 

1
3
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
3