2013-04-25

chef-solo を Monuntain Lion で試す

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 を身近に感じとってもらえるなら嬉しい。

No comments:

Post a Comment