Chefで既存手順のレシピを書く3(WEBサーバ)

こんにちは。プラットフォームの小宮です。
前回に引き続き既存手順のレシピ化をすすめていきます。あと3回くらいだと思われるので気長におつきあいください。

今回はWEBサーバのレシピになります。
特別なことは特にしていなくて普通のwebサーバだと思いますが、一応何してるか書いておきますと、
apache2.2+php5.3系で中間コードキャッシュにAPCを使っていてwordpressとそのsshプラグインつかっておりAWSのS3にmountしています。
s3mountに使うfuseが最新版からソースコードで入れる必要があり、バージョン固定のphpのパッケージが18個くらいとかありまして
一つ一つpackageリソース書くのが面倒だったこともありましてscriptつかいました。
scriptつかうときはnot_if忘れるとmakeとか何回も実行されて困るので注意が必要です。
あとcd書き忘れると展開場所が認識してるとこに出ないのでその後の手順でファイルが存在しないエラーがでました。

・httpdのレシピを書く
設定ファイルの準備をする
[shell]# mkdir -p /root/chef-repo/site-cookbooks/httpd/files/default/rpms
# tar cf /root/chef-repo/site-cookbooks/httpd/files/default/rpms/web-rpm.tar ./web-rpm/
# tar tf /root/chef-repo/site-cookbooks/httpd/files/default/rpms/web-rpm.tar ./web-rpm/
# cd /root/chef-repo/site-cookbooks/httpd/recipes
# mkdir -p /root/chef-repo/site-cookbooks/httpd/files/default/etc/httpd/{conf,conf.d}
# cp -p /opt/src/config/web/httpd.conf /root/chef-repo/site-cookbooks/httpd/files/default/etc/httpd/conf/
# vi /root/chef-repo/site-cookbooks/httpd/files/default/etc/httpd/conf/httpd.conf
# mkdir -p /root/chef-repo/site-cookbooks/httpd/files/default/etc/php.d
# cp -p /opt/src/config/php/php.ini /root/chef-repo/site-cookbooks/httpd/files/default/etc/
# cd /root/chef-repo/site-cookbooks/httpd/files/default/rpms
# wget http://rpms.famillecollet.com/enterprise/5/olds/x86_64/php-pecl-apc-3.1.13-3.el5.remi.x86_64.rpm
# cp -p /etc/php.d/apc.ini /root/chef-repo/site-cookbooks/httpd/files/default/etc/php.d/
# wget http://rpms.famillecollet.com/enterprise/5/remi/x86_64/php-pecl-ssh2-0.11.3-2.el5.remi.x86_64.rpm[/shell]

apacheのインストールと基本設定
[shell]# vi httpd-server.rb
cookbook_file "/tmp/web-rpm.tar" do
source "rpms/web-rpm.tar"
mode 0644
end

cookbook_file "/tmp/db-rpm.tar.gz" do
source "rpms/db-rpm.tar.gz"
mode 0644
end

filename = "web-rpm.tar"
script "install_httpd" do
not_if ‘rpm -qa|grep httpd’
interpreter "bash"
user "root"
code <<-EOL
cd /tmp
tar xzf /tmp/db-rpm.tar.gz
rpm -U db-rpm/5.5.27/{mysql-lib*,mysql-5*}
rpm -U db-rpm/mysqlclient*
tar xf /tmp/#{filename}
rpm -U web-rpm/httpd-2.2.3-65/httpd*
EOL
end

script "install_php" do
not_if ‘rpm -qa|grep php’
ignore_failure true
interpreter "bash"
user "root"
code <<-EOL
cd /tmp
rpm -i –quiet –force web-rpm/php5.3.17/{php-5.3*,php-cli*,php-common*,php-devel*,php-mbstring*,php-mbstring*,php-mysql*,php-pdo*,php-pear*}
rpm -i web-rpm/php5.3.17/lib*
EOL
end

cookbook_file "/tmp/php-pecl-apc-3.1.13-3.el5.remi.x86_64.rpm" do
source "rpms/php-pecl-apc-3.1.13-3.el5.remi.x86_64.rpm"
mode 0644
end

cookbook_file "/tmp/php-pecl-ssh2-0.11.0-1.el5.rf.x86_64.rpm" do
source "rpms/php-pecl-ssh2-0.11.0-1.el5.rf.x86_64.rpm"
mode 0644
end

package "php-pecl-apc" do
only_if "rpm -qa|grep php"
action :install
source "/tmp/php-pecl-apc-3.1.13-3.el5.remi.x86_64.rpm"
provider Chef::Provider::Package::Rpm
end

%W{libssh2 libssh2-devel}.each do |pkg|
package pkg do
action :install
end
end

package "php-pecl-ssh2" do
only_if "rpm -qa|grep php"
action :install
source "/tmp/php-pecl-ssh2-0.11.0-1.el5.rf.x86_64.rpm"
provider Chef::Provider::Package::Rpm
end

script "backup_apache_config" do
not_if ‘ls /etc/httpd/conf/httpd.conf.org’
interpreter "bash"
user "root"
code <<-EOL
cp -p /etc/httpd/conf/httpd.conf{,.org}
cp -p /etc/php.ini{,.org}
mv /etc/httpd/conf.d/proxy_ajp.conf{,.org}
mv /etc/httpd/conf.d/welcome.conf{,.org}
EOL
end

service "httpd" do
supports :status => true, :restart => true, :reload => :true
action [ :enable, :start ]
end

cookbook_file "/etc/httpd/conf/httpd.conf" do
source "etc/httpd/conf/httpd.conf"
owner "root"
group "root"
mode 0644
notifies :reload, ‘service[httpd]’
end

cookbook_file "/etc/php.ini" do
source "etc/php.ini"
owner "root"
group "root"
mode 0644
notifies :reload, ‘service[httpd]’
end

cookbook_file "/etc/php.d/apc.ini" do
source "etc/php.d/apc.ini"
owner "root"
group "root"
mode 0644
notifies :reload, ‘service[httpd]’
end[/shell]

使ってるリソースは、cookbook_fileとpackageとscriptとserviceとかぐらいかと思います。
各リソースの細かい意味については「入門Chef-Solo」が大変わかりやすかったです。
細かいつかい方についてはリソースのマニュアルをよく眺めるのがオススメです。
ぱっと見わかりにくそうなところを少しだけ解説しますと、

cookbook_fileリソースの中の以下の行は、該当ファイルが更新されたらhttpdサービスをリロードするように通知(notifies)するということです。
 notifies :reload, ‘service[httpd]’

serviceリソースの中の以下の行では、enableはckconfig onて意味ですね。startはもちろんサービスの起動です。
 action [ :enable, :start ]

scriptリソースの中のnot_ifは続くコマンドの結果が0以外の場合にスクリプトを実行するというifによる制限です。
たとえばrpm -qa|httpdで入ってなければパッケージいれたいときに使います。戻り値が0の場合に実行されるようにするにはonly_ifを使います。

script “install_php”のところで使っているignore_failure trueは、phpインストール時に出る警告のせいかインストールされなかったのでつけました。これでいいのかは謎です。

こんなところでしょうか。

ベーシック認証の設定
[shell]# cp -p /etc/httpd/conf.d/basic_auth.conf ../files/default/etc/httpd/conf.d/
# cp -p /etc/httpd/conf/.htpasswd ../files/default/etc/httpd/conf/

# vi basic_auth.rb
cookbook_file "/etc/httpd/conf/.htpasswd" do
source "etc/httpd/conf/.htpasswd"
mode 0644
end

cookbook_file "/etc/httpd/conf.d/basic_auth.conf" do
source "etc/httpd/conf.d/basic_auth.conf"
owner "root"
group "root"
mode 0644
notifies :reload, ‘service[httpd]’
end[/shell]

モジュール配置とs3mount(※)
[shell]# mkdir -p ../files/default/usr/local/src/ec2
# cp -p /opt/src/module.tar.gz ../files/default/usr/local/src/
# cp -p /usr/local/src/ec2/fuse-2.8.4.tar.gz ../files/default/usr/local/src/ec2/
# cp -p /usr/local/src/ec2/s3fs-1.68.tar.gz ../files/default/usr/local/src/ec2/
# cp -p /etc/passwd-s3fs ../files/default/etc/
# mkdir -p ../files/default/etc/init.d
# cp -p /etc/init.d/fuse ../files/default/etc/init.d/
# scp omb-web01:/etc/rc.local ../files/default/etc/

# pwd
/root/chef-repo/site-cookbooks/httpd/recipes
# vi wordpress.rb
cookbook_file "/tmp/module.tar.gz" do
source "usr/local/src/module.tar.gz"
mode 0644
end

filename = "module.tar.gz"
script "install_module" do
not_if ‘ls /var/www/html/wp-settings.php’
interpreter "bash"
user "root"
code <<-EOL
cd /var/www
mv html html.org
tar zxf /tmp/#{filename}
EOL
end

# vi s3mount.rb
cookbook_file "/tmp/fuse-2.8.4.tar.gz" do
source "usr/local/src/ec2/fuse-2.8.4.tar.gz"
mode 0644
end

filename = "fuse-2.8.4"
script "install_fuse" do
not_if ‘export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/lib64/pkgconfig/ && ldconfig && modprobe fuse && pkg-config –modversion fuse’
interpreter "bash"
user "root"
code <<-EOL
cd /usr/local/src
tar zxf /tmp/#{filename}.tar.gz
cd #{filename} && ./configure –prefix=/usr && make && make install
export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/lib64/pkgconfig/ && ldconfig && modprobe fuse
pkg-config –modversion fuse
EOL
end

cookbook_file "/tmp/s3fs-1.68.tar.gz" do
source "usr/local/src/ec2/s3fs-1.68.tar.gz"
mode 0644
end

filename = "s3fs-1.68"
script "install_s3fs" do
not_if ‘ls /usr/local/src/s3fs-1.68/config.log’
interpreter "bash"
user "root"
code <<-EOL
export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/lib64/pkgconfig/ && ldconfig && modprobe fuse
cd /usr/local/src
tar zxf /tmp/#{filename}.tar.gz
cd #{filename} && ./configure –prefix=/opt/s3fs && make && make install
EOL
end

cookbook_file "/etc/passwd-s3fs" do
source "etc/passwd-s3fs"
mode 0400
end

cookbook_file "/etc/init.d/fuse" do
source "etc/init.d/fuse"
mode 0755
end

service "fuse" do
supports :status => true, :restart => true
action [ :enable, :start ]
end

directory ‘/var/www/html/assets’ do
owner ‘apache’
group ‘apache’
mode 0777
action :create
end

filename = "/var/www/html/assets"
script "mount_s3fs" do
not_if ‘grep asset /etc/rc.local’
interpreter "bash"
user "root"
code <<-EOL
cp -rp /var/www/html/assets{,.bk} && rm -rf /var/www/html/assets/*
/opt/s3fs/bin/s3fs busaid /var/www/html/assets -o allow_other
cp -rp /var/www/html/assets.bk/* /var/www/html/assets/.
ln -sf /usr/share/pear/apc.php /var/www/html/apc.php
echo "/opt/s3fs/bin/s3fs busaid /var/www/html/assets -o allow_other" >> /etc/rc.local
EOL
end[/shell]
※s3mountのレシピは事情によりテストできておりません。

クックブックのシンタックステスト
[shell]# knife cookbook test base_setting
# knife cookbook test login_users
# knife cookbook test httpd[/shell]
FATAL:エラーがでなければOKと思われる(出るときはこのクックブックの何行目と具体的に出る)

今回はここまで。読んでいただいてありがとうございました。
次回はDBサーバのレシピです。

おすすめ記事