Ansible become_user 无法正确获取路径

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 }}"

这是输出,您可以看到,如果不添加“the fix”,路径就不完整。

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

答案1

这是正常且预期的行为。

请记住,sudo切换用户时会净化环境,这就是为什么您最终会得到最小默认 PATH。

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

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

相关内容