Chef Berkshelf でのハマりどころメモ

正直 Chef 使うのやめたい…！

でも OpsWorks が Chef 使えっていうんだからしょうがない…
なんだかんだ、デファクトスタンダードだしな。

ハマりどころとしては2点。

* リポジトリURLとバージョン(タグ)の指定方法  
specify repository URL and version(tag name) at the same time
* ネストされた Berksfile (依存関係) の解決  
resolve dependencies for nested Berkfile



リポジトリURLとバージョン(タグ)の指定方法
===========================================

git プロトコルを使っちゃう
-------------------------------------------

```rb:Berksfile
cookbook "vpcnat", github: "weseek/chef-vpcnat"
```

#### Output

<pre>Failed to download 'vpcnat' from github: 'weseek/chef-vpcnat' with branch: 'master' over protocol: 'git'
Cookbook 'vpcnat' not found in any of the default locations</pre>

まあこれはエラーメッセージ見ればわかるし、ポートが空いてるかどうかはネットワークによるし。



tagなのかbranchなのかハッキリしろ
-------------------------------------------

```rb:Berksfile
cookbook "vpcnat", git: "https://github.com/weseek/chef-vpcnat", tag: "v1.0.0"
```

#### Output

<pre>STDERR: Failed to download 'vpcnat' from github: 'weseek/chef-vpcnat' with branch: 'v1.0.0' over protocol: 'git'
Cookbook 'vpcnat' not found in any of the default locations</pre>

意味がわからん…

[本家ドキュメント](http://berkshelf.com/) によると、
> An optional tag key is an alias for branch and can be used interchangeably.

interchangeably(交換可能)だ～？うそつきー！うそつきーー！
(バグ？？)


Workable
-------------------------------------------

```rb:Berksfile
cookbook "vpcnat", git: "https://github.com/weseek/chef-vpcnat", ref: "tags/v1.0.0"
```



ネストされた Berksfile (依存関係) の解決  
===========================================

```rb:parent/Berksfile
site :opscode

cookbook "awscli", git: "https://github.com/weseek/chef-awscli"
cookbook "vpcnat", git: "https://github.com/weseek/chef-vpcnat", ref: "tags/v1.0.0"
```

```rb:vpcnat/Berksfile
site :opscode
metadata

cookbook "cron", "= 1.3.6"

cookbook "awscli", git: "https://github.com/weseek/chef-awscli"
cookbook "databag-util", git: "https://github.com/weseek/chef-databag-util"
cookbook "ec2util", git: "https://github.com/weseek/chef-ec2util"
```

```rb:vpcnat/metadata.rb
name             'vpcnat'

(snip)

depends 'awscli'
depends 'cron'
depends 'databag-util'
depends 'ec2util'
```


症状
-------------------------------------------

<pre>---- Begin output of BERKSHELF_PATH=/var/lib/aws/opsworks/berkshelf_cache /opt/aws/opsworks/local/bin/berks install --path /opt/aws/opsworks/current/berkshelf-cookbooks ----
STDOUT: Using python (1.4.6)
Using cron (1.3.6)
Installing awscli (0.1.0) from git: 'https://github.com/weseek/chef-awscli' with branch: 'master' at ref: '023e309d506da2752a6d04bff206f6b4f651d515'
Installing vpcnat (1.0.0) from git: 'https://github.com/weseek/chef-vpcnat' with branch: 'v1.0.0' at ref: '6b503834a8ca704aac0e830536770d9075183b20'
STDERR: Cookbook 'databag-util' not found in any of the default locations</pre>

databag-util がないって怒られてるけど、おそらく ec2util も同様の症状。

stackoverflow に記事があった。

* [Problems with using non-community cookbooks with berkshelf](http://stackoverflow.com/questions/20479174/problems-with-using-non-community-cookbooks-with-berkshelf)
* [Berkshelf only recursively pulling in dependencies defined in metadata.rb?](https://github.com/berkshelf/berkshelf/issues/154)

要するに、デフォルトサイト指定の cookbook はともかく、自前で準備したものの依存関係は、<b>全てトップレベルの Berksfile (上の例だと parent のもの) に書いとかなきゃいけない</b>ってことだ。上の例での awscli はそれ故に解決可能になっている。


ってこんなのさ…




やってらんねーぜ！！
===========================================

え、前時代的すぎない？？

なんていうか、<b>Debian が apt-get 使ってるのに未だに rpm で頑張ってた頃の Redhat </b>みたいな印象を受けるんだけど。

Ruby の rvm 、Berkshelf、
PHP の Composer、
いろいろさわったけどどれも使ってたらハゲるの早まりそうなものばっかりだ(rbenv は触ってないからしらん)。
Grails(Maven) を使っている身としては我慢ができない。