ウェブサーバーnginxをChefで入れてみました。

cookbookを用意する

knifeでcookbookを生成します。自分で管理するcookbookはsite_cookbooksに置くのが慣例のようです。

1$ cd chef-repo
2$ knife cookbook create nginx -o site_cookbooks

インストールや起動、設定ファイルについてレシピに追記します。説明はコード内のコメントで。

 1# パッケージ管理ツールを使ってnginxをインストールします。
 2package "nginx" do
 3  action :install
 4end
 5
 6service "nginx" do
 7  # nginx がサポートしている機能を教えてあげます。
 8  # restartとかできるよーという意味らしい。
 9  supports status: true, restart: true, reload: true
10
11  # サーバーを有効にした上で、スタートします。
12  # 有効にしておけばマシン再起動時にも勝手にサーバーが起動します。
13  action [:enable, :start]
14end
15
16# ./site_cookbooks/templates/default/nginx.conf.erbを元にして
17# nginxの設定ファイルを決まったところに置くよという指示
18# Chefの規約にのおかげで置き場所のパスやテンプレートファイルは省略できている
19template "nginx.conf" do
20  # ownerとgroupはrootユーザーでパーミッションは644
21  owner "root"
22  group "root"
23  mode 0644
24
25  # この動作のあとでnginxを再起動してねという指示
26  notifies :reload, "service[nginx]"
27end

また、設定ファイルの元となるテンプレートはこちらで用意してあげないといけません。内容は入門Chef Soloを参考にしています。

 1user nginx;
 2worker_process 1;
 3error_log /var/log/nginx/error.log;
 4pid /var/run/nginx.pid;
 5
 6events {
 7	worker_connections 1024;
 8}
 9
10http {
11	include /etc/nginx/mim.types;
12	default_type application/octet-stream;
13
14	server {
15		listen <%= node["nginx"]["port"] %>
16		server_name centos-one;
17		location / {
18			root /usr/share/nginx/html;
19			index index.html index.htm;
20		}
21	}
22}

設定ファイル内部に一箇所だけ変数のようなものがあります。確かChefではAttributeというはず、、、

これはjsonファイルで設定してあげないといけません。

1{
2    "nginx": {
3        "port":80
4    },
5    "run_list":[
6        "iptables",
7        "nginx",
8    ]
9}

このファイルのjsonがハッシュとなってerbファイルで使うことができるようですね。なので上のように書いておけば、さきほどの設定ファイルテンプレートでnode[“nginx”][“port”]のようにして使うことができる、というわけ。今回はポートを80番にしています。

そのぐらいならAttributeを使うまでもないですが、IPやホスト名を環境によってに変更したいときなどに使えそうです。

Chefを実行

1$ cd chef-repo
2$ knife solo cook vagrant@192.168.33.10

ところが失敗するはずです。これはcookbookに問題があったわけではなく、CentOSで使われているパッケージ管理yumのリポジトリの設定不足が原因です。nginxは初期設定に入っているリポジトリには含まれないです。

yumの設定

yumのリポジトリを追加するのもChefを使ってやります。手動設定はダメです。yumのcookbookはOPSCODEのものを使うことにします。

1$ cd chef-repo
2$ knife cookbook site vendor yum

これによりいくつかのレシピが導入されます。あとはjsonファイルを次のように変更して…

 1{
 2    "nginx": {
 3        "post":80
 4    },
 5    "run_list":[
 6        "yum::epel", // ←追加
 7        "iptables",
 8        "nginx",
 9    ]
10}

さきほどと同じようにChefを流してみるとnginxのインストールが無事完了すると思います。

nginxの動作確認

動作確認のためホストOS側のブラウザでアクセスしてみましょう。http://192.168.33.10/ にアクセスしてnginxのデモページが表示されていれば完了です。