Ansibleでのパスワードの取り扱い
Ansibleでインストール時に登録するパスワードや、ユーザのパスワードを管理したいことがあると思います。
以前の記事から、運用上少し変更したものになります。
以前の方法
以前、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