どうも、cloudpack の やむを得ずシリーズをシリーズ化したい かっぱ (@inokara) です。

はじめに

前回、「やむを得ず AWS の Credential な情報を Chef で管理する場合のメモ」というのを書いた後、Chef と人気を二分する Ansible ではどのように書くのかしらと思って調べたら意外に簡単だったのでメモしておきます。

ちなみに、私は Chef 好き、Ansible 初心者(結局、全部初心者)です。

参考

いろいろ端折って

Chef で言うところの template について

簡単に扱うことが出来ました。
インベントリで指定する hosts ファイルに以下のように記述します。

[hoge]
node01

[hoge:vars]
key = AKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
sec_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

上記のように書いておいて Playbook は以下のように書いておきます。

- hosts: hoge
  tasks:
    - template: src=templates/hoge.j2 dest=/tmp/hoge.txt owner=root group=root mode=0644

そして、template ディレクトリを作成し配下に hoge.j2 というファイル名で以下のようなテンプレートファイルを起きます。

key = {{key}}
sec_key = {{sec_key}}

これで ansible-playbook コマンドを実行して収束させてみます。

% ansible-playbook -i ./hosts ./simple-playbook.yml -u root -k

以下のように出力されます。

% ansible-playbook -i ./hosts ./simple-playbook.yml -u root -k                                                                                            [~/Dropbox/dev/ansible]
SSH password:

PLAY [hoge] *******************************************************************

GATHERING FACTS ***************************************************************
ok: [node1]

TASK: [template src=templates/hoge.j2 dest=/tmp/hoge.txt owner=root group=root mode=0644] ***
changed: [node1]

PLAY RECAP ********************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0

実際にリモートホストの /tmp/hoge.txt を見ると…

% ansible -i ./hosts node1 -m command -a "cat /tmp/hoge.txt" -uroot -k
SSH password:
node1 | success | rc=0 >>
key = AKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
sec_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

せっかくツールでファイルを設置したのに確認する為に SSH でログインしていたら負けですので command モジュールで確認します。
ちゃんとファイルが展開されていますね。

まさに Chef で言う template 的な動きではないでしょうか。

ただ…

いかんせん

肝心のアクセスキーやシークレットアクセスキーが平文でインベントリファイルに残っていますよね….

出来るだけ暗号化

ということで、ansible-vault というツールを使ってアクセスキーやシークレットアクセスキーを暗号化して保管しておきましょう。暗号化して保管しておいてリモートのホストに適用時のみ暗号を解いて template で指定したファイルに展開出来るようにしたいと思います。

vars_files への切り出し

インベントリファイルに直書きしていた鍵の情報を key.yml というファイルに書き出します。

---
key: 'AKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
sec_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

YAML の形式で書き(コピペ)だしておきます。

ansible-vault による暗号化

そして、ココから今回のキモです。
以下のように実行して作成した key.yml を暗号化してしまいます。

ansible-vault encrypt key.yml

以下のように暗号化パスワードを入力して暗号化します。

% ansible-vault encrypt key.yml
Vault password:
Confirm Vault password:
Encryption successful

暗号化したファイルの中身は下記のような中身です。

$ANSIBLE_VAULT;1.1;AES256
32353135643832303538376565366461383863363333656465633566653631383361313664646265
3539366534336663623636646364323337393661373432630a396366396565356135626564336564
65356361316661383763653939346662376465656134636139306435643038363038373338306165
6533613734366562610a373034373762656265306230376465613636643035373439666538323566
31653538366663633830373366623835313165376534376265353532396163303532383230363232
39656632636135323835626265396163636532666230626134623531363230373263633962323066
37646237373436383938623532356132396664646137326331613130343734343635666532373063
34316462633166663566623762636533333133316631343431663062303366316233623063613263
31376232613637396361366265323661383837353764303737316239363337613839

おお、ランダム(マンダム)…(ラムダコリャ)

Playbook の修正

そして、以下のように Playbook を修正しておきます。

---
- hosts: hoge
  gather_facts: no
  vars_files:
    - key.yml
  tasks:
    - template: src=templates/hoge.j2 dest=/tmp/hoge.txt owner=root group=root mode=0644

テンプレートファイルには手を触れません。

改めて適用

改めて ansible-playbook を実行して収束させます。

% ansible-playbook -i ./hosts ./simple-playbook.yml -u root -k --ask-vault-pass
SSH password:(SSH パスワード)
Vault password:(暗号化した際に利用したパスワード)

PLAY [hoge] *******************************************************************

TASK: [template src=templates/hoge.j2 dest=/tmp/hoge.txt owner=root group=root mode=0644] ***
changed: [node1]

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

新たに --ask-vault-pass というオプションを付加しています。これが暗号化したファイルを展開する為のパスワード(暗号化時に入力したパスワード)を入力します。

確認してみます。

% ansible -i ./hosts node1 -m command -a "cat /tmp/hoge.txt" -uroot -k
SSH password:
node1 | success | rc=0 >>
key = AKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
sec_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

おお、ちゃんと展開出来ているようです。

ということで…

Ansible でも Chef の Encrypted Data Bags 的なことが簡単に実現することが出来ました。これで Chef でも Ansible でもそこそこ安全に AWS の Credential な情報を扱うことが出来そうです。

ということで、そろそろ眠いので寝ます。

元記事はこちらです。
やむを得ず AWS の Credential な情報を Ansible で管理する場合のメモ