月別アーカイブ: 2024年9月

docker composeで作っていたzabbixをバージョンアップして再構築しようとしたら色々はまったときのメモ

mysqlのlatestイメージとzabbix-server-mysql:alpine-7.0-latestの組み合わせだとDBの権限が足りなくて初期構築のsqlが実行されない

docker compose を初回起動するとおおよそ以下のようなエラーが出た

ERROR 1419 (HY000): You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

zabbixサーバー(zabbix-server-mysql)からdbに初期構築のsqlを実行しようとするが、バイナリログを使用しているときには特別に権限が必要らしい。意図的にはバイナリログを有効にしていないしDockerのmysqlだと通常無効と調べている途中で見たが実際にできたDBを覗くとバイナリログが有効になっている。

mysql> SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+

my.cnfカスタマイズしている影響の可能性もあるけど、下のコマンドで素の引っ張りたてイメージでもバイナリログ有効になっていた。

 docker run -it --name test-wolrd-mysql -e MYSQL_ROOT_PASSWORD=mysql -d mysql

このへんから呼ばれるcreate.sql.gzの中身で呼ばれているっぽい。qz自体はzabbixのものでたぶんここらへんでつくられている模様。(ちゃんと見ていない)zabbix-serverの/usr/share/doc/zabbix-server-mysql/create.sql.gzを見ようとしたけど長いので見るのやめた。何か制約にかかるトリガーとかを作っているのだと思う。

対処法

my.confに以下を追加

[mysqld]
log_bin_trust_function_creators = 1

制約回避の設定。他にも回避策の指定は色々あるらしい。

zabbix-agentとのバージョン違い?

zabbix-server-1 | 197:20240929:102940.592 unknown request received from “192.168.xxx.yyy“: [active check heartbeat]

みたいなメッセージがzabbix-serverのログに出ていて、zabbixのGUIのエージェント死活監視の色が緑にならず灰色のままだった。データ自体は取れている模様。

対処法

エージェントとサーバのバージョンを合わせた。(他にもいろいろやっていた中だったのでたまたまの可能性もなくはない)

zabbiz-agentでサーバ側のipを指定する必要があるがdocker composeの素の状態だと変わってしまう

zabbix agent(/etc/zabbix/zabbix_agentd.conf)でServer,ServerActiveにzabbixサーバのIPを指定する必要があるがcompose内で明確に指定しないとipが変わってしまうので接続できなくなる時がある。

対処法

ipを固定すればよい。

まずはdocker-compose.ymlで、下みたいにカスタムネットワーク作ってIP指定する。

services->zabbix-server->networks->zabbix2hostでの利用指定とnetworks->zabbix2hostでのネットワーク作成。

services:
  zabbix-server:
    build: ./server
    cap_add:
      - NET_ADMIN
    restart: always
    depends_on:
      - db
    volumes:
      - "./data/zabbix:/var/lib/zabbix"
    environment:
      DB_SERVER_HOST: db
      MYSQL_USER: ほげ
      MYSQL_PASSWORD: ふが
    ports:
      - "10051:10051"
    networks:
      zabbix2host:
        ipv4_address: 192.168.100.2
      default: {}

networks:
  zabbix2host:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.100.0/24

zabbix2hostとdefaultの二つのネットワークに所属しているのでルーティング設定も必要。(zabbix-serverで使うネットワークが一つならおそらく不要)

dockerイメージでip route を使うがdocker-compose.ymlでcap_add:NET_ADMINの権限を付与していないと使えないはず。(もしくはprivileged指定)

docker起動時にルーティングをするようにentrypointとなるシェルを作成。

#!/bin/sh
# route2はdocker fileにてインストール済み
#向き先 host gwはcomposeで作成したネットワークのもの 
sudo ip route add 192.168.1.2 via 192.168.100.1

exec docker-entrypoint.sh "$@"

192.168.1.2(zabbix-agentが実際に動いているdockerのホストIP)は192.168.1.2(zabbix-agentが実際に動いているdockerのホストIP)は192.168.1.2(zabbix-agentが実際に動いているdockerのホストIP)は作ったネットワーク(192.168.100.1)を使う設定。

ルーティングだけ追加したら、元々のエントリーのdocker-entrypoint.shを呼び出し元のパラメータ付きでコール

で、Dockerファイルも作成

FROM zabbix/zabbix-server-mysql:alpine-7.0-latest

# 元イメージでユーザーがzabbix(1997になっているので一旦切り替え)
USER 0
COPY add-route-entrypoint.sh /usr/local/bin/add-route-entrypoint.sh
RUN chmod +x /usr/local/bin/add-route-entrypoint.sh && apk add --no-cache iproute2 && apk add --no-cache sudo && echo "zabbix ALL=(ALL) NOPASSWD: /sbin/ip" >> /etc/sudoers
USER 1997

ENTRYPOINT ["add-route-entrypoint.sh"]
CMD ["/usr/sbin/zabbix_server", "--foreground", "-c", "/etc/zabbix/zabbix_server.conf"]

alpineだとiproute2もないのでapk(alpineのapt相当)でインストール。sudoも使うのでインストール、シェル実行時にパスワードがいいらないように/etc/sudoersも編集。

あとは作ったadd-route-entrypoint.shをエントリーポイントにして、zabbix/zabbix-server-mysql:alpine-7.0-latestと同じCMDをつけて呼び出し。(ENTRYPOINT付けたらベースイメージのCMDがクリアされていた。引き継がれる気がしていたけどどこか間違っている?)

netplanのgateway4がdeprecatedになっていた

sudo vi /etc/netplan/50-cloud-init.yaml
network:
    ethernets:
        enp2s0:
            dhcp4: false
            addresses:
              - 192.168.1.5/24
            gateway4: 192.168.1.1
            nameservers:
              addresses:
                - 8.8.8.8
                - 8.8.4.4
    version: 2

からの

sudo netplan try

** (process:991): WARNING **: 08:38:09.630: gateway4 has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.

と怒られた。

gateway4がdeprecated(非推奨)になってrouteを使えとのこと

network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: false
      addresses:
        - 192.168.1.100/24
      routes:
        - to: 0.0.0.0/0
          via: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4

Dockerがhostのネットワークを使っている場合routingがこのto設定の影響を受けるので要注意

Ubuntuを24にメジャーアップグレードしたらZabbix-agentがなくなったので再インストール

以前インストールしていた(こちら)zabbix-agentがUbuntuのメジャーアップグレードのタイミングでなくなっていた。再度インストールしなおしたときの手順。

zabbixのレポジトリ再インストール

wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1%2Bubuntu24.04_all.deb
sudo dpkg -i zabbix-release_6.4-1+ubuntu24.04_all.deb

からのaptインストール

sudo apt update
sudo apt install zabbix-agent

/etc/zabbix/zabbix_agentd.confのServer,ServerActive,Hostnameを監視サーバのドメインに書き換え

Server=kanshi.epea.co.jp
ServerActive=kanshi.epea.co.jp
Hostname=kanshi.epea.co.jp

サービス登録

sudo systemctl start zabbix-agent
sudo systemctl enable zabbix-agent

上記で動いたっぽい