Ansible become_user 没有正确选择路径

Jos*_*nis 5 sudo path ansible

这是显示我认为有问题的代码:

# 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 }}"
Run Code Online (Sandbox Code Playgroud)

这是输出,您可以看到不添加“修复”的路径是不完整的。

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"
}
Run Code Online (Sandbox Code Playgroud)

为什么需要此修复程序,这是一个错误吗?

这是在 CentOS 6.7 上使用 Ansible 2.0

Mic*_*ton 5

这是正常和预期的行为。

请记住,sudo切换用户时会清理环境,这就是为什么您最终会使用最小的默认 PATH。

PATH 中的其余项目来自 shell 启动脚本,当您(或更确切地说 Ansible)调用 时,它们不会运行sudo <command>,因为它不要求交互式或登录 shell。

如果您必须运行不在默认位置的命令,请明确提供其路径。