web-dev-qa-db-ja.com

Ansible Become_Userがパスを正しく取得しない

これが私が問題だと思うことを示すコードです:

# Debugging path problems with Sudo
---
- hosts: webservers
  remote_user: root
  tasks:
  - name: echo path
    command: echo $PATH
    register: output
    changed_when: False

  - name: display root path output
    debug: "msg={{ output.stdout }}"

  # Now try as Apache
  - name: echo path
    command: echo $PATH
    become: true
    become_user: Apache
    become_method: Sudo
    register: output
    changed_when: False

  - name: display wrong output
    debug: "msg={{ output.stdout }}"

  # This is the fix
  - name: echo path
    command: echo $PATH
    environment:
      PATH: "{{ ansible_env.PATH }}"
    become: true
    become_user: Apache
    become_method: Sudo
    register: output
    changed_when: False

  - name: display fixed output
    debug: "msg={{ output.stdout }}"

これが出力です。「修正」を追加しないとパスが完全でないことがわかります。

TASK [echo path] ***************************************************************
ok: [webapp]

TASK [display root path output] ************************************************
ok: [webapp] => {
    "changed": false, 
    "msg": "/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
}

TASK [echo path] ***************************************************************
ok: [webapp]

TASK [display wrong output] ****************************************************
ok: [webapp] => {
    "changed": false, 
    "msg": "/sbin:/bin:/usr/sbin:/usr/bin"
}

TASK [echo path] ***************************************************************
ok: [webapp]

TASK [display fixed output] ****************************************************
ok: [webapp] => {
    "changed": false, 
    "msg": "/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
}

なぜこの修正が必要なのですか、これはバグですか?

これはCentOS 6.7にあり、Ansible 2.0を使用しています

5
Joshua Grigonis

これは正常で予想される動作です。

Sudoは、ユーザーを切り替えるときに環境をサニタイズすることを忘れないでください。そのため、最小限のデフォルトPATHが作成されます。

PATHの残りの項目は、シェル起動スクリプトからのものであり、対話型シェルまたはログインシェルを要求しないため、(またはAnsible)が_Sudo <command>_を呼び出したときに実行されません。

デフォルトの場所にないコマンドを実行する必要がある場合は、そのパスを明示的に指定してください。

5
Michael Hampton