jimaoka blog

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

Ansibleでのパスワードの取り扱い

Ansibleでインストール時に登録するパスワードや、ユーザのパスワードを管理したいことがあると思います。

以前の記事から、運用上少し変更したものになります。

jimaoka.hatenablog.jp

以前の方法

以前、Ansible Vaultを使った際には、

1. role内のdefaults/main.ymlにデフォルトパスワードを定義する

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

2. private.ymlにパスワードを記載し、Ansible Vaultで暗号化する

### sudoパスワードとsmbのパスワード
% cat private.yml
---
ansible_sudo_pass: password
smb_pass: password
### private.ymlを暗号化
% ansible-vault encrypt private.yml
Vault password:
Confirm Vault password:
Encryption successful

3. private.ymlをextra_varsとして読み込む(defaultsを上書き)

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

4. private.ymlはgitで管理しない

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

という手順でパスワードを管理していました。

デフォルトパスワードは使わない?

使っている中でよく考えたら、

  • デフォルトパスワードでインストールすることはそうそうない
  • そもそもデフォルトパスワードを上げるのはどうなのか
  • 誤ってデフォルトパスワードでインストールされる危険性

という欠点があることに気づきました。

プロンプトでの入力

Ansibleには、ユーザの入力をプロンプトで受け付ける機能があります。

これを使うことで、定義されていない変数に依存せずroleを書くことが可能になります。

### プロンプトを使用したplaybook
% cat setup-smb.yml
---
- hosts smb
  vars_prompt:
    - name: samba_password
      prompt: Samba password      # プロンプト時に表示されるテキスト
      private: yes                # 入力値を画面に表示しない
      confirm: yes                # 2回入力で打ち間違いを防止する
      when: samba_password == null
  roles:
    - { role: samba, sudo: yes }

vars_promptを使用することで、samba_passwordが空の時だけプロンプトでユーザ入力を促してくれます。

### extra-varsを渡さない場合
% ansible-playbook -i hosts setup-smb.yml -K
SUDO password:
Samba password:
confirm Samba password: 
...
### extra-varsを渡した場合
% ansible-playbook -i hosts setup-smb.yml --extra-vars="@private.yml" --ask-vault-pass
Vault password:
...

まとめ

つまるところ、デフォルトパスワードを設定しておくか、プロンプトで入力するかの違いではありますが、個人的には

  • デフォルトパスワードをアップロードしなくて済む
  • デフォルトパスワードでインストールされることを防げる
  • プロンプトがめんどくさい場合はprivate.ymlを設定しよう

という理由でプロンプトで入力するほうが好きです。

追記
Qiitaの方にもうちょっときれいにまとめてあります qiita.com