どうも、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 で管理する場合のメモ」