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

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

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

{
  "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 コマンドで取り出せるようになるので、あとは適当に整形すれば一覧として取り出せる

$ 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

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