Capistranoとchef-soloを組み合わせて使う

たくさんのホストをChef設定したいけどChefサーバー立てるのめんどくさいし!
でもコマンド一発ですべてのホストが更新されて欲しいし!

というわけでこの組み合わせです。

Capistranoはインストール済みでsshのログインに必要な鍵も各ホストに配ってあるものとする。
加えてChefのクックブックなどはすでに定義済みで以下のパスにある前提で。

/home/akahige/chef-repo

Chefに関してはここでは深くつっこまないので、よかったら以前書いたものをどうぞ。

sudoの設定

chef-soloはsudo経由(root権限)で実行する必要がある。
そしてCapistranoでsudoを実行するにはパスワードなしでコマンドを実行できる必要がある。
そういう事情なのですべてのホストにてsudoをの設定をしておく。

/etc/sudoersに以下の一行を追記。

akahige  ALL=(ALL)       NOPASSWD: /usr/local/bin/chef-solo

chef-soloのパスは環境に合わせる。
ユーザー名はCapistranoとChefを実行するユーザー名で。

NOPASSWDが許容できない場合、話はここでおしまいです。

Capistranoの設定

capifyコマンドでCapistranoの実行に必要なファイルを作成する。

$ cd /home/akahige/chef-repo
$ capify .

Capfileとconfig/deploy.rbができる。
続いてconfig/deploy.rbを編集する。

ロール等の設定
set :application, "chef-solo"
set :master_host, "192.168.1.101"
set :user, "akahige"

role :web, "192.168.1.101", "192.168.1.102", "192.168.1.103", "192.168.1.104", "192.168.1.105", "192.168.1.106", "192.168.1.107", "192.168.1.108", "192.168.1.109", "192.168.1.110"

applicationは今回完全にオレオレタスクしか使わないので適当。
クックブックの同期はrsyncで行う心づもりのためscmなどの行は削除。
しかし使えるバージョン管理サーバーがあれば使うようにすればよりオシャレでしょう。

master_hostはCapistranoを実行するホストのIP。
userは他のホストにsshで接続するアカウント。
これらは続いて作成するタスクで必要なので定義した。

ロールは今回webのみ。10台のホストをひもづけている。

Capistranoのタスクの作成

引き続きタスクをdeploy.rbに定義する。

namespace :chef do
  task :default do
    sync_cookbooks
    run_web
  end

  task :run_web, :roles => :web do
    sudo "chef-solo -c /home/akahige/chef-repo/.chef/solo.rb -j /home/akahige/chef-repo/.chef/web.json", :pty => true
  end

  task :sync_cookbooks  do
    chef_repo_path = "/home/akahige/chef-repo/"

    username = user || ENV['USER']

    find_servers_for_task(current_task).each do |server|
      next if server.host == master_host
      `rsync -avz --delete -e ssh #{chef_repo_path} #{username}@#{server.host}:#{chef_repo_path}`
    end
  end
end

各ホストでchef-soloを実行するタスクとクックブック(chef-repo)を同期するタスクを定義している。

chef-soloの実行

$ cap chef

各ホストでsudoの設定が適切に行われていれば、このコマンド一発でそれぞれのホストでchef-soloが実行され、web.jsonの内容が反映される。

$ cap chef:run_web

のように個別のタスクを呼び出すこともできる。

参考

2013/10/04追記

Knife Sousを使って複数サーバーでChef Soloの方が今はいいかもしれない。