Ansible Documentation
Become機能
- 対象ホストにログインしたユーザーとは別のユーザーでモジュールを実行する(モジュールごとに指定が可能)
- 対象ホストにログインしたユーザーとは別のユーザーで play を実行する
sudo
yum モジュールなど root 権限が必要なモジュールを一般ユーザーアカウントで実行するとエラーメッセージ "You need to be root to perform this command." が表示されエラーになっています。エラーメッセージからも root で実行する必要があることがわかります。■ hosts.yml
all: hosts: node-c0706:■ host_vars/node-c0706.yml
ansible_host: 192.168.101.21 ansible_user: workman ansible_password: workman@node_c0706■ site.yml
--- - hosts: all gather_facts: no tasks: - name: Apache の最新バージョンをインストールする yum: name: httpd state: latest■実行結果
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml site.yml
PLAY [all] ****************************************************************************************
TASK [Apache の最新バージョンをインストールする] *******************************************************************
fatal: [node-c0706]: FAILED! => {"ansible_facts": {"pkg_mgr": "yum"}, "changed": true, "msg": "You need to be root to perform this command.\n", "rc": 1, "results": ["Loaded plugins: fastestmirror\n"]}
to retry, use: --limit @/home/ansibleman/ansible/site.retry
PLAY RECAP ****************************************************************************************
node-c0706 : ok=0 changed=0 unreachable=0 failed=1
[ansibleman@ansiblesv ansible]$
このような場合、モジュールに become: yes をつけることで、そのモジュールを root 権限で実行できます。これは sudo 付きでコマンドを実行する場合に相当します。
--- - hosts: all gather_facts: no tasks: - name: Apache の最新バージョンをインストールする yum: name: httpd state: latest become: yesモジュールに become: yes を付けたときの実行結果です。エラーが出ず、正常に実行されました。
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml site.yml
PLAY [all] ****************************************************************************************
TASK [Apache の最新バージョンをインストールする] *******************************************************************
changed: [node-c0706]
PLAY RECAP ****************************************************************************************
node-c0706 : ok=1 changed=1 unreachable=0 failed=0
[ansibleman@ansiblesv ansible]$
su
Linux では su (substitute user) コマンドで root になれます。[workman@node-c0706 ~]$ su
Password:
[root@node-c0706 workman]#
su コマンドで root になると明示的に終了しない限り、ずっと root のままです。 Ansible では targets セクションに become: yes を定義するとで play 全体を root 権限で実行できます。
--- - hosts: all gather_facts: no become: yes tasks: - name: Apache の最新バージョンをインストールする yum: name: httpd state: latestsu コマンドでユーザーアカウントを指定すると、そのユーザーになることができます。
workman@node-c0706 ~]$ su ultraman
Password:
[ultraman@node-c0706 workman]$ whoami
ultraman
[ultraman@node-c0706 workman]$
Ansible では become:yes と併用して become_user: ユーザーアカウント で同等のことが行えます。次の例は play 全体をユーザーアカウント ultraman で実行します。
--- - hosts: all gather_facts: no become: yes become_user: ultraman tasks: - name: スクリプトを実行する script: ./script.sh実行時に become_user: で指定したユーザーアカウントにパスワードの入力が必要な場合、ansible-playbook コマンドに -K または --ask-become-pass オプションを指定して実行します。
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml -K site.yml
SUDO password: ← ここでパスワードを入力する
PLAY [all] *****************************************************************************************
TASK [スクリプトを実行する] **********************************************************************************
changed: [node-c0706]
PLAY RECAP *****************************************************************************************
node-c0706 : ok=1 changed=1 unreachable=0 failed=0
[ansibleman@ansiblesv ansible]$