Chef-solo+knife-solo+Vagrantでサーバ構築を自動化してみる - その3 nginx
さて、今日は前回に引き続き nginxのインストール&設定をやってみたいと思います。
※環境は前回と同様です。
今回の流れ
- Berksfileをいじる
- jsonファイルに設定を書く
- サーバに適用してみる
- 自前のconfを用意する
- サーバに適用してみる
今日もシンプル。
Berksfileをいじる
さて、今日もberkshelf
を使います。
site :opscode cookbook 'sudo' cookbook 'nginx' # 追加
jsonファイルに設定を書く
今回はバージョン指定してソースからインストールしたかった為、以下のようにしました。
{ "users": [ { "name": "yagi", "group": "deploy"}, { "name": "deploy", "group": "deploy"} ], "authorization": { "sudo": { "groups": ["vagrant", "deploy"], "users": ["vagrant", "deploy", "yagi"], "passwordless": true, "sudoers_defaults": [ "env_reset", "mail_badpass", "secure_path=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"" ] } }, "nginx":{ "version": "1.4.1", "install_method": "source", "source": { "version": "1.4.1" }, "worker_processes": 2 }, "run_list":[ "recipe[users]", "recipe[sudo]", "recipe[nginx]" ] }
どんな感じで設定すると、どうなるのかはソースを読みました。
opscode-cookbooks/nginx Github
サーバに適用してみる
以上で、もうとりあえずnginxがインストールできるので、早速試してみます。
$ bundle exec knife solo cook chef-test
(たくさんログが出る)
では、確認してみましょう。
(本当はserverspec
でやりたいけど、それはまた次の機会にでも、、、)
$ ssh chef-test $ ps aux | grep nginx root 11121 0.0 0.0 168 4 ? Ss 12:39 0:00 runsv nginx root 11156 0.0 0.1 31004 2668 ? S 12:39 0:00 nginx: master process /opt/nginx-1.4.1/sbin/nginx -c /etc/nginx/nginx.conf www-data 11157 0.0 0.0 31428 1600 ? S 12:39 0:00 nginx: worker process www-data 11158 0.0 0.0 31428 1600 ? S 12:39 0:00 nginx: worker process vagrant 11322 0.0 0.0 8128 660 pts/0 S+ 12:40 0:00 grep --color=auto nginx
うん、ちゃんと起動してる。
※この時点では、http://192.168.33.10/
にアクセスしても404
けど、runsv
ってなんだろう、、、と思ってソース見てみました。
https://github.com/opscode-cookbooks/nginx/blob/master/recipes/source.rb#L107
この辺を見ると
"nginx" : { "init_style": "" }
とかしておけば、普通にetc/init.d/nginx start
になる気がして、やってみました。
結果、起動はするけど、init.d/nginx restart|stop|start
全部自分で手で叩いてもうんともすんとも言わない、
という事態に陥り、とりあえず諦めました。。。
(この辺、インフラ知識がなさすぎて、情けない、、、orz)
自前のconfを用意する
今回はberkshelfを使ったので、標準的なconfは勝手に作ってくれちゃいました。
ただ、普通、リバースプロキシの設定とか、自分で書きたいですよね。
サードパーティのcookbookを使ってる場合にどうやって、自前のテンプレートを使わせるのか、、、
うーむ。
自前のconf作るレシピを書く
まずはこの方法を試してみました。
ただ、この方法は大きな欠陥がありました。
この方法の場合、以下の順番でレシピが実行されます。
- サードパーティレシピのconf作成
- nginx再起動
- 自前のconfで上書き
- nginx再起動
つまり、2と3の間で、一瞬、意図しない設定でnginxが動いてしまうわけです。 これは困った。
テンプレートファイルだけ用意する
ソースを見ていると、どうもdefault-site.erb
というファイルがデフォルトで作成されるっぽい。
https://github.com/opscode-cookbooks/nginx/blob/master/recipes/commons_conf.rb#L30
ということは、同じパスになる場所に自前のテンプレート置いておいたら、イケるんじゃね?と思い、やってみました。
まずは自前nginx用cookbookを作成します。
$ bundle exec knife cookbook create nginx -o site-cookbooks
で、site-cookbooks/nginx/templates/default/default-site.erb
ファイルを作ります。
server { listen <%= node['nginx']['port'] %>; server_name _; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; rewrite_log on; location / { root /opt/nginx-1.4.1/html; index index.html index.htm; } }
ポート番号だけは指定できるようにしました。
サーバに適用してみる
ではこいつをいつものように実行してみましょう。
うん、、、うん?何も起こらない。設定も変わってない、、、ダメか。
いーや、諦めなーい!!
よくよく考えたら、さっきcookbook作った時、recipes/default.rb
が出来ているはずなので、こいつが空っぽだと何も起きなくて当然な気がしてきました。
と、いうわけで、削除して、もう一度実行!!
$ rm site-cookbooks/nginx/recipes/default.rb $ bundle exec knife solo cook chef-test (省略) * template[/etc/nginx/sites-available/default] action create - create new file /etc/nginx/sites-available/default - update content in file /etc/nginx/sites-available/default from none to 64746f --- /etc/nginx/sites-available/default 2013-08-27 13:25:07.666771661 +0000 +++ /tmp/chef-rendered-template20130827-6543-wapst2 2013-08-27 13:25:07.666771661 +0000 @@ -0,0 +1,16 @@ +server { + listen 80; + server_name _; + + # hogehoge + + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; + rewrite_log on; + + location / { + root /opt/nginx-1.4.1/html; + index index.html index.htm; + } + +} - change mode from '' to '0644' - change owner from '' to 'root' - change group from '' to 'root' (省略)
お、できてるっぽい。
http://192.168.33.10/
ここにアクセスしてみたら
こんな感じに表示されたので、OK!
ということは、cookbookに優先順位があるのか。
site-cookbook -> cookbook
という順序で探索するのだろうか?
http://wiki.opscode.com/display/~tily/Chef+Solo
「複数のクックブック・ディレクトリ」に書いてありました。
指定するクックブックの順番に意味があることに気をつけてください 、また順番のルールは Chef 0.8 で変更されました。先に定義したクックブックは後で定義したクックブックによって上書きされるようになっています。
なるほど。
今回の場合だと.chef/knife.rb
これの事になるんだと思う。
cookbook_path ["cookbooks", "site-cookbooks"] # ここ! node_path "nodes" role_path "roles" data_bag_path "data_bags" #encrypted_data_bag_secret "data_bag_key" knife[:berkshelf_path] = "cookbooks"
たしかにsite-cookbook
が後に書いてある。
なるほどなるほど。
まとめ
今回は複数クックブック・ディレクトリを使った場合の優先順位が決め手でした。 次回はRedisをインストールしてみたいと思います。