Ansibleで特定のタスクをWindowsの別ユーザーで実行する

AnsibleでWindowsの設定をする場合、ある特定のタスクだけを別のWindowsユーザーで実行したい場合があります。その場合becomeを利用することで実現できます。なお、ansibleの変数の記述の仕方により以下の2パターンの動作になります。

  1. プレイブックの全タスクが指定したユーザーで実行される
  2. 特定のタスクのみが別ユーザーで実行される

プレイブックの中の特定のタスクのみを別ユーザーで実行する場合は2つ目の方法で変数の記述すれば良いですが、本稿ではの比較のために2パターンを記載しておきます。

1. プレイブックの全タスクが指定したユーザーで実行される

変数の記述

ansilbe_user: Administrator
ansible_password: xxxxxxx

ansible_become: yes
ansible_become_method: runas
ansible_become_user: testuser
ansible_become_password: yyyyyyy

playbookの記述

--- 
- name: change user
  hosts: windows_servers
 
  vars: 
## ユーザー情報の確認
    # becomeの指定なし
    - name: check user
      win_shell: whoami
      register: result

    - name: show result
      debug:
      msg: "{{ result.stdout }}"

    # becomeの指定あり
    - name: check user with become
      win_shell: whoami
      become: yes
      become_user: testuser
      register: whoami
      
   - name: show result
      debug:
      msg: "{{ result.stdout }}"

実行結果

以下のとおりbecomeを指定した場合も、指定しなかった場合も “ansible_become_user”で指定した “testuser” でコマンドが実行されているのが確認できます。

--- 
PLAY [change user
]

TASK [Gathering Facts]
ok: [TESTVM01]
 

TASK [check user]
changed: [TESTVM01]

TASK [show result]
ok: [TESTVM01]
 => {
    "msg": "TESTVM\\testuser\\r\n"
}

TASK [check user with become]
changed: [TESTVM01]

TASK [show result]
ok: [TESTVM01]
 => {
    "msg": "TESTVM\\testuser\\r\n"
}

2. 特定のタスクのみが別ユーザーで実行される

変数の記述

“ansible_become_method: runas” をvarsに追記してください。
(“ansible_become” は不要です。また “ansible_become” を利用しない場合、”ansible_become_user” と “ansible_become_password” は参照されないので、これも不要です。)

ansilbe_user: Administrator
ansible_password: xxxxxxx

ansible_become_method: runas

playbookの記述

playbook の中身は変えていません。

--- 
- name: change user
  hosts: windows_servers
 
  vars: 
## ユーザー情報の確認
    # becomeの指定なし
    - name: check user
      win_shell: whoami
      register: result

    - name: show result
      debug:
      msg: "{{ result.stdout }}"

    # becomeの指定あり
    - name: check user with become
      win_shell: whoami
      become: yes
      become_user: testuser
      register: whoami
      
   - name: show result
      debug:
      msg: "{{ result.stdout }}"

パターン2の場合は “become_user”に指定したユーザー のパスワードの指定は不要です。”ansilbe_user” で指定した “Administrator” で接続し、その後 “become_user” で指定した “testuser” としてコマンドを実行する動きになります。

実行結果

becomeを指定したタスクのみが別ユーザーで実行されるのが確認できます。

--- 
PLAY [change user
]

TASK [Gathering Facts]
ok: [TESTVM01]
 

TASK [check user]
changed: [TESTVM01]

TASK [show result]
ok: [TESTVM01]
 => {
    "msg": "TESTVM\\Administrator\\r\n"
}

TASK [check user with become]
changed: [TESTVM01]

TASK [show result]
ok: [TESTVM01]
 => {
    "msg": "TESTVM\\testuser\\r\n"
}

以上。

コメント