じゅにゃくんのはてブロ。

ブログ不精なんですが...。

chef (11.6.0) + knife-solo (0.3.0.pre5)は相性が悪いっぽい?

ちょこっと vagrant + chef-solo を試そうかと思ったらめっちゃハマったのでメモ。
環境は Mac OS X 10.7.5 で、

$ brew -v
Homebrew 0.9.4
$ brew info rbenv
rbenv: stable 0.4.0, HEAD
(略)
$ rbenv versions
  system
  1.9.3-p429
* 2.0.0-p195 (set by /Users/hogehoge/.rbenv/version)

こんな ruby 環境。
そして腐るほどあるchef-solo 環境設定のブログでよく見かけるように

$ gem install chef
$ gem install knife-solo --pre

と chef と knife-solo をインストールすると、2013/7/24 現在で、

chef (11.6.0)
knife-solo (0.3.0.pre5)

がインストールされます。そこで knife solo init を試そうとすると、

$ knife solo init chef-repo
FATAL: Cannot find sub command for: 'solo init chef-repo'
Available subcommands: (for details, knife SUB-COMMAND --help)

** BOOTSTRAP COMMANDS **
knife bootstrap FQDN (options)
(中略)
** SEARCH COMMANDS **
knife search INDEX QUERY (options)

** SHOW COMMANDS **
knife show [PATTERN1 ... PATTERNn]

** SSH COMMANDS **
knife ssh QUERY COMMAND (options)

** STATUS COMMANDS **
knife status QUERY (options)

** TAG COMMANDS **
knife tag create NODE TAG ...
knife tag delete NODE TAG ...
knife tag list NODE
(中略)
** XARGS COMMANDS **
knife xargs [COMMAND]

knife 側から solo コマンドが見えないようです。ruby 力よわいので ruby2 ではなく、1.9.3 に落として試したりしたけど結果は同じ。chef-solo は動くので knife-solo が悪いのだろうと色々探ってみてもダメ、こんな感じで 2 日くらい悩んでしまった。ここまでが昨日の話。

そして今朝、もしかして chef と knife-solo の相性が悪いのかも?と思い、chef のバージョンを落としてみることにした。

ということで Gemfile を、

# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
gem 'knife-solo', '0.3.0.pre5'
gem 'chef', '11.4.4'

と書いて bundle 経由でインストールしてみました。

chef (11.4.4)
knife-solo (0.3.0.pre5)

さてもう一度、knife solo init を試してみます。

$ knife solo init chef-repo
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Berkshelf...
$ cd chef-repo
$ ls -al
total 16
drwxrwxr-x  10 hogehoge  staff  340 Jul 25 10:20 ./
drwxrwxr-x   8 hogehoge  staff  272 Jul 25 10:29 ../
drwxrwxr-x   3 hogehoge  staff  102 Jul 25 10:20 .chef/
-rw-rw-r--   1 hogehoge  staff   12 Jul 25 10:20 .gitignore
-rw-rw-r--   1 hogehoge  staff   14 Jul 25 10:20 Berksfile
drwxrwxr-x   3 hogehoge  staff  102 Jul 25 10:20 cookbooks/
drwxrwxr-x   3 hogehoge  staff  102 Jul 25 10:20 data_bags/
drwxrwxr-x   3 hogehoge  staff  102 Jul 25 10:20 nodes/
drwxrwxr-x   3 hogehoge  staff  102 Jul 25 10:20 roles/
drwxrwxr-x   3 hogehoge  staff  102 Jul 25 10:20 site-cookbooks/

わーい、ちゃんと動いた。

ということで chef (11.6.0) + knife-solo (0.3.0.pre5) は相性悪いっぽいです。

vagrant で立ち上げたサーバに対しての操作も OK っぽいです。

$ knife solo prepare 192.168.33.10
Bootstrapping Chef...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6510  100  6510    0     0   1066      0  0:00:06  0:00:06 --:--:-- 28304
Downloading Chef 11.4.4 for el...
Installing Chef 11.4.4
warning: /tmp/tmp.9Tz9a7RZ/chef-11.4.4.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing...                ########################################### [100%]
   1:chef                   ########################################### [100%]
Thank you for installing Chef!
Generating node config 'nodes/192.168.33.10.json'...

次に yum に EPEL リポジトリを追加しようとしたら、

$ (git管理するおまじない)
$ knife cookbook site vendor yum
Installing yum to /Users/hogehoge/proj/ruby/chef-repo/cookbooks
Checking out the master branch.
Creating pristine copy branch chef-vendor-yum
Downloading yum from the cookbooks site at version 2.3.0 to /Users/hogehoge/proj/ruby/chef-repo/cookbooks/yum.tar.gz
Cookbook saved: /Users/hogehoge/proj/ruby/chef-repo/cookbooks/yum.tar.gz
Removing pre-existing version.
Uncompressing yum version 2.3.0.
removing downloaded tarball
No changes made to yum
Checking out the master branch.
$ vi nodes/192.168.33.10.json
$ knife solo cook 192.168.33.10
Running Chef on 192.168.33.10...
Checking Chef version...
Installing Berkshelf cookbooks to 'cookbooks'...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 11.4.4
Compiling Cookbooks...
[2013-07-25T01:56:04+00:00] ERROR: Running exception handlers
[2013-07-25T01:56:04+00:00] ERROR: Exception handlers complete
Chef Client failed. 0 resources updated
[2013-07-25T01:56:04+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[2013-07-25T01:56:04+00:00] FATAL: Chef::Exceptions::CookbookNotFound: Cookbook yum not found. If you're loading yum from another cookbook, make sure you configure the dependency in your metadata
ERROR: RuntimeError: chef-solo failed. See output above.
$ ls -al cookbooks
total 0
drwxrwxr-x   2 hogehoge  staff   68 Jul 25 10:55 ./
drwxrwxr-x  12 hogehoge  staff  408 Jul 25 10:55 ../

えー、なにこれ。

ということでちゃんと使えるようになるにはもう少し鍛錬が必要っぽいです。

なんとなく思うんだけど、rubyで作られた便利な技術は利用しているライブラリの依存関係で悩まされることが多いっす。こういうライブラリ間の依存が強すぎるのは自分はちょっと使いにくいなーって思う。

追記(13:10)

FATAL: Chef::Exceptions::CookbookNotFound: Cookbook yum not found.

これの原因わかった。
yum のレシピを、

$ knife cookbook site vendor yum

このように knife cookbook 経由で持って来ちゃったのがそもそもの間違いだったらしい。

knife solo init を行ったときの cookbook ディレクトリは Berkshelf が管理しちゃっているみたいです。knife solo cook すると Berkshelf が反応して、knife cookbook 経由で取り寄せた yum のレシピを消してしまう(Berkshelfからすれば「お前誰だ消えろ」的に扱うんでしょうな)。

なので、yum のレシピは Berkshelf 経由から取り寄せるような方法に変えれば良い。

$ cat Berksfile
site :opscode

cookbook 'yum'

このように Berkshelf ファイルを用意して、berks(Berkshelfのコマンド)の install を行う。

$ berks install
Installing yum (2.3.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'

無事に Berkshelf 経由で yum レシピがインストールされたようなので、knife solo cook を再度試み見てみます。

$ knife solo cook 192.168.33.10
Running Chef on 192.168.33.10...
Checking Chef version...
Installing Berkshelf cookbooks to 'cookbooks'...
Using yum (2.3.0)
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 11.4.4
Compiling Cookbooks...
Converging 3 resources
Recipe: yum::epel
  * yum_key[RPM-GPG-KEY-EPEL-6] action add (up to date)
Recipe: <Dynamically Defined Resource>
  * package[gnupg2] action install (up to date)
  * execute[import-rpm-gpg-key-RPM-GPG-KEY-EPEL-6] action nothing (skipped due to not_if)
  * remote_file[/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6] action create
(中略)
  * execute[yum-makecache] action run
    - execute yum -q makecache

  * ruby_block[reload-internal-yum-cache] action create
    - execute the ruby block reload-internal-yum-cache

Recipe: i18n::default
  * template[/etc/sysconfig/i18n] action create (up to date)
Chef Client finished, 5 resources updated

無事に動いたー。


入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code