Zabbix Server 6.0(MySQL)をdocker上に構築する(ubuntu22.04)

以前はZabbixをローカル上に構築していたのですが、docker上の方が管理が楽かと思い、docker上に構築することにしました。

OSはUbuntu22.04 Serverです。構築後のご参考画面として、インストール後、3時間ほど経過した画面は以下です。

一点、注意点としてMySQLのデータを格納する領域はSSDが好ましいです。HDDにした場合、Zabbix初回起動時に実行されるSQL文で2時間以上かかりました(終わらないので途中であきらめて翌朝確認したら終わっていました)。

遅かった理由はMySQL8.xで有効になった各種パフォーマンスに影響のあるパラメータのデフォルト値がSSD前提となっており、HDDを利用した場合には「遅い」を通り越して「使い物にならないくらい遅い」状態となりました。innodb_flush_log_at_trx_commit、sync_binlogあたりをいじる事で多少は改善できましたが、それでもSSDの50~100倍ぐらい遅かった(RedmineのDBインポート処理で、HDD:2分、SSD:数秒ぐらいの差がありました。)為、HDDを利用している場合で「やけにセットアップに時間がかかるな~。SQL実行中から変わらない・・・」となった場合にはDB格納先がSSDのサーバを試してみる事をお勧めします。

dockerのセットアップ

sudo apt install docker docker-compose
sudo systemctl enable --now docker

# dockerグループに作業ユーザーを追加する
sudo adduser  ${USER} docker

# ログオフして再度ログインしなおします。
exit

MySQL(ローカル)のインストール

当方のMySQLは、他にも色々な用途で利用している為、ローカルにインストールして、Zabbix用のDBを作成し、Dockerからも接続可能な状態とします。mysql_native_password BYの後に続いているパスワード(赤字部分)は適宜変更してください。

sudo apt install mysql-client mysql-server

# mysqlにローカルホスト以外から接続可能とする。
sudo sed -i "s/127.0.0.1/0.0.0.0/g" /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql.service

# zabbix用のDBとユーザーを作成します。
sudo mysql
create database zabbix;
CREATE USER 'zabbix'@'172.%' IDENTIFIED WITH mysql_native_password BY 'cdiCD9AAAAcc4432CDS))_CDSASCD#@idsasdfcd';
GRANT ALL ON zabbix.* TO 'zabbix'@'172.%';
flush privileges;
exit;

Zabbix Serverのインストール

基本的にはオフィシャルサイトよりリンクされているイメージを利用させて頂きます。

git clone https://github.com/zabbix/zabbix-docker.git
cd zabbix-docker

cp docker-compose_v3_ubuntu_mysql_latest.yaml docker-compose.yaml

# dockeeコマンドを叩く前に設定を編集します。
# 設定値は後述します。
vi docker-compose.yaml
vi env_vars/.env_db_mysql
vi env_vars/.env_srv
vi env_vars/.env_web

docker-compose.yaml

今回は、zabbix-server、zabbix-web-nginx-mysqlのservicesのみを残し、他は削除しました。ご参考までに設定値は以下です。途中でMYSQL_~~~と言う箇所がありますが、これがMYSQL関係の設定値です。追って、env_varsフォルダにあるファイルで設定します。

version: '3.5'
services:
 zabbix-server:
  image: zabbix/zabbix-server-mysql:ubuntu-6.0-latest
  ports:
   - "10051:10051"
  volumes:
   - /etc/localtime:/etc/localtime:ro
   - ./zbx_env/usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:ro
   - ./zbx_env/usr/lib/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:ro
   - ./zbx_env/var/lib/zabbix/export:/var/lib/zabbix/export:rw
   - ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro
   - ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro
   - ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro
   - ./zbx_env/var/lib/zabbix/mibs:/var/lib/zabbix/mibs:ro
   - snmptraps:/var/lib/zabbix/snmptraps:rw
  ulimits:
   nproc: 65535
   nofile:
    soft: 20000
    hard: 40000
  deploy:
   resources:
    limits:
      cpus: '0.70'
      memory: 1G
    reservations:
      cpus: '0.5'
      memory: 512M
  env_file:
   - ./env_vars/.env_db_mysql
   - ./env_vars/.env_srv
  secrets:
   - MYSQL_USER
   - MYSQL_PASSWORD
   - MYSQL_ROOT_USER
   - MYSQL_ROOT_PASSWORD
#   - client-key.pem
#   - client-cert.pem
#   - root-ca.pem
  networks:
   zbx_net_backend:
     aliases:
      - zabbix-server
      - zabbix-server-mysql
      - zabbix-server-ubuntu-mysql
      - zabbix-server-mysql-ubuntu
   zbx_net_frontend:
  stop_grace_period: 30s
  sysctls:
   - net.ipv4.ip_local_port_range=1024 65000
   - net.ipv4.conf.all.accept_redirects=0
   - net.ipv4.conf.all.secure_redirects=0
   - net.ipv4.conf.all.send_redirects=0
  labels:
   com.zabbix.description: "Zabbix server with MySQL database support"
   com.zabbix.company: "Zabbix LLC"
   com.zabbix.component: "zabbix-server"
   com.zabbix.dbtype: "mysql"
   com.zabbix.os: "ubuntu"

 zabbix-web-nginx-mysql:
  image: zabbix/zabbix-web-nginx-mysql:ubuntu-6.0-latest
  ports:
   - "8080:8080"
   - "8443:8443"
  volumes:
   - /etc/localtime:/etc/localtime:ro
   - ./zbx_env/etc/ssl/nginx:/etc/ssl/nginx:ro
   - ./zbx_env/usr/share/zabbix/modules/:/usr/share/zabbix/modules/:ro
  deploy:
   resources:
    limits:
      cpus: '0.70'
      memory: 512M
    reservations:
      cpus: '0.5'
      memory: 256M
  env_file:
   - ./env_vars/.env_db_mysql
   - ./env_vars/.env_web
  secrets:
   - MYSQL_USER
   - MYSQL_PASSWORD
  depends_on:
   - zabbix-server
  healthcheck:
   test: ["CMD", "curl", "-f", "http://localhost:8080/"]
   interval: 10s
   timeout: 5s
   retries: 3
   start_period: 30s
  networks:
   zbx_net_backend:
    aliases:
     - zabbix-web-nginx-mysql
     - zabbix-web-nginx-ubuntu-mysql
     - zabbix-web-nginx-mysql-ubuntu
   zbx_net_frontend:
  stop_grace_period: 10s
  sysctls:
   - net.core.somaxconn=65535
  labels:
   com.zabbix.description: "Zabbix frontend on Nginx web-server with MySQL database support"
   com.zabbix.company: "Zabbix LLC"
   com.zabbix.component: "zabbix-frontend"
   com.zabbix.webserver: "nginx"
   com.zabbix.dbtype: "mysql"
   com.zabbix.os: "ubuntu"

networks:
  zbx_net_frontend:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    ipam:
      driver: default
      config:
      - subnet: 172.16.238.0/24
  zbx_net_backend:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    internal: true
    ipam:
      driver: default
      config:
      - subnet: 172.16.239.0/24

volumes:
  snmptraps:

secrets:
  MYSQL_USER:
    file: ./env_vars/.MYSQL_USER
  MYSQL_PASSWORD:
    file: ./env_vars/.MYSQL_PASSWORD
  MYSQL_ROOT_USER:
    file: ./env_vars/.MYSQL_ROOT_USER
  MYSQL_ROOT_PASSWORD:
    file: ./env_vars/.MYSQL_ROOT_PASSWORD

env_vars/.env_db_mysql

大まかに以下のように設定します。実は、zabbix serverを起動させて、DB接続不可でリトライが走っている間に「あ、DBのアクセス権限間違っている」と気付いて、その際にアクセス権を振りなおしてもリカバリ可能でした。

DB_SERVER_HOST=192.168.100.100
DB_SERVER_PORT=3306
MYSQL_USER=zabbix
MYSQL_ROOT_USER=zabbix
MYSQL_PASSWORD=cdiCD9AAAAcc4432CDS))_CDSASCD#@idsasdfcd
MYSQL_ROOT_PASSWORD=cdiCD9AAAAcc4432CDS))_CDSASCD#@idsasdfcd
MYSQL_DATABASE=zabbix

env_vars/.env_srv

なにも編集せずとも問題ありませんが、利用したい設定等があれば編集します。

env_vars/.env_web

最低限、時刻だけは直します。

PHP_TZ=Asia/Tokyo

docker起動

設定が終わったら起動させます。

# イメージをダウンロードして起動。
docker-compose  up -d

# 状態確認
docker ps -a

# ログ確認方法(zabbix_docker以降は、ps -a の結果で名前を適宜修正してください。TAB保管も出来ると思います。)
docker logs zabbix-docker_zabbix-web-nginx-mysql_1
docker logs zabbix-docker_zabbix-server_1

# MYSQL接続エラー等が出ていた場合
docker exec -it zabbix-docker_zabbix-server_1  bash
mysql -uzabbix -h192.168.100.100 -p # IPはご指針のMYSQLサーバのIPに変更してください


Zabbix Serverへログインして初期設定等を実施

dockerへログインする為に、http://<dockerの入っているサーバのIP>:8080/ でアクセスして、初期パスワードである「Admin/zabbix」でログインします。

パスワードだけはデフォルトから変更した方が良いと思います。

dockerの入っているサーバへzabbix agentをインストール

こちらは、普通にaptで入れました。

wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-2%2Bubuntu22.04_all.deb

sudo dpkg -i zabbix-release_6.0-2+ubuntu22.04_all.deb
sudo apt update
sudo apt install zabbix-agent

# 接続元サーバを設定
sudo vi /etc/zabbix/zabbix_agentd.conf


zabbix_agentd.confを編集

デフォルトのままだとローカルホストからのみ接続を許可する為、zbx_net_frontendで設定していたアドレスレンジからの接続を許可します。

# Server=127.0.0.1
Server=172.16.238.0/24

# 編集が終わったらzabbix-agentを再起動します。
sudo systemctl  restart  zabbix-agent.service

Zabbix Serverから、zabbixserverが127.0.0.1のIPで登録されたままとなっている為、IPを172.16.238.1に変更することで、dockerが入っているサーバの状態が取れるようになります。

私はmysqlのテンプレート等を追加しそれらも取得できるようにしました。また、OpenWRTルータを複数台利用している為、その各々にZabbix Agentを入れて、その状態も取得できるようにしています。

【問題点】10秒ごとにAuditログにゲストのログイン失敗ログが記録される

dockerイメージでzabbixを導入した時の仕様?のようで、こちらにチケットがありました。ゲストで「failed login」がlocalhost(127.0.0.1)から大量にログ記録されており、最初見たときは何れかのサーバがログイン施行されているかと勘違いしたのですが・・・・修正はしない些細なバグと言う扱いのようなので、将来的に修正されるのかも不明ですが、直る事を期待しています。

上記、こちらに内容を記載しました。良ければご覧ください。

タグ , . ブックマークする パーマリンク.

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください