jimaoka blog

ライトなインフラエンジニアです

Ansible Vaultの使いかた

最近Ansibleでsudoパスワードやインストール時に登録するパスワードを管理したいことがあって調べてみたら、Ansible Vaultを使うとなにやら良さそうなので、使い方をまとめてみました。

Ansible Vault

基本的にパスワードの類はgitには上げないにしろ、平文でテキストに書かれているのはどうにも良くない感じがします。

例えば、Sambaのユーザパスワードとsudoのパスワードを変数として利用したいとします。

### sudoパスワードとsmbのパスワード
% cat private.yml
---
ansible_sudo_pass: password
smb_pass: password

これを暗号化して、実行時に変数として展開できるようにするのがAnsible Vaultです。

暗号化

まず、先ほどのprivate.ymlを暗号化します。

### private.ymlを暗号化
% ansible-vault encrypt private.yml
Vault password:
Confirm Vault password:
Encryption successful

暗号化のパスワードを聞かれるので入力すると、private.yml が下のような形で暗号化されています。

### 内容が暗号化されている
% cat private.yml
$ANSIBLE_VAULT;1.1;AES256
62396630653864666637656361363962393864313866363038306566386437303831323262663166
3262343264333631383539343965306630333061376263370a383532316534376135623538646266
65366662366138626536646365313166333463663434656264356566386335323030643038386234
3966333634333735360a623737373331666563663535613662373966363037666239653131393263
34666263326637353530353039393039353331386465323831343661653937323537306333613738
37303731363463336564313036613034633833313334333333393036343638316563343734316563
303934376237333261353930613339383661

ファイルを再度編集したい場合は、ansible-vault edit を使用します。

### ファイルを編集
% ansible-vault edit private.yml

また、ファイルを復号化したい場合は、ansible-vault decrypt を使用します。

### ファイルを復号化
% ansible-vault decrypt private.yml
### 元に戻っている
% cat private.yml
---
ansible_sudo_pass: password
smb_pass: password

実行

--ask-vault-pass をつけて実行すると、パスワードを聞かれるので入力すると、暗号化した変数が使用できます。

### 実行すると暗号化されたsmb_passが使用できる
% ansible-playbook -i hosts setup-smb.yml --ask-vault-pass
...
TASK: [smb | debug var=smb_pass] ********************************************
ok: [192.168.x.x] => {
    "var": {
        "smb_pass": "password"
    }
}
...

さらに、ansible.cfg に下記のように書いておくと --ask-vault-pass オプションを付けなくても聞いてくれるようになります。

### --ask-vault-passの省略
% cat ansible.cfg
[defaults]
ask_vault_pass = true

便利な使い方

ここでは、個人的に便利だと思っている使い方を紹介します。

gitにはパスワード関連のファイルを上げないのですが、role内でprivate.ymlをincludeしたりするとgitに上がっていないファイルに依存することになり、実行時にエラーになるので、なんか嫌な感じです。

---
### private.ymlは存在しない
- include_vars: private.yml
...

gitには上げない

まず、private.yml をgitに上げないようにします。

### .gitignoreで除外
% cat .gitignore
...
private.yml
...

パスワードのデフォルト値を設定

一旦 defaults にデフォルトのパスワードを設定します。

defaults は一番優先順位の低い定義場所なので、基本的に上書きされる変数を定義します。

参考: Ansibleの変数の優先度 - Qiita

### パスワードのデフォルト値を設定
% cat /role/samba/defaults/main.yml
---
smb_pass: passw0rd
...

外部変数として暗号化済みファイルを渡す

その後、実行時に private.yml を --extra-vars で渡します。

### --extra-varsで private.yml 内の変数を渡す
% ansible-playbook -i hosts setup-smb.yml --extra-vars="@private.yml"

これで、defaultsに記載されたパスワードを上書きすることが可能なので、パスワードをローカルで扱いつつ、roleをパスワードに依存させないことが可能です。

まとめ

パスワードを扱うときはAnsible Vaultを使うと何となく安心です。sudo_passも入れておくとvault-passとsudo_paasを両方聞かれなくていいと思います。

使いづらい点としては、暗号化した後に何の変数が入っているかわからない点です。

### 何が定義されているか分からない
% cat private.yml
$ANSIBLE_VAULT;1.1;AES256
62396630653864666637656361363962393864313866363038306566386437303831323262663166
3262343264333631383539343965306630333061376263370a383532316534376135623538646266
65366662366138626536646365313166333463663434656264356566386335323030643038386234
3966333634333735360a623737373331666563663535613662373966363037666239653131393263
34666263326637353530353039393039353331386465323831343661653937323537306333613738
37303731363463336564313036613034633833313334333333393036343638316563343734316563
303934376237333261353930613339383661

何か対策ができるか考えてみたいと思います。