test-kitchen+chef-zero環境でchef-shellを起動するオプションが複雑だったので調べたメモ。
chef-shellはchef-clientのインタプリタ環境です。chefレシピの開発してると毎回全部のレシピを実行するには何かと時間がかかるので、こーゆーインタプリタをうまく使いこなせると、chefレシピ開発が捗って良い感じですね。
基本的なchef-shellの使い方は公式のドキュメントを参照。
https://docs.chef.io/chef_shell.html
このエントリでは、test-kitchen+chef-zero環境で構築中のインスタンス内で、chef-shell起動するにはもろもろ色々なオプション指定してやらないといけないのですが、これが割りと複雑だったのでオプションのコピペ用のメモとしてまとめておきます。
まず、chefで構築対象のインスタンス内にログインし、chef-zeroのプロセスを起動します。
[ec2-user@myhost ~]$ sudo /opt/chef/embedded/bin/chef-zero
>> Starting Chef Zero (v4.2.1)...
>> WEBrick (v1.3.1) on Rack (v1.5) is listening at http://127.0.0.1:8889
>> Press CTRL+C to stop
もう一枚別のターミナルを開いて、knife uploadしてcookbookのデータを送り込みます。この時、/tmp/kitchen配下にtest-kitchenが送り込んだデータのキャッシュが残っているので、これを使います。
[ec2-user@myhost kitchen]$ cd /tmp/kitchen/
[ec2-user@myhost kitchen]$ sudo knife upload ./ -s http://127.0.0.1:8889 --chef-repo-path ./ -c client.rb
upload出来たら、chef-shellを-zのclientモードで起動します。client.rbとdna.jsonを一緒に渡すと.kitchen.ymlで指定しているattributesも読み込まれて、test-kitchenで実行しているのと同じ状態が再現できます。
[ec2-user@myhost kitchen]$ sudo -E /opt/chef/bin/chef-shell --config /tmp/kitchen/client.rb --json-attributes /tmp/kitchen/dna.json -z -S http://127.0.0.1:8889
loading configuration: /tmp/kitchen/client.rb
Session type: client
(略)
This is the chef-shell.
Chef Version: 12.3.0
http://www.chef.io/
http://docs.chef.io/
run `help' for help, `exit' or ^D to quit.
Ohai2u ec2-user@myhost.example.com!
chef >
こんなかんじでchef>のプロンプトが出てきたら読み込み完了です。
後はrecipe_modeに入れば、レシピの書き方とか合ってるか対話的にデバッグできます。
ちゃんとchef-clientの実行コンテキストを理解しているので、例えばこのようにEncrypted Data Bagからの読み込みとかも出来ます。
chef > recipe_mode
chef:recipe > data_bag = Chef::EncryptedDataBagItem.load("db_servers", "dev-db01")
chef:recipe > decrypted_config = data_bag.to_hash
=> {"id"=>"dev-db01", "host"=>"dev-db01.example.com", "port"=>3306, "name"=>"database_dev", "user"=>"root", "password"=>"pass"}
これでレシピのデバッグが捗りますね。
Happy Chef Cooking !!