Ansibleでサーバをプロビジョニングする際、データベースのパスワードなどの取り扱いに注意を要する機密情報を扱う場合があります。
Ansibleで機密情報を管理したい場合ansible towerなどの別プロダクトを使う方法もあるのですが、簡単に情報管理したい場合はどうすれば良いでしょうか?
ansibleの変数を別ファイルで管理する
Ansibleでは変数を定義することができ、また変数定義のみを以下のようにvar_filesで指定することが可能です。
- playbook.yml
- hosts: localhost
vars_files:
- credentials.yml
tasks:
- debug: "msg='database user is {{ db_user }}'"
- credentials.yml
[localhost:vars]
db_user: sakila
db_password: passw0rd
上記2つのファイルを用意してplaybookを実行すると、以下のように別ファイルで定義した変数をplaybookから参照できていることがわかります。
$ ansible-playbook playbook.yml
TASK [debug] ***************************************************************
ok: [localhost] => {
"msg": "database user is sakila"
}
PLAY RECAP *****************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
gitでansibleの定義を管理している場合、.gitignoteにcredentials.ymlを追加しておき、このファイルだけ別管理すれば機密情報だけを別管理することができます。
credentials.ymlを暗号化してgitで管理する
ですが作業の都合上credentials.ymlの機密情報も合わせてgit管理したい場合もあります。
このような場合に備えて、Ansibleでは、Vaultというファイルを可逆暗号できる仕組みがあります。
vaultを使いたい場合は、まずは以下のようにansible-vault encrypt
コマンドでファイルを暗号化します。 コマンドを実行するとパスワードの入力が求められるので、適切なパスワードを入力します。
$ ansible-vault encrypt credentials.yml
New Vault password:
Confirm New Vault password:
Encryption successful
ansible-vault encrypt
コマンドを実行後にcredentials.ymlをみると以下のように暗号化されています。
$ more credentials.yml
$ANSIBLE_VAULT;1.1;AES256
31376335636462366133356533386238633539323634666564386436623466396433666161343664
3832303233376236306463616466633139353830323335350a373633323361373636666331313934
34643234646534343031653535643164643762313438663531656362636136653036656331376436
6664656336306133390a343730396431653861666631663762376232336161386537623263623465
37303063636632306632636535643338643337653331303830653965386339626534393631376262
3865363335346637623136353262623832626566303332626261
暗号化された機密ファイルを使ってプロビジョニングを行うためには、'--ask-vault-pass'オプションをつけてansible-playbookコマンドを実行します。すると、以下のように'Vault password:'とパスワードの入力を求められます。暗号化した時に指定したパスワードを入力することで復号化が行えます。
$ ansible-playbook --ask-vault-pass playbook.yml
Vault password:
TASK [debug] ************************************************************************************
ok: [localhost] => {
"msg": "database user is sakila"
}
PLAY RECAP **************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
こうしておくことで、機密情報を暗号化できるので、credentials.ymlも含めてgitで管理することが可能となります。
ansible-vaultの復号エラー例
ansible-vaultで暗号化したファイルを持っているにも関わらず、復号に失敗した時のエラーメッセージ例を以下にします。
パスワードを間違えた場合は、以下のようにError in vault password promptエラーが出力されます。
$ ansible-playbook --ask-vault-pass playbook.yml
Vault password:
[WARNING]: Error in vault password prompt (default): Invalid vault password was provided
暗号化したにも関わらず'--ask-vault-pass'オプションをつけ忘れた時は、復号化を試みたがsecretが無いというエラーが出力されます。
$ ansible-playbook playbook.yml
ERROR! Attempting to decrypt but no vault secrets found
CIを使って自動化したい場合
CIで実行するなど非対話での実行が必要な場合は、パスワードを別ファイルに書いておき、--vault-password-fileオプションを使って指定することも可能です。
$ ansible-playbook --vault-password-file vault-password.txt
指定するファイルに実行許可をつけておくと、ansible-playbookはこのコマンドを実行し、標準出力の内容をパスワードとみなします。
$ chmod o+x password.sh
$ ansible-playbook --vault-password-file password.sh
ansible-vault encryptの内容を復号化する
機密情報を追記や更新したい場合は、ansible-vault view
で復号化したテキストを取り出すことができます
$ ansible-vault view credentials.yml
Vault password:
db_user: sakila
db_password: passw0rd
パスワードを変更する
ansible-vault encryptで暗号化したファイルのパスワードを変えたい場合は一旦復号化してから別のパスワードで暗号化しなおしても良いのですが、ansible-vault rekey
コマンドを使うことでパスワードの変更も行えます。
One thought on “Ansibleでパスワードなどの機密情報を暗号化して管理する”