概要
検証の続き。
- Ansibleサーバのインストール
- Ansibleサーバにクライアントを設定
まで完了したので、Playbookを書いてみます。
Playbookサンプル
単純に、Webサーバ(apache2)を再起動するためのymlを書きます。
- WebRestart.yml
---
- name: Restart Apache2 Service
hosts: clients
become: yes
tasks:
- name: Restart Apache2
service:
name: apache2
state: restarted
Playbook実行失敗
- Playbook実行
ansible-playbook WebRestart.yml
- 実行結果抜粋
fatal: [IP]: FAILED! => {"ansible_facts": {}, "changed": false, "failed_modules": {"setup": {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"}, "failed": true, "module_stderr": "Shared connection to IP closed.\r\n", "module_stdout": "sudo: パスワードが必要です\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1, "warnings": ["Platform linux on host IP is using the discovered Python interpreter at /us
- サービス再起動のためには管理者権限が必要
- 管理者権限への昇格のためのパスワードが書かれていない
ため、この結果となりました。
回避策
- Ansibleのクライアントにrootログインする
- sudoの昇格時にパスワードを不要とする
の2つはセキュリティ的によろしくありません。
- Ansible Vaultで暗号化
は、暗号化→複合化の手間を伴います。そこで、単純に
ansible-playbook --ask-become-pass WebRestart.yml
とすることで、Playbook実行時にリモートホストのSudoパスワードを尋ねられるようになり、上記Playbookも正常に実行できました。
回避策の更に回避策
効率化を図るとはいえ、Playbook実行時に
ansible-playbook --ask-become-pass
とオプションをつけるのは面倒です。更に回避策を考えます。
Case1. セッション時のみ有効なエイリアスをつける
alias ansible-playbook='ansible-playbook --ask-become-pass'
を作業前に実行。これで、
ansible-playbook
と実行するだけで
ansible-playbook --ask-become-pass
が得られます。この方法は一回限り有効な手段。サーバの設定を余り変えたくないときに有効な手段です。
Case2. .bashrcにエイリアスを付与する。
echo "alias ansible-playbook='ansible-playbook --ask-become-pass'" | tee -a ~/.bashrc
source ~/.bashrc
Case1を永続的に付与する手法です。運用者での合意が取られているなら、メンテナンス的にも楽だと言うことでこの方法を採ります。