Edited at

Ansible Vault を賢く使う

More than 1 year has passed since last update.

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 を置いて


ansible.cfg

[defaults]

ask_vault_pass = True

と書いておけば --ask-vault-pass オプションをつけ忘れて

ERROR: A vault password must be specified to decrypt ...

と怒られることが無くなります。


ansible.cfg

[defaults]

vault_password_file=/some/where/password.txt

とすることもできます。グローバルな設定に書いちゃうとパスワードが違うかもしれないので注意。