ansible-vault とは
ansible-vault は、 Ansible の Playbook の内容を暗号化・復号化するためのコマンドです。
利用場面
サーバー設定を行う Ansible Playbook の中身には、データベース接続時のパスワードや SSH の秘密鍵など、秘匿しておきたい情報もたいてい含まれています。
こういった公開すべきでない情報については、 ansible-vault を用いて暗号化しておきましょう。
暗号化
ファイルを暗号化するには、 ansible-vault encrypt を使います。
以下は、ローカルから対象サーバーにコピーする SSH 秘密鍵ファイルを暗号化する例です。
- name: copy ssh key
copy: src=home/foobar/id_rsa dest=/home/foobar/.ssh/id_rsa owner=foobar group=foobar mode=0600
$ ansible-vault encrypt roles/server01/files/home/foobar/ssh/id_rsa
New Vault password:
Confirm New Vault password:
Encryption successful
$
こうやって暗号化した状態で Playbook 一式を保存します。
復号化
一方、復号化する場合は、 ansible-vault decrypt を使います。
$ ansible-vault decrypt roles/server01/files/home/foobar/ssh/id_rsa
Vault password:
Decryption successful
Playbook の実行
Playbook を実行するときは、 --vault-password-file オプションか、 --ask-vault-pass オプションをつけます。つけないと、以下のように ansible-vault で暗号化したファイルが復号化できず、エラーとなります。
TASK [server01 : copy ssh key] ********************************************
fatal: [server01]: FAILED! => {"msg": "A vault password or secret must be specified to decrypt /home/foobar/ansible/roles/server01/files/home/foovar/id_rsa"}
--vault-password-file オプションの場合は、 --vault-password-file=~/.vault-password
といったようにパスワードを記述したファイルのパスを指定します。
$ ansible-playbook -i aws_ec2.yml server01.yml --ask-vault-pass=~/.vault-password
--ask-vault-pass オプションの場合は、 Playbook 実行時に対話的にパスワードを入力します。
$ ansible-playbook -i aws_ec2.yml server01.yml --ask-vault-pass
Vault password:
グッドプラクティス
パスワードなどの暗号化したい変数を一つの変数ファイルにまとめてタスクの初めの方で (always タグを付けて) 必ず読み込むようにするとよいでしょう。
---
- include_vars: secret.yml # パスワードなど暗号化したい変数をまとめた変数ファイル
tags:
- always