CentOS8にZabbix5をインストールする

OS: CentOS Linux release 8.2.2004 (Core)
Zabbix 5.0 LTS
MySQL: 8.0.21

CentOS8.2にZabbix5.0を導入しようと思い立って公式サイトの手順に従いながら作業をこなしていったのであるが、記載してある内容だけでは目的が達成できなかったために、幾らかのメモを付け加えながら手順に起こしなおそうというものである。

まずは使用するデータベースを予めインストールしておかなければならない。MySQLを使用する心づもりでいたからそのように段取りする。

ZabbixをインストールするOSとミドルウェア
$ sudo dnf install mysql-server
$ sudo systemctl enable mysqld.service
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
$ sudo systemctl start mysqld.service

rootユーザのパスワードをセットしたり不要なデータベースの削除を簡便にこなすために mysql_secure_installation を実行する。まずはパスワード強度を検証するためのコンポーネントをセットアップする。

$ sudo mysql_secure_installation
(snip)
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

パスワード強度として選択できるのは3種類あって、LOWは8文字以上、MEDIUMはLOWの条件に加えて数字と大文字小文字と記号が必要となり、STRONGはMEDIUMの条件に加えて辞書ファイルの単語にマッチしてはならないという条件が要求される。

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file


Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
Please set the password for root here.
(snip)

パスワードをセットしたら次へ移る。デフォルトでMySQLは誰もがログインできる匿名ユーザが作成されるから本番環境では削除すべきというメッセージが表示されるけれども、パッケージからインストールしたMySQLにはそのようなユーザを見つけることができなかった。然し乍ら念の為、削除するよう要請する。

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

次いで、rootユーザがリモートから接続する権利を剥奪するか聞かれる。此れも先と同様にパッケージインストールのMySQLには見当たらないけれども一応、剥奪しておく。

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y

testデータベースとそれへのアクセス権もやはり存在しないけれど削除するよう選択肢に答える。

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y

最後に設定を反映する。

(snip)
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

そうしたらZabbixの公式サイトの手引2番目にある作業を執り行う。Zabbixのリポジトリを登録し、Zabbixサーバとフロントエンド、Zabbixエージェントをインストールする。

$ sudo rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
$ sudo dnf clean all
$ sudo dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-agent

続いてzabbixデータベースを作成する。文字コードや照合順序の指定がUTF8MB3であるために警告が出ているけれども、此れを修正するにはスキーマファイルに手を入れる必要が生じそうであるし、そも絵文字を使用する計画がないからそのままにしておいた。

$ mysql -uroot -p
mysql> create database zabbix character set utf8 collate utf8_bin;
Query OK, 1 row affected, 2 warnings (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                                                                                     |
+---------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 3719 | 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous. |
| Warning | 3778 | 'utf8_bin' is a collation of the deprecated character set UTF8MB3. Please consider using UTF8MB4 with an appropriate collation instead.                                     |
+---------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

引き続きzabbixユーザの作成、パスワード・権限の設定を実施してMySQLにまつわる設定は終いである。

mysql> create user zabbix@localhost identified by 'p@ssw0rd';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> quit;

それからスキーマファイルからデータベースにまつわる諸々をインポートする。

$ zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
Enter password:

Zabbixサーバの設定ファイルに手を入れる。最低限、編集する必要のある箇所はデータベースへの接続パスワードである。

$ sudo vi /etc/zabbix/zabbix_server.conf
# DBPassword=
DBPassword=p@ssw0rd

タイムゾーンの設定をよしなに書き換える。

$ sudo vi /etc/php-fpm.d/zabbix.conf
; php_value[date.timezone] = Europe/Riga
php_value[date.timezone] = Asia/Tokyo

公式サイトの手引ではこのあといよいよZabbixサーバやエージェントなどの起動を手掛けるけれども、zabbix-serverだけが起動しないのであればSELinuxが有効で且つ、適当な設定が施されていない疑いがつよい。

SELinuxのロゴ
$ sudo systemctl restart zabbix-server zabbix-agent httpd php-fpm
Job for zabbix-server.service failed because the control process exited with error code.
See "systemctl status zabbix-server.service" and "journalctl -xe" for details.

さりとてZabbixの公式サイトでは触れられていないし、SELinuxはまったくの門外漢であるからSELinuxを無効にするより手立てがなかった。

$ sudo vi /etc/sysconfig/selinux
#SELINUX=enforcing
SELINUX=disabled
$ sudo reboot

$ getenforce
Disabled

これでようやっとzabbix-serverも起動するようになった。

$ sudo systemctl restart zabbix-server zabbix-agent httpd php-fpm
 sudo systemctl enable zabbix-server zabbix-agent httpd php-fpm
Created symlink /etc/systemd/system/multi-user.target.wants/zabbix-server.service → /usr/lib/systemd/system/zabbix-server.service.
Created symlink /etc/systemd/system/multi-user.target.wants/zabbix-agent.service → /usr/lib/systemd/system/zabbix-agent.service.
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service → /usr/lib/systemd/system/php-fpm.service.

これで安心しきってブラウザから http://server_ip_or_name/zabbix へアクセスしたら、ちっとも繋がらなくて肩を落とす事例を幾らか見聞するけれどもそういう場合はfirewalldがアクセスを遮断しているケースが殆どであった。前段に設置されたファイアウォールによってZabbixサーバが保護されているからfirewalldは不要であるというならまったく止めてしまってもよいからこうである。

$ sudo systemctl disable firewalld.service
$ sudo systemctl stop firewalld.service

一方でfirewalldを使用しているからおいそれと無効にはできない環境であれば、ひとまず下記の設定を投入することでZabbixフロントエンドへアクセスが可能になる模様である。

$ sudo firewall-cmd --zone=public --add-service=http --permanent
$ sudo firewall-cmd --zone=public --add-port=10051/tcp --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all

PHP環境のチェックやデータベースの設定などを経て遂にインストールが完了する。

初期状態ではAdminユーザが用意されており、パスワードは「zabbix」 でログインが可能である。事ここに至ってようやくzabbixのインストールは完了であるけれども、言語設定を日本語にするとさらなる問題に見舞われる。すなわちグラフの文字化けである。

これは容易に解決できて、zabbix-web-japaneseパッケージをインストールするだけでよろしい。

$ sudo dnf install zabbix-web-japanese

インストールが完了した時点で文字化けは解消されるからzabbix-serverの再起動などは不要であった。

Googleスプレッドシートのファイルを開いた際に特定のセルへ移動したい

Excelであればファイルを開いた際には最後に表示していた画面の状態で始まるからすぐに編集を始められるけれども、Googleスプレッドシートでは必ず画面左上からスタートするものだから、下へ下へと進展してゆくファイルであると先ずはデータの最下行まで移動せねばならない。

これは大変な手間であるからGoogle Apps Script(GAS)で以ってファイルを開いたら自動的に最下行のひとつ下の行まで移動するよう段取りした。先ずはGoogleスプレッドシートを開いて「ツール」→「スクリプトエディタ」を開く。

そうしたら以下のスクリプトを貼り付けて保存したら終いである。スクリプトの一連の段取りは、

  • B2セルを選択
  • データ最下行まで移動(Ctrl+↓)
  • 一行下を選択

という具合である。

function onOpen(e) {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('B2').activate();
  spreadsheet.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.DOWN).activate();
  spreadsheet.getActiveCell().offset(1, 0).activate();
};

これで無事、ファイルを開いた際にデータ最下行のひとつ下の行へ自動的に移動して呉れるようになり、僅かに楽ちんになった。

サーバ証明書の有効期限を調べるコマンド

opensslコマンドで以ってサーバ証明書の有効期限を詳らかにするならこういう具合である。

$ sudo su -c "openssl x509 -dates -noout </etc/letsencrypt/live/www7390uo.sakura.ne.jp/cert.pem" | grep After
notAfter=Nov  5 23:18:58 2020 GMT

出力結果から有効期限の残り日数を導こうとするならば、もうひと手間かけねばならないとおもって取り組んだ成果がこうである。

!/bin/bash -eu

CERTPATH='/etc/letsencrypt/live/backtick.dip.jp/cert.pem'
EXPIRATION=$(sudo su -c "openssl x509 -dates -noout <${CERTPATH}" | grep After | cut -d= -f2)
END=$(date +%s --date "${EXPIRATION}")
NOW=$(date +%s)

echo $(( ("${END}" - "${NOW}") / 86400 ))

込み入っていて大変煩雑であるから工夫を凝らす余地が残されていると思うけれども思うばかりで詮無きことである。Let’s Encryptの証明書に限ればcertbotコマンドで以って有効な日数のみを得ることができる。

$ sudo certbot certificates 2>/dev/null | grep VALID | awk '{print $6}'
40

参考:
How to find Certifications Expiry Date

bashを用いてSlackへメッセージを投稿する

という処理を実現するためにIncoming Webhooksという機能を使うようである。作業の大筋はこういう具合である。

  • Slackアプリを作成
  • Incoming Webhooksを有効にセット
  • ワークスペースへのアクセス許可を付与
  • 動作確認

Slackアプリを作成

まずナイスな緑のボタンをクリックすることでSlackアプリを作成するページへアクセスする。アプリに名を与え、活躍の場となるワークスペースを選択する。アプリ名はのちの変更が許されているから、命名に何時間もかける作業を先送りにできる。ワークスペースはあとから変更が効かないから勢い慎重にならざるを得ない。

Incoming Webhooksを有効にセット

アプリをこしらえるとBasic Informationのページへと遷移する。そうしたら「Add features and functionality」の中にある「Incoming Webhooks」をクリックする。ここにIncoming Webhooksを有効にするスイッチがあるから此れをクリックしてOnへと変更するのである。

ワークスペースへのアクセス許可を付与

Incoming Webhooksが有効にセットされるとページの下部にcurlのサンプルコマンドなどが現れる。此処で「Add New Webhook to Workspace」ボタンをクリックすると、アプリに対してワークスペースへのアクセス権限を許可する画面へと移るから投稿先のチャンネルを選択して「許可する」ボタンをクリックする。

此れによって遂に具体的なWebhook URLが誂えられる。Webhook URLは余所の人の悪用を避けるために内緒にせねばならない。あとはこのURLに対してJSON形式でメッセージをPOSTすることでSlackにメッセージを投げつけられるようになる。curlコマンドによるサンプルもこしらえてくれるから気軽に動作確認もおこなえる。

動作確認

サンプルのcurlコマンドを実行して、設定したワークスペースのチャンネルに対してメッセージが正常に投げかけられたら「ok」と表示される。スマートフォンにSlackを導入して良しなに設定を施してあれば通知もやってくる。

通知がやって来ないときはSlackの「おやすみモード」がオンになっていたりスマートフォンの省電力設定が妨害していることもあるから「通知のトラブルシューティング」を実施してみるのがよろしい。そうしてようやっと望んだ動作が手に入ったのである。

参考:
Sending messages using Incoming Webhooks

WordPressをインストールする際に現れる幾つかのエラーを対処する

OS: Red Hat Enterprise Linux Server release 7.8 (Maipo)
Apache 2.4.6 / mysql 8.0.19 / PHP 7.3.17
WordPress 5.4

WordPressについて次のような具合でインストールが容易であると喧伝されている。

WordPress is well-known for its ease of installation. Under most circumstances, installing WordPress is a very simple process and takes less than five minutes to complete.

だのに大急ぎで構築を仕上げねばならないときに限って次々とエラーに見舞われてちっとも5分以内じゃ成し遂げられないことが相次ぐものである。その上、少し間が空いてしまうと解決に導いたエラーの記憶がすっかりと抜け落ち再び同じ内容に悩まされて貴重な時間を浪費するからいい加減、文章として残しておこうというものである。

一番目に直面するのは「お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。」というエラーメッセージである。此れはphp-mysqlndパッケージが不足している為に発生するものであるからRemi’s RPM repositoryの辺りからサッとインストールして終いである。

$ sudo yum install --enablerepo=remi-php73 php-mysqlnd
$ sudo systemctl restart httpd.service

次に立ちはだかるのが「データベース接続確立エラー」というやつである。MySQL8系が導入されている環境であって、ユーザー名とパスワードに間違いがなくてホスト名も正しくMySQLが動作しているにもかかわらずこのエラーが出現するなら十中十一程度の割合でMySQLの認証プラグインが原因であるとおもう。

この当て推量を確かなものにするため wp-config-sample.php をコピーして wp-config.phpを拵え、WP_DEBUG の値を true に置き換えてDEBUGモードを有効にし、改めてインストールを試みてみるとこうである。

The server requested authentication method unknown to the client と云うのだからもうすっかり裏付けが保証されたものである。こうなればユーザの認証プラグインを mysql_native_password に変更すれば問題が解消される。

mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'p@ssw0rd';

最後は「wp-config.php ファイルに書き込みできません。」 というものでインストールディレクトリのパーミッションに特段の問題が無いのにこういった訴えを受けた場合はSELINUXを無効にセットすると解決する。

$ sudo vi /etc/sysconfig/selinux
#SELINUX=enforcing
SELINUX=disabled

$ sudo reboot

こうしてインストールはつつがなく完了するようになった。