ウェブサーバーnginxをChefで入れてみました。
cookbookを用意する
knifeでcookbookを生成します。自分で管理するcookbookはsite_cookbooksに置くのが慣例のようです。
$ cd chef-repo
$ knife cookbook create nginx -o site_cookbooks
インストールや起動、設定ファイルについてレシピに追記します。説明はコード内のコメントで。
# パッケージ管理ツールを使ってnginxをインストールします。
package "nginx" do
action :install
end
service "nginx" do
# nginx がサポートしている機能を教えてあげます。
# restartとかできるよーという意味らしい。
supports status: true, restart: true, reload: true
# サーバーを有効にした上で、スタートします。
# 有効にしておけばマシン再起動時にも勝手にサーバーが起動します。
action [:enable, :start]
end
# ./site_cookbooks/templates/default/nginx.conf.erbを元にして
# nginxの設定ファイルを決まったところに置くよという指示
# Chefの規約にのおかげで置き場所のパスやテンプレートファイルは省略できている
template "nginx.conf" do
# ownerとgroupはrootユーザーでパーミッションは644
owner "root"
group "root"
mode 0644
# この動作のあとでnginxを再起動してねという指示
notifies :reload, "service[nginx]"
end
また、設定ファイルの元となるテンプレートはこちらで用意してあげないといけません。内容は入門Chef Soloを参考にしています。
user nginx;
worker_process 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mim.types;
default_type application/octet-stream;
server {
listen <%= node["nginx"]["port"] %>
server_name centos-one;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
設定ファイル内部に一箇所だけ変数のようなものがあります。確かChefではAttributeというはず、、、
これはjsonファイルで設定してあげないといけません。
{
"nginx": {
"port":80
},
"run_list":[
"iptables",
"nginx",
]
}
このファイルのjsonがハッシュとなってerbファイルで使うことができるようですね。なので上のように書いておけば、さきほどの設定ファイルテンプレートでnode[“nginx”][“port”]のようにして使うことができる、というわけ。今回はポートを80番にしています。
そのぐらいならAttributeを使うまでもないですが、IPやホスト名を環境によってに変更したいときなどに使えそうです。
Chefを実行
$ cd chef-repo
$ knife solo cook vagrant@192.168.33.10
ところが失敗するはずです。これはcookbookに問題があったわけではなく、CentOSで使われているパッケージ管理yumのリポジトリの設定不足が原因です。nginxは初期設定に入っているリポジトリには含まれないです。
yumの設定
yumのリポジトリを追加するのもChefを使ってやります。手動設定はダメです。yumのcookbookはOPSCODEのものを使うことにします。
$ cd chef-repo
$ knife cookbook site vendor yum
これによりいくつかのレシピが導入されます。あとはjsonファイルを次のように変更して…
{
"nginx": {
"post":80
},
"run_list":[
"yum::epel", // ←追加
"iptables",
"nginx",
]
}
さきほどと同じようにChefを流してみるとnginxのインストールが無事完了すると思います。
nginxの動作確認
動作確認のためホストOS側のブラウザでアクセスしてみましょう。http://192.168.33.10/ にアクセスしてnginxのデモページが表示されていれば完了です。