はじめに
実際の現場では、AnsibleのPlaybookをGitHubやBitbucketなどで管理・共有していると思います。
その際気をつけなければならないのがパスワードなどの機密情報の管理です。
publicはもちろん、privateなリポジトリでもこれらの情報をアップロードすべきではありません。
そうした課題に応えるため、Ansibleにはansible-vault
という機能があり、暗号化したファイルをPlaybook実行時に自動的に復号化してくれます。便利!
ただし、ansible-vault
の暗号化はファイル単位となってしまうので、使い方によっては管理しづらくなるケースがあります。
よくあるケース
テンプレートに下記のようにパスワードを埋め込みたいとき
password={{ password }}
上記password
というパラメータをsecret.yml
に記載して暗号化
password: XXXXXXXX
暗号化後
$ANSIBLE_VAULT;1.1;AES256
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...
上記の問題
新しいメンバは、templateを見てpassword
というパラメータがあることを知りますが、リポジトリ内を検索してもkeyごと暗号化されているので当然見つかりません。
一人で開発している場合は作った本人が把握しているので問題ないでしょうが、チームで開発しており、新しいメンバがジョインしたときなどは混乱をきたすことになるかもしれません(私だ)。
解決策
変数を階層化し、通常の変数と暗号化する変数の階層を分ける
こうすると、valueに別階層の変数を指定できるため、valueのみを暗号化できます(password
というパラメータ自体は検索できる)。
sample
user={{ my_vars.user }}
password={{ my_vars.password }}
---
my_vars:
user: username
password: "{{ secret.password }}"
---
secret:
password: XXXXXXX
暗号化後
$ANSIBLE_VAULT;1.1;AES256
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...
password
というパラメータ自体は、user
というパラメータと共に暗号化していないvars.yml
に定義してあるため、検索も容易です。
そのvalueを見れば、値そのものはわからなくてもsecret.password
に定義されているのだなとわかります。
あとは、暗号化ファイルはファイル名に_secret
をつけるなどの命名規則を決めておけば新しいメンバも混乱することはないでしょう(私だ)。
参考
ansible-playbook
実行時の復号はパスワード入力でも可能ですが、実際の運用を考えると現実的ではありません。
暗号化時のパスワードをファイルに記載しておき、ansible-playbook
実行時にそれを参照するようにします。
$ ansible-playbook -i hosts site.yml --vault-password-file /PATH/TO/.vault_password
これでもいいですが、ansible.cfg
の[defaults]
に下記のように設定すれば--vault-password-file
オプションも不要になります。
[defaults]
vault_password_file = /PATH/TO/.vault_password
あとは/PATH/TO/.vault_password
をメンバ間で共有しておけば、通常どおりansible-playbook
で実行できます。
通常運用での暗号化ファイルの操作
既存ファイルの暗号化
ansible-vault create
で新規作成するのが本来かもしれませんが、私の場合、暗号化せずに開発を進めてリポジトリにpushするタイミングで暗号化することが多いです。
$ ansible-vault --vault-password-file /PATH/TO/.vault_password encrypt secret.yml
暗号化ファイルの編集
$ ansible-vault --vault-password-file /PATH/TO/.vault_password edit secret.yml
復号(個人的にあまり使わない)
$ ansible-vault --vault-password-file /PATH/TO/.vault_password decrypt secret.yml