ChefでRoleやRecipeを実行するとき渡すべき必須のattributesをチェックする


例えばlvsを構築するときに、その下にぶら下がるreal serverたちのIPアドレスとかって、chef-client実行するときに-jオプション使ってjsonでattributes渡して欲しいわけですが、実際に実行する前に必須のものがなければ弾きたい、と思って色々ためした結果

Roleならjsonに、Recipeならattributes/default.rbに、__required__とかそういう感じの名前でattributesを作って、そこに配列で指定必須のattributesを並べて書いておく。

[sourcecode language="javascript”] { “name”: “nannchara-kannchara”, “default_attributes”: { }, “json_class”: “Chef::Role”, “env_run_lists”: { }, “run_list”: [ “recipe[foo]”, “recipe[bar::baz]” ], “description”: “hogeraccho”, “chef_type”: “role”, “override_attributes”: { “required": [ “test”, “test1”, “test2” ] } }


んで knife role from file nannchara-kannchara.json すると、knife search コマンドで取り出せるようになるので、あとは適当に整形すれば一覧として取り出せる

[sourcecode language="bash"]
$ knife search role -F json -q "name:nannchara-kannchara AND __required__:*" | tr -d '\n' | tr -d ' ' | grep -oE "required[^]]+" | awk -F[ '{print $2}' | tr ',' '\n' | tr -d '"'
test
test1
test2

無理やり感があるがまぁ使えるのでよし。