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
のように個別のタスクを呼び出すこともできる。
参考
- 特定のコマンドをパスワードなしでsudo する設定 – Slow Dance
- Capistrano で rsync – daily dayflower
- [Capistrano] Re: "you must have a tty to run sudo"
2013/10/04追記
Knife Sousを使って複数サーバーでChef Soloの方が今はいいかもしれない。