PIYO - Tech & Life -

Chefでnginxを導入してみる

ウェブサーバー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のデモページが表示されていれば完了です。