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/uploads/* /opt/s3fs/bin/s3fs busaid /var/www/html/assets -o allow_other cp -rp /var/www/html/assets.bk/* /var/www/html/uploads/. 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サーバのレシピです。