ChefでApahceとPHPをソースインストールするレシピを書いてみた
■さくらVPSにChefをインストール - 初めてのシステムと日記
http://bosssato.hatenablog.com/entry/2013/06/23/135552
前回の記事でさくらVPSにChefをインストールしました。
今回はChefを使ってApache、PHPをソースインストールするレシピを書いて実際にインストールしてみます。
(package使えば入るっぽいですが、たぶんyumインストールな気が。。)
今回の内容は私のGitHubに公開しているので、そちらを参考にして頂ければです。 (というのを前から言ってみたかった。)
https://github.com/bossato/chef
リポジトリ作成
まずは今回のレシピを格納するリポジトリを作成します。
// chefというリポジトリを作成 $ knife solo init chef
クックブック作成
次にApache、PHPそれぞれのクックブックを作成します。
$ cd chef // Apacheのクックブックを作成 $ knife cookbook create apache -o site-cookbooks // PHPのクックブックを作成 $ knife cookbook create php -o site-cookbooks
-o
はクックブックを作成する先を指定します。
リポジトリを作成すると、cookbooks
とsite-cookbooks
の2つのクックブックディレクトリが作成されます。
どうやらこれの使い分けは以下のようです。
- cookbooks : opscodeやGitHubのcookbookなどを格納する
- site-cookbooks : 独自のcookbookを格納する
基本的に自分で作成するクックブックはsite-cookbooks
、
本家opscodeや他の方のクックブックはcookbooks
に格納するのが一般的なようです。
クックブック、レシピの方針
ここから本格的にApache、PHPのレシピを書いてきますが、方針は以下の通りとします。
- ソースファイルは
files
に格納 - 設定ファイルは
templates
に格納 - 設定ファイル、レシピ内の値は
attributes
で管理 - レシピは上記を利用して書く
- バージョンアップがあった場合
files
、templates
に必要に応じてファイル設置attributes
の値を変更- レシピは基本いじらない
バージョンアップがある度にレシピを書き換えるのはそれなりのコストなため、
files
、templates
、attributes
を上手く使って簡単にバージョンアップ出来るようにしていきます。
※この辺が分からない方は前回の記事の「knifeでクックブックを作成する」を参照して下さい。
http://bosssato.hatenablog.com/entry/2013/06/23/135552
Apacheのレシピを書く
まずはインストールするためのソースファイルをfiles
に格納します。
$ cd site-cookbooks/apache/ $ wget http://archive.apache.org/dist/httpd/httpd-2.2.24.tar.gz -P files/default/
次に設定ファイルをtemplates
に格納します、とりあえずはhttpd.conf
のみ格納します。
私はインストール済みのApacheの設定ファイルがあったのでそれを使いましたが、
もし手元になければソースファイルを解凍してコピーすれば(たぶん)大丈夫です。
$ cp /usr/local/src/httpd-2.2.24/docs/conf/httpd.conf templates/default/httpd.conf.erb
この設定ファイルの値を動的にするため、attributes
を設定します。
ここは書くのが大変なので、実際のファイルを参照して下さい。
https://github.com/bossato/chef/blob/master/site-cookbooks/apache/attributes/default.rb
設定ファイルでよく変更する項目の値は、↑みたいな感じで配列に格納しました。
そしてこの配列をアサイン出来るようにtemplates/default/httpd.conf.erb
も編集します。
これも書くのが大変なので、実際のファイルを見て頂ければ。。
https://github.com/bossato/chef/blob/master/site-cookbooks/apache/templates/default/httpd.conf.erb
例えば以下のような形式で書きます。
ServerRoot "<%= node['apache']['dir'] %>"
そうするとattributes/default.rb
で書いた以下が展開されます。
default['apache']['dir'] = "/usr/local/apache2/"
下準備が完了したのでレシピを書いていきます。ここは上から解説していきます。
https://github.com/bossato/chef/blob/master/site-cookbooks/apache/recipes/default.rb
cookbook_file "#{node['apache']['src_dir']}#{node['apache']['version']}.tar.gz" do mode 0644 end
http://docs.opscode.com/resource_cookbook_file.html
cookbook_file
はfiles
に格納したファイルを設置するためのリソースです。
この場合は/usr/local/src/httpd-2.2.24.tar.gz
に設置されます。
ファイル名を揃えておく必要があります。
bash "install apache" do user node['apache']['install_user'] cwd node['apache']['src_dir'] not_if "ls #{node['apache']['dir']}" notifies :run, 'bash[start apache]', :immediately code <<-EOH tar xzf #{node['apache']['version']}.tar.gz cd #{node['apache']['version']} ./configure #{node['apache']['configure']} make make install EOH end
http://docs.opscode.com/resource_bash.html
bash
はコマンド実行するためのリソースです。
ここではinstall apache
という名前をつけてインストールコマンドを実行してます。
Chefはインストール済みのものがあったらよしなにアップデート、もしくはスルーしてくれますが、
ソースから入れた場合はさすがによしなに対応してくれないようです。
そのため、Apacheが入っているかどうかを確認するためのコマンドを指定する必要があります。
not_if "ls #{node['apache']['dir']}"
not_if
はもし指定したコマンドが返ってくればbash
を実行しないという項目です。
ここではApacheのディレクトリがあればbash
を実行しないように指定しています。
notifies :run, 'bash[start apache]', :immediately
ここではapache install
実行後、後述するstart apache
を実行します。
:immediately
はapache install
実行後に起動する事を指定しています。
bash "start apache" do action :nothing flags '-ex' user node['apache']['install_user'] code <<-EOH #{node['apache']['dir']}bin/apachectl start EOH end
ここではApacheの起動をするbash
を書いています。
action :nothing
これはChef実行時に起動しないようにしています。
基本的にこれ単体では実行せず、他から呼び出される関数のようなイメージです。
先ほどのinstall apache
がまさにそういうイメージです。
レシピが書き終わったので、JSONに追加してChefを実行します。
$ cat nodes/localhost.json { "run_list": [ "recipe[apache]" ] } $ chef-solo -c solo.rb -j ./nodes/localhost.json
https://gist.github.com/bossato/6148793
↑みたいなログが出力されれば成功です。
念のため起動されているかも確認します。
$ ps awux | grep httpd | grep root root 10584 0.1 0.3 64668 3700 ? Ss 11:09 0:00 /usr/local/apache2//bin/httpd -k start root 10641 0.0 0.0 6380 648 pts/3 S+ 11:13 0:00 grep httpd
ちゃんと起動されている事が確認出来ました。
(微妙に/が余計に入ってるのでレシピ修正しておきます。。)
以降、もし何か設定ファイルの更新、バージョンアップ等あれば、
attributes
の変更、files
、templates
へのファイル設置で、
Chefがファイルの更新を確認して(おそらく)よしなに実行してくれます。
PHPのレシピを書く
PHPも同様の方針で書いています。解説するのが面倒くさくなってきたので
詳しくはGitHubを見てもらえれば、Apacheのレシピを理解していれば分かるかと思います。
https://github.com/bossato/chef/tree/master/site-cookbooks/php
Chefで参考にすべき書籍、サイト
Chefはちょっと前から注目され、最近はブログ等でも解説されるようになってきました。
私がChefで参考にした書籍やサイトは以下が主です。
■入門Chef Solo - Infrastructure as Code 伊藤直也
入門Chef Solo - Infrastructure as Code
- 作者: 伊藤直也
- 出版社/メーカー: 伊藤直也
- 発売日: 2013/03/11
- メディア: Kindle版
- 購入: 16人 クリック: 1,027回
- この商品を含むブログ (12件) を見る
Chefの入門書として有名ですね、私は基本的な流れはこれを見て学びました。
■Resources and Providers Reference - Chef
http://docs.opscode.com/chef/resources.html
公式のドキュメントになります。
国内でも解説ブログが増えたとは言え、情報量がやはり乏しいので公式を見た方が早かったりします。
■opscode-cookbooks (Opscode Public Cookbooks)
https://github.com/opscode-cookbooks
これまた公式のクックブック集になります。
attributes
、files
などの使い方、レシピの書き方は非常に参考になります。
今回はApacheとPHPをChefを使ってインストールするレシピを書きました。
このような感じでサーバの初期設定をChefで管理し、運用時の管理もChefを使ってやるようにすれば、
Chefを見るだけでサーバの状態が分かるようになります。
また、何よりもChefは書いていて楽しいというのが一番感じる所です。
インフラ対応はたいていのエンジニアは毛嫌いするものですが、
プログラム(しかも今流行のRuby)を書きながらサーバ管理出来るのは楽しいですよ。