成らぬは人の為さぬなりけり

エンジニアライフをエンジョイする為のブログ

Chef-solo+knife-solo+Vagrantでサーバ構築を自動化してみる - その3 nginx

さて、今日は前回に引き続き nginxのインストール&設定をやってみたいと思います。

※環境は前回と同様です。

今回の流れ

  1. Berksfileをいじる
  2. jsonファイルに設定を書く
  3. サーバに適用してみる
  4. 自前のconfを用意する
  5. サーバに適用してみる

今日もシンプル。

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作るレシピを書く

まずはこの方法を試してみました。

ただ、この方法は大きな欠陥がありました。

この方法の場合、以下の順番でレシピが実行されます。

  1. サードパーティレシピのconf作成
  2. nginx再起動
  3. 自前のconfで上書き
  4. 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/ここにアクセスしてみたら Alt text

こんな感じに表示されたので、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をインストールしてみたいと思います。