hatenob

プログラムって分からないことだらけ

一人Web開発~第13夜 Zabbix導入

前回、「次はインフラのITを」と言っていたのですが、気が変わった(というか、パパッとできるインフラITのネタが思い浮かばなかった)ので、次の工程であるZabbixの導入に進みたいと思います。
今回初めて触ったので、ちょっと変なところではまりました。

Zabbixインストールの前準備

Zabbixは監視をするためのソフトウェアなのですが、どうやら一般的にはWebのUIを使用するようで、そのためにはPHPが動作するWebサーバが必要なようです。さらに、データの永続化先としてRDBMSも必要なようです。
今回はすでに導入済みのApacheMariaDBを使用することにしました。

まずはZabbixの公式yumリポジトリを登録します。
これまた、公式で公開されているRPMをインストールすることでリポジトリを登録します。
登録したら、Zabbixのサーバとエージェント、Web UIをインストールします。

# Install yum repository

remote_file node[:zabbix][:file] do
  source node[:zabbix][:url]
  action :create_if_missing
end

rpm_package "zabbix-release" do
  source node[:zabbix][:file]
  action :install
end

# Install Zabbix

["zabbix-server", "zabbix-server-mysql", "zabbix-web-mysql", "zabbix-web-japanese", \
 "zabbix-agent", "zabbix-get" ].each do |pkg|
  yum_package pkg do
    action :install
  end
end

service "zabbix-server" do
  action [:stop, :disable]
end

ここまでは別に大したことではありません。
次にPHPをインストールします。
CentOSのパッケージ版を使います。

# Install PHP for Web UI

["php", "php-devel", "php-gd", "php-bcmath", "php-common", "php-xml", \
 "php-mbstring", "php-mysql" ].each do |pkg|
  package pkg do
    action :install
  end
end

# Setup php

template "/etc/php.ini" do
  source "php.ini.erb"
end

PHPをインストールしたら、Apacheにモジュールを追加したうえでZabbixのWeb UIを登録します。
ここでどはまりしました。
はまった理由はZabbixは関係なくて、

  • パッケージ版のPHPApacheのpreforkでないとすんなり動かない。

という理由です。以前Apacheを導入した時には、マルチスレッド版であるworkerで動作するように設定しました。ところがパッケージ版のPHPはマルチプロセス版であるpreforkで動く版でコンパイルされているようで、workerで動かそうと思ったらPHPモジュールを含めた再コンパイルか、FastCGI等を使った構成にする必要があるようでした。
そうとは知らず「あれ~?」とはまっておりました。
結局、Apacheのモジュール自体はそのまま使い、設定ファイルを別に用意して、httpdコマンドを直接たたいて実行することにしました。

# Setup httpd

template "/etc/httpd/conf/httpd-zabbix.conf" do
  source "httpd-zabbix.conf.erb"
  mode 00644
  variables({
    :listen => node[:httpd][:listen],
    :server_name => node[:httpd][:server_name],
  })
end

bash "configtest" do
  user "root"
  code <<-EOH
    httpd -f /etc/httpd/conf/httpd-zabbix.conf -t
  EOH
end

directory "/etc/zabbix/web" do
  mode 00755
  owner "zabbix"
  group "zabbix"
end

あとはスキーマの作成と初期データの投入。これをChefでやるにはどうするのがいいのかなぁと試行錯誤。bashとかexecuteとかでコマンドラインベースの実行でもいいのですが、「スキーマが作られていなかったら実行」とかの判定が面倒そうなので、シェルを書いてそれをたたくことにしました。

# Init

template "/tmp/zabbix-init.sh" do
  source "zabbix-init.sh.erb"
  mode 00700
  variables({
    :zabbix_db => node[:zabbix][:db],
    :zabbix_user => node[:zabbix][:user],
    :zabbix_passwd => node[:zabbix][:passwd]
  })
end

bash "zabbix-init" do
  user "root"
  code <<-EOH
    /tmp/zabbix-init.sh
  EOH
end

シェル本体はこんな感じにしてあります。
判定は色々悩んだあげく、古式ゆかしい「フラグファイル」方式にしました。
判定が難しいからとシェルにしたけれど、結局ゴテゴテの判定を組み込むのが面倒になったということで、それならChefから直接実行でもええんちゃうのかというのは気づかなかったことにします。

#!/bin/bash

INITFLAG=/etc/zabbix/.initialized
if [ -f $INITFLAG ];then
  echo "zabbix already initialized."
  echo "if you want initialized, plese delete file $INITFLAG"
  exit 0
fi

function f_CHECK_RC {
  local RC=$1
  local MSG=$2

  if [ $RC -eq 0 ];then
    echo "$MSG successed"
  else
    echo "$MSG failed"
    exit 1
  fi
}

# Create database
mysql -uroot <<EOF
create database zabbix character set utf8;
grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
flush privileges;
EOF
f_CHECK_RC $? "create zabbix database"

SQLDIR=/usr/share/doc/zabbix-server-mysql-2.2.2/create

# Create shcema
mysql -uzabbix -pzabbix zabbix < $SQLDIR/schema.sql
f_CHECK_RC $? "create zabbix schemas"

# Create images
mysql -uzabbix -pzabbix zabbix < $SQLDIR/images.sql
f_CHECK_RC $? "create zabbix images"

mysql -uzabbix -pzabbix zabbix < $SQLDIR/data.sql
f_CHECK_RC $? "create zabbix data"

touch $INITFLAG

最後はZabbix本体の設定ファイル。

template "/etc/zabbix/zabbix_server.conf" do
  source "zabbix_server.conf.erb"
  mode 00644
  variables({
    :zabbix_db => node[:zabbix][:db],
    :zabbix_user => node[:zabbix][:user],
    :zabbix_passwd => node[:zabbix][:passwd]
  })
end

これで、ApacheMariaDBとZabbixサーバを起動してWeb UIにアクセスすれば利用できるようになります。

一応、serverspecのテストも追加していますが、そちらはGithubを参照ください。
nobrooklyn/oneman · GitHub

次はバックアップをどうするか考えます。
そもそも要求の整理からちゃんとしないとダメだろうな。