はじめに
AWS上のEC2(Amazon Linux2023)上に、ZabbixServer7.0LTSを構築して運用しようとしたら、メディアタイプのEmailがエラーになって、ちょっとハマってしまいました。
試行錯誤の末、なんとか解決できたのでその対応内容をメモとして残します。
本題に入る前に
まずはAmazon Linux2023にZabbixServer7.0LTSをインストールする手順
MySQLのインストール
# dnf install -y https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm
# rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
# dnf install -y mysql-community-server mysql-community-client mysql-community-devel
MySQLサーバの起動
# systemctl start mysqld
# systemctl enable mysqld
MySQLの初期パスワードの確認
# grep 'temporary password' /var/log/mysqld.log
MySQLは初回起動時に root ユーザーの一時パスワードを自動生成し、それは /var/log/mysqld.log に出力されるので、そのログの中から「temporary password(仮パスワード)」を含む行を検索して表示します
MySQLのrootパスワード変更
# mysql -u root -p
(ここで先ほど確認した一時パスワードを入力)
> ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
Zabbixリポジトリのインストール
# rpm -Uvh https://repo.zabbix.com/zabbix/7.0/amazonlinux/2023/x86_64/zabbix-release-latest-7.0.amzn2023.noarch.rpm
# dnf clean all
Zabbixサーバとフロントエンドのインストール
# dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-agent
# dnf install zabbix-web-japanese
初期データベースの構築
# mysql -u root -p
新しいパスワード
mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;
mysql> create user zabbix@localhost identified by 'password';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> set global log_bin_trust_function_creators = 1;
mysql> quit;
”新しいパスワード”は、上記で設定したパスワードを入力
Zabbixサーバの初期スキーマのインポート
# zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -u zabbix -p zabbix
log_bin_trust_function_creatorsオプションの無効化
# mysql -u root -p
新しいパスワード
mysql> set global log_bin_trust_function_creators = 0;
mysql> quit;
Zabbixサーバのデータベースを構成
/etc/zabbix/zabbix_server.conf の以下の部分を編集
DBPassword=password
Zabbixサーバ、エージェントの起動
# systemctl restart zabbix-server zabbix-agent httpd php-fpm
# systemctl enable zabbix-server zabbix-agent httpd php-fpm
ここまでで、Amazon Linux2023上にZabbixServer7.0LTSを構築することができました
本題:発生したトラブル
通常のZabbixServerと同じように色々な監視登録や、ダッシュボード作成は問題なくできていたのですが、異常を検知し、その内容をEmailで送付(トリガーで検知し、トリガーアクションのメディアタイプ(Email))しようとしたら
cURL library returned error when enabling SMTP/SMTPS: Unsupported protocol (using version 8.11.1)
というエラーが表示され、うまくEmailを送付できませんでした
SMTPなのにcURLのライブラリ??? と意味が理解できませんでした
結論(原因)
・ZabbixはEmail送信に libcurl を利用している
・Amazon Linux2023では、初期では libcurl-minimal という軽量版がインストールされており、これはSMTPなど一部プロトコルが省かれている
対策
軽量版の libcurl-minimal からフル機能版の libcurl に切り替える
事前確認
Zabbixがどの共有ライブラリに依存しているか、それがどのRPMパッケージに属しているかを確認
# ldd $(which zabbix_server) | grep curl
libcurl.so.4 => /lib64/libcurl.so.4 (0x00007f808372c000)
# rpm -qf /lib64/libcurl.so.4
libcurl-minimal-8.11.1-4.amzn2023.0.1.x86_64
サポートしているプロトコルを確認
# curl --version
curl 8.11.1 (x86_64-amazon-linux-gnu) libcurl/8.11.1 OpenSSL/3.2.2 zlib/1.2.11 libidn2/2.3.2 libpsl/0.21.5 nghttp2/1.59.0
Release-Date: 2024-12-11
Protocols: file ftp ftps http https ipfs ipns
Features: alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz PSL SPNEGO SSL threadsafe UnixSockets
やはりSMTPはサポートしていない
libcurl-minimal → libcurlへの切り替え
# dnf install -y --allowerasing libcurl
※ dnf install -y libcurl だけだと、競合関係でエラーがでたので、 --allowerasing で上書きしました
確認
# rpm -qf /lib64/libcurl.so.4
libcurl-8.11.1-4.amzn2023.0.1.x86_64
# curl --version
curl 8.11.1 (x86_64-amazon-linux-gnu) libcurl/8.11.1 OpenSSL/3.2.2 zlib/1.2.11 brotli/1.0.9 libidn2/2.3.2 libpsl/0.21.5 libssh/0.10.6/openssl/zlib nghttp2/1.59.0 OpenLDAP/2.4.57
Release-Date: 2024-12-11
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM PSL SPNEGO SSL threadsafe TLS-SRP UnixSockets
無事SMTPをサポートしたライブラリに変更でき、ZabbixからもEmailを送付できるようになりました
最後に
最初はメール送信なのにcURLのエラーが発生してしまい、かなり戸惑いました
エラーの意味するところは(今となっては)わかりやすかったのですが、
「SMTPをサポートしたcURLを /bin に置けば良いんでしょ」
と思い、
/usr/local/bin/curl に新たにインストールして、
/bin/curl を/bin/curl.bak にして/usr/local/bin/curl のリンクを /bin/curl に貼る
→ うまくいかない
みたいな試行錯誤を繰り返していました
ちゃんとエラーには”ライブラリが”って出てるのにね
エラーの内容をしっかりと理解してから対処方法を検討するようにしましょう(自戒)