become - sudo / su

2019/04/30

Ansible

 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: latest

 su コマンドでユーザーアカウントを指定すると、そのユーザーになることができます。
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]$ 

カテゴリー

目次

QooQ