Berkshelfでcookbookをインストールして、knife solo cook ${node}でリモートで
chef-soloを実行するための環境をMac上で構築する手順です。
前提
rbenvを使う場合
Homebrewのrbenvでruby 2.0.0-p0をインストール済みという前提です。1.9.xでも大丈夫です。
Omnibus Chefインストーラでrubyとchefを一括インストールする場合
rubyがインストールされていない場合は以下のコマンドでrubyとchefをインストールするという手もあります。
curl -L http://www.opscode.com/chef/install.sh | sudo bash
上記のコマンドで/opt/chef/embedded以下にruby 1.9.3-p286がインストールされます。
以下の作業でgemコマンドなどを使うためにPATHを設定しておきます。
export PATH=/opt/chef/embedded/bin:$PATH
chefレポジトリのディレクトリを作成
sudo mkdir /etc/chef
sudo chown `whoami` /etc/chef
cd /etc/chef
rbenvを使っている場合は/etc/chef以下で使うバージョンを指定しておきます。
rbenv local 2.0.0-p0
bundlerでgemをインストール
bundlerをインストールしていない場合はインストールします。
gem install bundler
Gemfileを作ってbundlerでgemをインストールします。
cat <<'EOF' > Gemfile
source 'https://rubygems.org'
gem 'chef'
gem 'knife-solo', :github => 'matschaffer/knife-solo'
gem 'berkshelf'
EOF
bundle --path vendor/bundle
» めんどくさい bundle exec を省略する方法 TECHSCORE BLOGを参考にして、以下のコマンドを実行します。
bundle install --binstubs
PATHに./binを追加するのは気が引けたので、/etc/chefにて./bin/knifeのように実行することにしました。
knifeの設定
./bin/knife configure
最後のPlease enter the path to a chef repository (or leave blank):
のみ /etc/chef
と入力して他はデフォルト値のままにします。
knife solo cook ${node}での転送先はknife-soloのgit (0.3.x)だとsolo_pathの設定値になりますが、0.2だとfile_cache_pathの設定値になります。
~/.chef/knife.rbにsolo_pathの設定を追加します。
cat <<'EOF' >> ~/.chef/knife.rb
knife[:solo_path] = '/etc/chef'
EOF
chefレポジトリを初期化
一旦/etc/chef/repo/に作って/etc/chef/に移動します。
./bin/knife solo init /etc/chef/repo
mv /etc/chef/repo/* .
rmdir repo
cat <<'EOF' > /etc/chef/solo.rb
file_cache_path "/var/chef"
data_bag_path "/etc/chef/data_bags"
encrypted_data_bag_secret "/etc/chef/data_bag_key"
cookbook_path [ "/etc/chef/site-cookbooks",
"/etc/chef/vendor/cookbooks" ]
role_path "/etc/chef/roles"
EOF
gitレポジトリを作成して初回コミット
cat <<'EOF' > .gitignore
/bin
/.bundle
/.ruby-version
/vendor
EOF
git init
git add .
git commit -m 'first commit'
以降、適宜区切りの良い所でgitにファイルをaddしてcommitしてください。
Berkshelfでcookbookをインストール
cat <<'EOF' > Berksfile
site :opscode
cookbook 'yum'
cookbook 'nginx'
EOF
bundle exec berks install --path vendor/cookbooks
リモートサーバにchef-soloをセットアップ
BerkshelfのVagrant連携は使わないようにしています。VagrantのVMとリモートサーバで
同じ手順でchef-soloを実行したいからです。
以下のコマンドでリモートサーバにchef-solo環境をセットアップします。${node}の部分はリモートサーバのホスト名を指定します。予め~/.ssh/configでホスト名に対応する設定を追加してrootユーザでログインできるようにしておきます。
./bin/knife solo prepare ${node}
リモートサーバでchef-soloを実行
以下のコマンドでchefレポジトリをリモートサーバに同期し、chef-soloを実行します。
./bin/knife solo cook ${node}