Ansible でパスワードやAPIキーなどの機密情報を扱う場合には ansible-vault を使うことで暗号化されたファイルとして変数を保存できます。
簡単な使い方は以前書きました
Ansible Vault を試す
しかしながら、ansible-vault はファイル単位での暗号化であるため、暗号化の不要な項目までまるっと暗号化され、どんな変数が定義されているのかすらわからなくなってしまうという問題がありました。
これは結構不便です。
そんなことをずっと思っていたのですが、ふとドキュメントを読んでいたらこの問題の解決策が書いてありました。
Splitting Out Host and Group Specific Data
なんと、バージョン 1.4 という ansible-vault 登場(1.5)以前からある機能でした!!
が、
As an advanced use-case, you can create directories named after your groups or hosts, and Ansible will read all the files in these directories. An example with the ‘raleigh’ group:
からはじまる Ansible Vault を使う場合はサブディレクトリを入れると良いよという説明が加えられたのは 1.8 の時でした。
どういう機能かというと、たとえば appservers
というグループに属するホストで DB のパスワードを扱いたい場合、group_vars/appservers
というファイルにパスワード以外の秘密にしなくても良い変数があったとしても vault で暗号化してしまうと上で書いたような使い辛さがあります。
でも実は group_vars/appservers/public.yml
, group_vars/appservers/db_password.valut
という具合にグループ名をディレクトリとし、その配下に任意の名前でファイルを置いておけば全部読み込んでくれるのです。
こういうことであれば、暗号化するファイルは変数名をファイル名にするというルールにすることでどこでどんな変数が定義されているかが復号のためのパスワードを知らない人でもわかります。
また、テキストファイルであれば .yml
サフィックスをつけておけば editor へのヒントになるし、vault で暗号化しているなら .vault
というサフィックスにすることで名前を見ただけで暗号化されていることが分かりますね。
2017-09-28 追記
Ansible 2.2.1 から変数ファイルは .yml
, .yaml
, .json
という拡張子のファイルもしくは拡張子のない(ドットを含まない)ファイルしか読み込まないようになっていました。(https://github.com/ansible/ansible/issues/18223 あたりから辿れる)
Best Practices の Variables and Vaults 項 では
group_vars/{group_name}/vars
, group_vars/{group_name}/vault
というファイルを作り、vars
ファイルに
password: "{{ vault_password }}"
some_secret: "{{ some_secret }}"
vault
ファイルに
vault_password: "XXXXXXX"
some_secret: "YYYYYYYY"
と書いて暗号化するべしと書いてあります。
もうひとつおまけ
Ansible Vault を使った playbook ではそのルートフォルダに ansible.cfg
を置いて
[defaults]
ask_vault_pass = True
と書いておけば --ask-vault-pass
オプションをつけ忘れて
ERROR: A vault password must be specified to decrypt ...
と怒られることが無くなります。
[defaults]
vault_password_file=/some/where/password.txt
とすることもできます。グローバルな設定に書いちゃうとパスワードが違うかもしれないので注意。