ansible-vaultでymlファイルを暗号化するとファイル全体が暗号化されるため、内容の差分を見られません。当たり前といえば当たり前なのですが、ちょっと困りものでもあります。

ベストプラクティスがあった

何とかして暗号化しつつ変数名の定義を差分で見られるようにできないかなと探っていたところ、Best Practiceに書いてありました。

Variables and Vaults

A best practice approach for this is to start with a group_vars/ subdirectory named after the group. Inside of this subdirectory, create two files named vars and vault. Inside of the vars file, define all of the variables needed, including any sensitive ones. Next, copy all of the sensitive variables over to the vault file and prefix these variables with vault_. You should adjust the variables in the vars file to point to the matching vault_ variables and ensure that the vault file is vault encrypted.

ええと、

「group_varsにサブディレクトリを作ってvarsファイルとvaultファイルを作れ。varsファイルではセンシティブな変数も含めて全部定義しろ。次にvaultファイルにセンシティブな変数を全部コピーして、プレフィックスとしてvault_をつけろ。varsファイルでvalut_変数にマッチするようにポイントして、vaultファイルはちゃんと暗号化しろよ」

と。なるほど、わからん。具体的なコードがほしいです。

つまりこうする

group_vars/apps.yml が対象のファイルだとして、group_vars/apps/vars.yml と group_vars/apps/vault.yml の2つにコピーします。で、次のように書き換えます。

group_vars/apps/vars.yml

wordpress:
  db_name: wordpress
  db_user: wordpress
  db_pass: "{{vault_wordpress.db_pass}}"

group_vars/apps/vault.yml

vault_wordpress:
  db_pass: PASSWORDPASSWORD

これなら差分はvars.ymlで見られますので、vault.ymlを暗号化しても困りません。

おそらく、挙動としては次のような感じです。

  • group_varsにymlファイルではなくサブディレクトリを作った場合、該当のすべてのymlを読みにいく。
  • 変数を利用する前にjinja2の処理が走るので、 vault_変数の内容を埋め込める。
  • vault_プレフィックスは、実は何でもいい。同じ変数を別ファイルで宣言するとマージではなく上書きされてしまうので、重複を避けるためにプレフィックスをつけている。

ベストプラクティスは更新されている

こんな内容のこと読んだ覚えがなかったので追いかけてみたところ、2015年10月15日にPull Requestがマージされたものでした。ベストプラクティスも更新されていくのですね。