Edited at

Ansible Vault を試す

More than 3 years have passed since last update.

Ansible 1.5 が 2014/2/28 にリリースされました。

Ansible 1.5 Released

今回の目玉機能が Ansible Vault です。Git などにそのまま登録したくないパスワードやAWSなどのAPIキーなどを暗号化することができます。

ansible-vault コマンドが追加されました。


2015/5/12 追記

Ansible 1.8 で view サブコマンドが追加されています。

(その後 1.8.3 で view のためのテンポラリファイルの権限問題が修正されているので最新版を使いましょう)


それでは試してみます。


テスト用 Playbook の作成

ひとまず、暗号なしでテスト用 Playbook を作成します。


hosts

localhost ansible_connection=local



site.yml

---

- hosts: localhost
gather_facts: no
vars_files:
- private.yml
tasks:
- debug: msg="password = {{ password }}"


private.yml

---

password: 'hogehoge'


テスト用 Playbook の確認

$ ansible-playbook -i hosts site.yml 

PLAY [localhost] **************************************************************

TASK: [debug msg="password = hogehoge"] ***************************************
ok: [localhost] => {
"msg": "password = hogehoge"
}

PLAY RECAP ********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0

Playbook の動作確認はできました。


Vault で暗号化する

それでは、ansible-vault で private.yml を暗号化します。暗号化のためのパスワードの入力を求められます。

$ ansible-vault encrypt private.yml 

Vault password:
Confirm Vault password:
Encryption successful

暗号化された private.yml の中身は次のようになっています。cipher は今のところ AES (1.5.1でAES256になりました)だけっぽいですが、将来は選べるようになりそう。


private.yml

$ANSIBLE_VAULT;1.0;AES

53616c7465645f5fcc735bd59e5a55875bf96e5b184181ebc13c4ce1b6b813315fd7bfbe384038b1
4d93ece05905d8f9618080fb8e4f3ec04693e9592299f6347add4bf94e57e83d6615236a83dae0a9
5e4400964c944c90d99cba6bf587f168e4ab2dc0774e91b3beadf5c7160a9072


暗号化されたファイルを使った Playbook

ファイルを暗号化した場合、同じコマンドで Playbook を実行するとパスワードを指定しろというエラーで実行できません。

$ ansible-playbook -i hosts site.yml 

ERROR: A vault password must be specified to decrypt data

--ask-vault-pass でプロンプトを表示させるか --vault-password-file=VAULT_PASSWORD_FILE でパスワードの書かれたファイルを指定します。

$ ansible-playbook -i hosts site.yml --ask-vault-pass

Vault password:

PLAY [localhost] **************************************************************

TASK: [debug msg="password = hogehoge"] ***************************************
ok: [localhost] => {
"msg": "password = hogehoge"
}

PLAY RECAP ********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0

ひとつの Playbook 内で、複数の暗号化されたファイルを扱う場合、すべてのパスワードを同じに揃えておく必要があります。

ファイルをまるっと暗号化してしまうので、どんな変数が定義されているのかもわからなくなるのでちょっと不便な気もしますね。Jan-Piet Mens :: My thoughts on Ansible's vault


ansible-vault コマンド

ansible-vault コマンドには create, encrypt, decrypt, rekey, edit というサブコマンドがあります。


  • create


    • 新規に暗号化されたファイルを作成します



  • encrypt


    • 既存のファイルを暗号化します



  • decrypt


    • 暗号化されたファイルを復号化します



  • edit


    • 暗号化されたファイルをそのまま編集します



  • rekey


    • パスワードを変更します



  • view


    • 暗号化されたファイルを復号して PAGER で表示します



(「復号化します」っていう表現は正しいのだろうか?とか書きながら思った)


追記

Ansible Vault を賢く使う」も見てね