初めてのシステムと日記

システムも日記も初めてです。

ChefでApahceとPHPをソースインストールするレシピを書いてみた

■さくらVPSにChefをインストール - 初めてのシステムと日記
http://bosssato.hatenablog.com/entry/2013/06/23/135552

前回の記事でさくらVPSにChefをインストールしました。
今回はChefを使ってApachePHPをソースインストールするレシピを書いて実際にインストールしてみます。
(package使えば入るっぽいですが、たぶんyumインストールな気が。。)

今回の内容は私のGitHubに公開しているので、そちらを参考にして頂ければです。 (というのを前から言ってみたかった。)
https://github.com/bossato/chef

 

リポジトリ作成

まずは今回のレシピを格納するリポジトリを作成します。

// chefというリポジトリを作成
$ knife solo init chef

 

クックブック作成

次にApachePHPそれぞれのクックブックを作成します。

$ cd chef

// Apacheのクックブックを作成
$ knife cookbook create apache -o site-cookbooks

// PHPのクックブックを作成
$ knife cookbook create php -o site-cookbooks

-oはクックブックを作成する先を指定します。
リポジトリを作成すると、cookbookssite-cookbooksの2つのクックブックディレクトリが作成されます。
どうやらこれの使い分けは以下のようです。

  • cookbooks : opscodeやGitHubのcookbookなどを格納する
  • site-cookbooks : 独自のcookbookを格納する

基本的に自分で作成するクックブックはsite-cookbooks
本家opscodeや他の方のクックブックはcookbooksに格納するのが一般的なようです。

 

クックブック、レシピの方針

ここから本格的にApachePHPのレシピを書いてきますが、方針は以下の通りとします。

  • ソースファイルはfilesに格納
  • 設定ファイルはtemplatesに格納
  • 設定ファイル、レシピ内の値はattributesで管理
  • レシピは上記を利用して書く
  • バージョンアップがあった場合
  • filestemplatesに必要に応じてファイル設置
  • attributesの値を変更
  • レシピは基本いじらない

バージョンアップがある度にレシピを書き換えるのはそれなりのコストなため、
filestemplatesattributesを上手く使って簡単にバージョンアップ出来るようにしていきます。

※この辺が分からない方は前回の記事の「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_filefilesに格納したファイルを設置するためのリソースです。
この場合は/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を実行します。
:immediatelyapache 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の変更、filestemplatesへのファイル設置で、
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

入門Chef Solo - Infrastructure as Code

Chefの入門書として有名ですね、私は基本的な流れはこれを見て学びました。

 

■Resources and Providers Reference - Chef

http://docs.opscode.com/chef/resources.html
公式のドキュメントになります。
国内でも解説ブログが増えたとは言え、情報量がやはり乏しいので公式を見た方が早かったりします。

 

■opscode-cookbooks (Opscode Public Cookbooks)

https://github.com/opscode-cookbooks
これまた公式のクックブック集になります。
attributesfilesなどの使い方、レシピの書き方は非常に参考になります。

 

今回はApachePHPをChefを使ってインストールするレシピを書きました。
このような感じでサーバの初期設定をChefで管理し、運用時の管理もChefを使ってやるようにすれば、
Chefを見るだけでサーバの状態が分かるようになります。

また、何よりもChefは書いていて楽しいというのが一番感じる所です。
インフラ対応はたいていのエンジニアは毛嫌いするものですが、
プログラム(しかも今流行のRuby)を書きながらサーバ管理出来るのは楽しいですよ。