19
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GitHubな環境でansible-vaultの暗号化パラメータをうまく管理するコツ

Last updated at Posted at 2018-03-04

はじめに

実際の現場では、AnsibleのPlaybookをGitHubやBitbucketなどで管理・共有していると思います。
その際気をつけなければならないのがパスワードなどの機密情報の管理です。
publicはもちろん、privateなリポジトリでもこれらの情報をアップロードすべきではありません。

そうした課題に応えるため、Ansibleにはansible-vaultという機能があり、暗号化したファイルをPlaybook実行時に自動的に復号化してくれます。便利!

ただし、ansible-vaultの暗号化はファイル単位となってしまうので、使い方によっては管理しづらくなるケースがあります。

よくあるケース

テンプレートに下記のようにパスワードを埋め込みたいとき

template.j2
password={{ password }}

上記passwordというパラメータをsecret.ymlに記載して暗号化

secret.yml
password: XXXXXXXX

暗号化後

secret.yml
$ANSIBLE_VAULT;1.1;AES256
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...

上記の問題

新しいメンバは、templateを見てpasswordというパラメータがあることを知りますが、リポジトリ内を検索してもkeyごと暗号化されているので当然見つかりません。

一人で開発している場合は作った本人が把握しているので問題ないでしょうが、チームで開発しており、新しいメンバがジョインしたときなどは混乱をきたすことになるかもしれません(私だ)。

解決策

変数を階層化し、通常の変数と暗号化する変数の階層を分ける

こうすると、valueに別階層の変数を指定できるため、valueのみを暗号化できます(passwordというパラメータ自体は検索できる)。

sample

template.j2
user={{ my_vars.user }}
password={{ my_vars.password }}
vars.yml
---
my_vars:
  user: username
  password: "{{ secret.password }}"
secret.yml
---
secret:
  password: XXXXXXX

暗号化後

secret.yml
$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オプションも不要になります。

ansible.cfg
[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
19
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?