MacBook Air の環境構築を chef-solo を使ってやってみる。
ruby-2.0.0 のインストールまで
ターミナル・アプリを起動して ruby の存在を確認。ruby-1.8.7 がインストールされていることを確かめた。最初の状態では Xcode も X も git もインストールされていない。以下のパッケージをまずインストールした:
Google Chrome は愛用のブラウザーなので、いの一番にインストール。昔は Xcode をインストールすると X やらコマンド・ラインで使える gcc が入ったものだけど、Mountain Lion では X は別アプリ、コマンド・ライン用のコマンドも Command Line Tools に分離されている。
Command Line Tools をインストールすると git-1.7.12.4 もインストールされる。昔は MacPorts を使って git をインストールしていたので、この配慮はありがたい。
ruby のバージョンが古いので、rbenv 経由で 2.0.0p0 をインストールする (ruby-1.8.7 でも大丈夫という気もするけど念のため)。
$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
.profile を作成。
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
ruby-build をインストール:
$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ sudo ./install.sh
ruby-2.0.0-p0 をコンパイル & インストール:
$ rbenv install 2.0.0-p0
$ rbenv global 2.0.0-p0
$ rbenv rehash
最後に bundler gem をインストールしておく:
$ gem install bundler
$ rbenv rehash
chef-solo の準備
ruby-2.0.0 のための準備
ruby-2.0.0 では、chef-solo コマンド実行時に gemfiles/format
がないというエラーが出る。その対策を先にしておく。ruby 1.9 を使っている人はスキップされたし。
$ mkdir prog
$ cd prog
$ bundle gem rubygems-format-dummy
$ cd rubygems-format-dummy
$ touch lib/rubygems/format.rb
$ git add lib/rubygems/format.rb
$ git commit -m 'initial commit'
$ emacs -nw -q rubygems-format-dummy.gemspec
(TODO とあるところを適当に書き換える)
$ rake build
chef-solo のインストール
まず /etc/chef
を作り chef-solo を /etc/chef
以下にインストールする。
$ sudo mkdir /etc/chef
$ sudo chgrp staff /etc/chef
$ sudo chmod 775 /etc/chef
$ cd /etc/chef
$ rbenv local 2.0.0-p0
$ cat <<'EOF' > Gemfile
source 'https://rubygems.org'
gem 'chef'
gem 'rubygems-format-dummy', :path => '/Users/you/prog/rubygems-format-dummy'
EOF
$ bundle install --path vendor/bundle
$ rbenv rehash
$ bundle exec chef-solo -v
Chef: 11.4.0
設定ファイル
まず knife configure コマンドの実行。デフォールトから変えた点のみ記載。
$ bundle exec knife configure -i
Where should I put the config file? [Users/you/.chef/knife.rb] /etc/chef/.chef/knife.rb
Please enter the path to a chef repository (or leave blank): /var/chef-solo
続いて solo.rb と node.json の作成。ここでは、レシピを screen にしておく。
$ cd /etc/chef
$ cat <<'EOF' > solo.rb
file_cache_path "/var/chef-solo"
cookbook_path ["/var/chef-solo/cookbooks"]
$ cat <<'EOF' > node.json
{
"run_list": [ "recipe[screen]" ]
}
EOF
cookbook を置く場所も用意しておく。sudo するのも面倒なので一般ユーザーも cookbook を書けるようにしちゃった。
$ cd /var
$ sudo mkdir chef-solo
$ sudo chgrp staff chef-solo
$ sudo chmod 775 chef-solo
せっかくなので git で管理してみる。
$ cd chef-solo
$ touch .gitignore
$ git init
$ git add .gitignore
$ git commit -m 'initial commit'
Recipe を書く
screen の設定ファイル .screenrc をインストールする recipe を書いてみる。というのも、Mac での install ってどうなってるのか分からなかったので (^^;)。
まずは screen のための cookbook を作る。
$ cd /etc/chef
$ bundle exec knife cookbook create screen
template を作成する。/var/chef-solo/cookbooks/screen/templates/default/.screenrc.erb
に普段使っている .screenrc の内容をコピペ (see also. clmemo@aka: GNU Screen の設定 (.screenrc) をさらしてみる)
escape ^Tt
markkeys h=^B:l=^F:$=^E:^U=^Z:^D=^V
続いてテンプレートをインストールする recipe を作成する。レシピの置き場所は /var/chef-solo/cookbooks/screen/recipes/default.rb
。中身は次の通り:
users = node['screen']['users']
users.each do |user|
template "Users/#{user}/.screenrc" do
owner user
group "staff"
mode 0664
end
end
Mac のホーム・ディレクトリーに .screenrc をインストールしようと試みている。
ユーザー名は /var/chef-solo/cookbooks/screen/attributes/default.rb
に書く。ここではダミーとして guest とした。
default['screen']['users'] = [ 'guest' ]
以上で recipe の作成は終了。
chef-solo の実行
recipe が出来たので、chef-solo を実行する。
$ cd /etc/chef
$ bundle exec chef-solo -j node.json
と、これでは guest ユーザーに .screenrc がインストールされる。recipe の中にユーザーを書かなかったのは、自分の Mac にいるユーザー・アカウントを知られたくなかったのと、環境ごとにユーザー名が徴妙に変わったりするため。ユーザー・アカウントの違いは node.json の中で吸収する。ユーザー foo と bar がいる場合の node.json。
{
"screen": {
"users": [ "foo", "bar" ]
},
"run_list": [
"recipe[screen]"
]
}
改めて chef-solo を実行。
$ bundle exec chef-solo -j node.json
今回はユーザー権限でも実行できるけど、ほとんどの場合はルート権限が必要と思う。その場合は、次の様にコマンドを打つ。
$ sudo env PATH=$PATH bundle exec chef-solo -j node.json
node.json でユーザー名を指定しないのなら、recipe を直接指定するのもあり。
$ sudo env PATH=$PATH bundle exec chef-solo -o screen
Mac での chef-solo 事始めは、これでおしまい。
あとがき
Mac で install を実行する場合、MacPorts とか Homebrew を使うのかな? どうやって使うのかな? Linux と同じ様な書き方でいいのかな? それは Linux の recipe と共存できるのかな?
今回、ユーザー・アカウントを recipe の中に含めたくなかったから node.json を使った。このやり方は chef 本流の書き方なのかしらん。もっとスマートなやり方がある様な気がする。
/var/chef-solo を git で管理してみたものの... 他人の cookbook を github から clone する時に git 管理下に git 管理下のリポジトリーを置くことになる。それは、なんか奇麗じゃない。
chef-solo に触ったばかりでまだまだ分からないことだらけ。本エントリーを読んで、多少なりとも Mac 使いが chef-solo を身近に感じとってもらえるなら嬉しい。