LoginSignup
6
7

More than 3 years have passed since last update.

AnsibleのVaultで暗号化されたファイルの管理

Last updated at Posted at 2018-11-03

はじめに

Ansibleで暗号化したい変数をどこのファイルにどうやって管理すればいいか、自分の状況にあわせまとめてみました。

Ansible公式ドキュメントのベストプラクティスにある「Variables and Vaults」をベースにしています。

Best Practices — Ansible Documentation

背景

  • ansibleのroleやplaybook(group_varsなど)をgitでソース管理中。
  • varsやインベントリに登録しているbecome_passやDB系のパスワードはさすがに平文でgitに上げるのはまずい。
  • 少し調べてみるとAnsible-Vaultを使えば暗号化はできることはわかった。
  • だけど、今のgit管理上どこのファイルを暗号化かけて管理しようか…という悩み発生。

ということで、Vaultで暗号化されたファイルの管理について、簡単に調べてみました。

変更前の構成

ansibleの構成は、以下のようにansibleベストプラクティスに沿ったような構成で、下記のディレクトリ群をgitで管理しています。(正確にはちょっと異なりますが、ベースはほぼ同じ)

production                # プロダクション用インベントリ
staging                   # ステージング用インベントリ

group_vars/
   webservers.yml         # webサーバ用vars
   dbservers.yml          # DBサーバ用vars
   production.yml         # プロダクション用vars
   staging.yml            # ステージング用vars
host_vars/
   hostname1.yml          # host別vars host_vars
   hostname2.yml

site.yml                  # マスター playbook
webservers.yml            # webサーバ用のplaybook
dbservers.yml             # dbサーバ用のplaybook

roles/                    # importするrole群を配置
  :

変更後の構成

★部分が変更した構成

production                # プロダクション用インベントリ
staging                   # ステージング用インベントリ
.vaultpass                # ★復号用パスワードファイル

group_vars/
   webservers.yml         # webサーバ用vars
   dbservers.yml          # DBサーバ用vars
  production/             # ★プロダクション用varsディレクトリ
    vars.yml              # ★プロダクション用vars
    vault.yml             # ★プロダクション用vars(暗号化対象)
  staging/                # ★ステージング用varsディレクトリ
    vars.yml              # ★ステージング用vars
    vault.yml             # ★ステージング用vars(暗号化対象)

host_vars/
   hostname1.yml          # host別vars host_vars
   hostname2.yml

site.yml                  # マスター playbook
webservers.yml            # webサーバ用のplaybook
dbservers.yml             # dbサーバ用のplaybook

roles/                    # importするrole群を配置
  :

説明

group_vars配下にあるファイルはベストプラクティスにあるとおり、以下のように普通のvarsファイルと暗号化されたvaultファイルに分割可能。
group_vars/group_dir/vars.yml
group_vars/group_dir/vault.yml

group_vars/webservers.ymlなども上記のように分割することは可能だけど、基本暗号化したいファイルはproductionに定義するルールにしたほうが、暗号化するファイルも少なく管理も楽と判断。

あとは、.vaultpassファイルに復号用のパスワードを記載し、基本「vault-password-file」オプションでplaybookの実行を行う。(自動化等を踏まえると「ask-vault-pass」オプションで毎回復号パスを入力するのはナンセンスなので)
ただし、.vaultpassファイルをgit登録してしまったら元も子もないので、gitignoreでちゃんと除外しておくこと。

暗号化やplaybook実行コマンド

.vaultpassファイル作成

cd {playbook格納ディレクトリ}
echo "{復号パスワード}" > .vaultpass

暗号化varsファイルの作成/編集

cd {playbook格納ディレクトリ}
ansible-vault create {暗号化varsファイル} --vault-password-file=.vaultpass
ansible-vault edit {暗号化varsファイル} --vault-password-file=.vaultpass

playbook実行時のコマンド(例)※

cd {playbook格納ディレクトリ}
ansible-playbook -i production site.yml --vault-password-file=.vaultpass

※playbook実行時にvault-password-fileオプションをつけるのが、なんとなく微妙なのでansible.cfg(もしくはinventry)にオプションを記載してもOK。

production
[vars:production]
vault_password_file=.vaultpass
ansible.cfg
[defaults]
vault_password_file=.vaultpass

以上です。


参考サイト
https://yukidarake.hateblo.jp/entry/2016/04/13/204409

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7