Sudo

Ansible become_user 沒有正確選擇路徑

  • November 16, 2015

這是顯示我認為存在問題的程式碼:

# 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 中的其餘項目來自 shell 啟動腳本,當您(或者更確切地說 Ansible)呼叫時不會執行這些腳本,sudo <command>因為它不要求互動式或登錄 shell。

如果您必須執行不在預設位置的命令,請明確提供其路徑。

引用自:https://serverfault.com/questions/734560