fragen stichworte

Ansibleame_user nimmt Pfad nicht richtig auf

Hier ist der Code, der meines Erachtens ein Problem darstellt:

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

Hier ist die Ausgabe. Sie können sehen, dass der Pfad nicht vollständig ist, ohne "den Fix" hinzuzufügen.

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

Warum ist diese Korrektur erforderlich? Ist dies ein Fehler?

Dies ist für CentOS 6.7 und die Verwendung von Ansible 2.0

antworten

Dies ist normales und erwartetes Verhalten.

Denken Sie daran, dass sudo beim Wechseln der Benutzer die Umgebung bereinigt, weshalb Sie am Ende einen minimalen Standard-PATH haben.

Der Rest der Einträge im PATH stammt von Shell-Startup-Skripts, die nicht ausgeführt werden, wenn Sie (oder besser gesagt, Ansible) sudo <command> aufrufen, da keine interaktive oder Login-Shell angefordert wird.

Wenn Sie einen Befehl ausführen müssen, der sich nicht an einem Standardspeicherort befindet, geben Sie seinen Pfad explizit an.