OSX
chef-solo
Berkshelf

Macでchef-soloとBerkshelfの環境構築手順

More than 5 years have passed since last update.

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}