Ansible Vaultのベストプラクティス
Ansible Vaultのベストプラクティス
はじめに
Ansible Vaultは、パスワード等の機密情報を暗号化できます。暗号化は、ファイル単位、変数単位のどちらにも対応していますが、単純に使うと、いずれも下記のデメリットが発生します。
ファイル単位
ファイル全体が暗号化されてしまうため、メンテナンス時にgrepなどで探してもヒットしない
変数単位
ansible-vault encrypt_string
コマンドで対象の文字列を暗号化する必要があるため、historyに機密情報が残る
これらを解決するために、公式ドキュメントでは、間接的な層を使って暗号化することを推奨しています。
ディレクトリ構成
間接的な層を使うとは、暗号化したファイルとは別に、暗号化したファイルを参照するファイルを作成しておくことです。group_varsの場合、下記のような構成を指します。
group_vars/ `-- db |-- vars.yml # 暗号化しない。vault.ymlを参照。 `-- vault.yml # 暗号化する。
グループ変数ファイルの中身
vault.yml
ansible-vault
コマンドで暗号化する想定です。機密情報を記載します。機密情報の変数は、わかりやすいようにvault_
プレフィックスを付けて定義します。
--- vault_db_password: dbpass
vars.yml
こちらは暗号化しません。機密情報にあたる変数のみ、vault.yml
を参照するよう定義します。
--- db_user: dbuser db_password: "{{ vault_db_password }}"
Playbook
変数を参照する際は、vars.yml
に記載した変数名を指定します。
- hosts: db gather_facts: false connection: local tasks: - debug: msg: "{{ item }}" loop: - "{{ db_user }}" - "{{ db_password }}"
実行結果
# ansible-vault encrypt group_vars/db/vault.yml New Vault password: Confirm New Vault password: Encryption successful # ansible-playbook -i inventory.ini vault_test.yml --ask-vault-pass Vault password: PLAY [db] *********************************************************************************** TASK [debug] ******************************************************************************** ok: [db01] => (item=dbuser) => msg: dbuser ok: [db01] => (item=dbpass) => msg: dbpass PLAY RECAP ********************************************************************************** db01 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
おわりに
商用環境の場合、この手の暗号化はAnsible Towerの認証情報機能を利用するケースが多いと思いますが、メンテナンス性を意識した変数暗号化のあり方は、参考になるかもしれません。