二流シェフ目指してがんばるぞう。


Chef って?

  • 「サーバーの状態を管理し収束させるためのフレームワーク」
  • Chef 以外にも Puppet というやつもいるよ
  • Facebook 社が使っておられます
  • ローカルの開発環境セットアップにも使える!!
  • 利用形態は大きく2つ
    • Chef Server + Chef Client(大規模環境管理)
    • Chef Solo(単独のコマンドとして Chef を実行)
  • recipe:「コード化された手順書」「サーバーの状態」
  • cookbook:「特定の recipe に必要なデータやファイルをまとめる入れ物」
  • repository:「Chef の実行に必要な一連のファイルをまとめる入れ物」
  • repository > cookbook > recipe


購入すると物凄く捗る


ローカルの初期状態

  • rbenv を用いて ruby 1.9.3.p392 をインストール済み
  • chef 11.4.4 をインストール済み
  • 初期設定も終わってたっぽい
  • 終わってなければ以下を実行
$ gem install chef
$ knife configure


knife-solo 0.3.0 のインストール

$ mkdir ~/knife-solo
$ cd knife-solo
  • bundle 初期化
$ bundle init
  • Gemfile を編集する
$ source "https://rubygems.org"
$ gem 'knife-solo', '0.3.0.pre3'
  • knife-solo をインストール
$ bundle install --path=vendor/bundle --binstubs
  • .chef/knife.rb に以下を追加(knife-solo 0.3.0 のときだけ)
knife[:solo_path] = '/tmp/chef-solo'
  • repository をつくる
$ ~/knife-solo/bin/knife solo init your-repo
  • 先人たちの cookbook を手に入れるための準備
$ cd your-repo
$ git init
$ git add .
$ git commit -m 'first commit'


先人たちの cookbook を手に入れてみる

  • Opscode Community にユーザー登録
  • 秘密鍵をダウンロードして ~/.chef/username.pem にパーミッション 600 で保存
  • 試しに yum の cookbook をダウンロード
$ knife cookbook site vendor yum -o cookbooks
  • とりあえず、参考になりそうな以下をダウンロード
$ knife cookbook site vendor nginx -o cookbooks
$ knife cookbook site vendor mysql -o cookbooks
$ knife cookbook site vendor daemontools -o cookbooks
$ knife cookbook site vendor perlbrew -o cookbooks
$ knife cookbook site vendor jenkins -o cookbooks
  • サードパーティーの cookbook を扱うためのツールとして Berkshelflibrarian というものもあるらしいが、なんかそういうのあんまり好きじゃないので今回は使わない


とりあえず nginx の cookbook をつくって cook してみる

  • cookbook の雛形をつくる
$ knife cookbook create nginx -o site-cookbooks
  • recipe を書く
    • package とか service とか template は Chef が提供する resource
    • user と group は attributes を参照する
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 node['nginx']['user']
  group node['nginx']['group']
  mode 0644
  notifies :reload, 'service[nginx]'
end
  • port を指定できるようにして template を書く
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;
        }
    }
}
  • attributes にデフォルト値を書いておく
default['nginx']['user']  = 'user-name'
default['nginx']['group'] = 'user-group'
default['nginx']['port']  = '80'
  • JSON を作成
    • Chef Solo 実行時に渡す変数の値やどの recipe を実行するかを設定する
    • JSON はダブルクォーテーションじゃないとだめ
{
    "run_list" : [
        "nginx"
    ]
}
  • 対象サーバーに Chef をインストール
    • 対象サーバー:CentOS
    • SSH の設定は ~/.ssh/config でうまいことやってる前提
$ ~/knife-solo/bin/knife solo prepare host-name
  • cook する(cook するユーザーはパスワードなしで sudo 実行可能にしておく)
$ ~/knife-solo/bin/knife solo cook host-name


参考