一人Web開発~第13夜 Zabbix導入
前回、「次はインフラのITを」と言っていたのですが、気が変わった(というか、パパッとできるインフラITのネタが思い浮かばなかった)ので、次の工程であるZabbixの導入に進みたいと思います。
今回初めて触ったので、ちょっと変なところではまりました。
Zabbixインストールの前準備
Zabbixは監視をするためのソフトウェアなのですが、どうやら一般的にはWebのUIを使用するようで、そのためにはPHPが動作するWebサーバが必要なようです。さらに、データの永続化先としてRDBMSも必要なようです。
今回はすでに導入済みのApacheとMariaDBを使用することにしました。
まずは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は関係なくて、
という理由です。以前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
これで、ApacheとMariaDBとZabbixサーバを起動してWeb UIにアクセスすれば利用できるようになります。
一応、serverspecのテストも追加していますが、そちらはGithubを参照ください。
nobrooklyn/oneman · GitHub
次はバックアップをどうするか考えます。
そもそも要求の整理からちゃんとしないとダメだろうな。