はじめに
Ansibleで暗号化したい変数をどこのファイルにどうやって管理すればいいか、自分の状況にあわせまとめてみました。
Ansible公式ドキュメントのベストプラクティスにある「Variables and Vaults」をベースにしています。
Best Practices — Ansible Documentation
背景
- ansibleのroleやplaybook(group_varsなど)をgitでソース管理中。
- varsやインベントリに登録しているbecome_passやDB系のパスワードはさすがに平文でgitに上げるのはまずい。
- 少し調べてみるとAnsible-Vaultを使えば暗号化はできることはわかった。
- だけど、今のgit管理上どこのファイルを暗号化かけて管理しようか…という悩み発生。
ということで、Vaultで暗号化されたファイルの管理について、簡単に調べてみました。
変更前の構成
ansibleの構成は、以下のようにansibleベストプラクティスに沿ったような構成で、下記のディレクトリ群をgitで管理しています。(正確にはちょっと異なりますが、ベースはほぼ同じ)
production # プロダクション用インベントリ
staging # ステージング用インベントリ
group_vars/
webservers.yml # webサーバ用vars
dbservers.yml # DBサーバ用vars
production.yml # プロダクション用vars
staging.yml # ステージング用vars
host_vars/
hostname1.yml # host別vars host_vars
hostname2.yml
site.yml # マスター playbook
webservers.yml # webサーバ用のplaybook
dbservers.yml # dbサーバ用のplaybook
roles/ # importするrole群を配置
:
変更後の構成
★部分が変更した構成
production # プロダクション用インベントリ
staging # ステージング用インベントリ
.vaultpass # ★復号用パスワードファイル
group_vars/
webservers.yml # webサーバ用vars
dbservers.yml # DBサーバ用vars
production/ # ★プロダクション用varsディレクトリ
vars.yml # ★プロダクション用vars
vault.yml # ★プロダクション用vars(暗号化対象)
staging/ # ★ステージング用varsディレクトリ
vars.yml # ★ステージング用vars
vault.yml # ★ステージング用vars(暗号化対象)
host_vars/
hostname1.yml # host別vars host_vars
hostname2.yml
site.yml # マスター playbook
webservers.yml # webサーバ用のplaybook
dbservers.yml # dbサーバ用のplaybook
roles/ # importするrole群を配置
:
説明
group_vars配下にあるファイルはベストプラクティスにあるとおり、以下のように普通のvarsファイルと暗号化されたvaultファイルに分割可能。
group_vars/group_dir/vars.yml
group_vars/group_dir/vault.yml
group_vars/webservers.ymlなども上記のように分割することは可能だけど、基本暗号化したいファイルはproductionに定義するルールにしたほうが、暗号化するファイルも少なく管理も楽と判断。
あとは、.vaultpassファイルに復号用のパスワードを記載し、基本「vault-password-file」オプションでplaybookの実行を行う。(自動化等を踏まえると「ask-vault-pass」オプションで毎回復号パスを入力するのはナンセンスなので)
ただし、.vaultpassファイルをgit登録してしまったら元も子もないので、gitignoreでちゃんと除外しておくこと。
暗号化やplaybook実行コマンド
.vaultpassファイル作成
cd {playbook格納ディレクトリ}
echo "{復号パスワード}" > .vaultpass
暗号化varsファイルの作成/編集
cd {playbook格納ディレクトリ}
ansible-vault create {暗号化varsファイル} --vault-password-file=.vaultpass
ansible-vault edit {暗号化varsファイル} --vault-password-file=.vaultpass
playbook実行時のコマンド(例)※
cd {playbook格納ディレクトリ}
ansible-playbook -i production site.yml --vault-password-file=.vaultpass
※playbook実行時にvault-password-fileオプションをつけるのが、なんとなく微妙なのでansible.cfg(もしくはinventry)にオプションを記載してもOK。
[vars:production]
vault_password_file=.vaultpass
[defaults]
vault_password_file=.vaultpass
以上です。