入門 ChefSolo 自分メモ (5)

6 章の流れをおさらいのあたり。手順的には以下なのかどうか。

  • 最初
    • vagrant up で node を用意
    • knife solo init で初期リポジトリを用意
    • knife solo prepare で新規作成な node の chef てき初期化
    • cookbook を作ってよしなに編集
    • chef solo 実行
  • 以降
    • レシピを育てつつ

むむ、とりあえず最初のソレを確認というかアレした方が良いですね。手順として

  • 一つ目の仮想リソース Launch
    • パケジ導入なソレを試験してみる
  • 仮想リソース初期化して二つめを Launch
    • nginx 追加して両方実行

というカンジになるのか。ちょっとヤッてみましょうね。

vagrant でアレしたら chef-solo はデフォで導入されてるのか。とりあえず

# vagrant halt
[default] Attempting graceful shutdown of VM...
# vagrant destroy
Are you sure you want to destroy the 'default' VM? [y/N] y 
[default] Destroying VM and associated drives... 

して vatrant up してます。とりあえず knife solo init してみます。あ、その前に knife solo prepare ですね。

# knife solo prepare vagrant@192.168.33.10
WARNING: No knife configuration file found
Bootstrapping Chef...
Enter the password for vagrant@192.168.33.10:
(以下略

つうか以下な出力がアレ

ERROR: Errno::ENOENT: No such file or directory - nodes/192.168.33.10.json

で knife solo init か。

# knife solo init chef-repo
WARNING: No knife configuration file found
Creating kitchen...
Creating cupboards...

nodes がこの中にある、ってことは順番逆な気がするな。もっかい prepare してみるか。

# knife solo prepare vagrant@192.168.33.10
(中略

つうか再度 Chef 導入している件。で、こんどは ERROR は出ませんでしたね。

Thank you for installing Chef!
Generating node config 'nodes/192.168.33.10.json'...

成程。順番てきには init してから prepare なのか。

パケジを導入してみましょう

$ cd chef-repo
$ knife cookbook create hello -o site-cookbooks

で良いのかな。

WARNING: No knife configuration file found
** Creating cookbook hello
** Creating README for cookbook: hello
** Creating CHANGELOG for cookbook: hello
** Creating metadata for cookbook: hello
# ls site-cookbooks/
hello

で、site-cookbooks/hello/recipes/default.rb に以下を追加してみる。

log "Hello, Chef!"

で、これをリモホに適用するのは以下なのか。

knife solo cook <host>

あら、違うな。nodes/hoge.json がアレ。以下にして、なのか。

{"run_list":["recipe[hello]"]}

で、実行。

# knife solo cook vagrant@192.168.33.10
WARNING: No knife configuration file found
Running Chef on 192.168.33.10...
Checking Chef version...
Enter the password for vagrant@192.168.33.10:
Syncing kitchen...
vagrant@192.168.33.10's password:
Adding patches...
vagrant@192.168.33.10's password:
vagrant@192.168.33.10's password:
Syncing solo config...
vagrant@192.168.33.10's password:
Running Chef...
Starting Chef Client, version 11.4.0
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[Hello, Chef!] action write

Chef Client finished, 1 resources updated

うーん、この回数は微妙だなぁ。つうかパスワード認証はあり得んな。

nginx なソレも盛り込んでみる

まず cookbook 作成。

$ cd chef-repo
$ knife cookbook create nginx -o site-cookbooks
** Creating cookbook nginx
** Creating README for cookbook: nginx
** Creating CHANGELOG for cookbook: nginx
** Creating metadata for cookbook: nginx

で、recipe 追加。

package "nginx" do
    action :install
end

service "nginx" do
    supports :status => true, :restart => true, :reload => true
    action [ :enable, :start ]
end

template "nginx.conf" do
    path "/etc/nginx/nginx.conf"
    source "nginx.conf.erb"
    owner "root"
    group "root"
    mode 0644
    notifies :reload , 'service[nginx]'
end

テンプレは sites-cookbooks/nginx/templates/default/nginx.conf.erb に。

user nginx;
worker_processes 1;
error_log        /var/log/nginx/error.log;
pid              /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream ;
    server {
        listen <%= node['nginx']['port'] %>;
        server_name localhost ;
        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
        }
    }
}

で、nodes/192.168.33.10.json を以下にするのか。

{"nginx":{"port" : 80}},
{"run_list":["nginx"]}

で、knife-solo 実行。

$ knife solo cook vagrant@192.168.33.10

パスワード五回入力の後に json がアレでオチた。以下なのか。

                {"nginx":{"port" : 80}}, "run_list":["nginx"]}

あら、駄目だ。あ、括弧がまだ多いな。

                {"nginx":{"port" : 80}, "run_list":["nginx"]}

これ、テスト用とは言え、いちいち入力するのアレですね。てか鍵認証の場合、どうなるのか確認してみたいな。あら、今度はテンプレートが駄目らしい。
実機上ではサービス動いてるけど出力が以下。

---- Begin output of /etc/init.d/nginx reload ----
STDOUT: Reloading nginx configuration:
STDERR: nginx: [emerg] getpwnam("nginx") failed in /etc/nginx/nginx.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed
---- End output of /etc/init.d/nginx reload ----
Ran /etc/init.d/nginx reload returned 1
ERROR: RuntimeError: chef-solo failed. See output above.

あ、でびあん系だから user は www-data なのか。
修正してリトライしたらどうなるのかな。

Recipe: nginx::default
  * package[nginx] action install (up to date)
  * service[nginx] action enable (up to date)
  * service[nginx] action start (up to date)
  * template[nginx.conf] action create
    - update template[nginx.conf] from d9bd27 to cad1b0
        --- /etc/nginx/nginx.conf       2013-03-25 23:17:49.042205354 +0000
        +++ /tmp/chef-rendered-template20130325-3868-1m8nvk0    2013-03-25 23:21:32.110147117 +0000
        @@ -1,4 +1,4 @@
        -user nginx;
        +user www-data;
         worker_processes 1;
         error_log        /var/log/nginx/error.log;
         pid              /var/run/nginx.pid;

  * service[nginx] action reload
    - reload service service[nginx]

Chef Client finished, 2 resources updated

一応正常終了。つうかこのあたりの配布系の差分を埋める方法はその内出てくるのかどうなのか。