これが私が問題だと思うことを示すコードです:
# 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を使用しています
これは正常で予想される動作です。
Sudo
は、ユーザーを切り替えるときに環境をサニタイズすることを忘れないでください。そのため、最小限のデフォルトPATHが作成されます。
PATHの残りの項目は、シェル起動スクリプトからのものであり、対話型シェルまたはログインシェルを要求しないため、(またはAnsible)が_Sudo <command>
_を呼び出したときに実行されません。
デフォルトの場所にないコマンドを実行する必要がある場合は、そのパスを明示的に指定してください。