Wie erhalte ich in ansible eine Variable mit dem Namen des Benutzers, der ansible ausführt?

80

Ich schreibe ein Skript für einen Bereitstellungsprozess, der den Namen des Benutzers verwendet, der das ansible-Skript ausführt (z. B. tlau) und ein Bereitstellungsverzeichnis auf dem Remote-System basierend auf diesem Benutzernamen und dem aktuellen Datum / der aktuellen Uhrzeit erstellt (z. B. tlau-deploy-2014-10) -15-16: 52).

Sie würden denken, dass dies in ansible Fakten verfügbar ist (z. B. LOGNAME oder SUDO_USER), aber diese sind alle entweder auf "root" oder auf die Bereitstellungs-ID eingestellt, die zum SSH in das Remote-System verwendet wird. Keiner von diesen enthält den lokalen Benutzer, der gerade den ansible-Prozess ausführt.

Wie kann ich den Namen des Benutzers, der den Ansible-Prozess ausführt, per Skript abrufen und in meinem Playbook verwenden?

Tessa Lau
quelle

Antworten:

71

Wenn Sie den Benutzernamen auf dem Hostsystem meinen, gibt es zwei Möglichkeiten:

Sie können eine lokale Aktion ausführen (die auf dem Hostcomputer und nicht auf dem Zielcomputer ausgeführt wird):

- name: get the username running the deploy
  become: false
  local_action: command whoami
  register: username_on_the_host

- debug: var=username_on_the_host

In diesem Beispiel wird die Ausgabe des whoamiBefehls in einer Variablen namens "username_on_the_host" registriert, und der Benutzername wird in enthalten sein username_on_the_host.stdout.

(Die Debug-Aufgabe ist hier nicht erforderlich, sondern zeigt nur den Inhalt der Variablen.)


Die zweite Möglichkeit besteht darin, ein "Lookup-Plugin" zu verwenden:

{{ lookup('env', 'USER') }}

Weitere Informationen zu Lookup-Plugins finden Sie hier: docs.ansible.com/ansible/playbooks_lookups.html

Ramon de la Fuente
quelle
1
Satz sudo: noum sicherzustellen , dass es nicht vor dem Ausführen von sudo nicht versuchen , dielocal_action
drs
1
in ansible 2.0 wäre das become: nooder become: false. Aber sonst ein guter Tipp, danke!
Ramon de la Fuente
Gibt es einen Weg zu vermeiden changed=1? Kann auch eine Faktendelegation verwendet werden?
Nponeccop
Sicher gibt es, verwenden Sie change_when: False ( docs.ansible.com/ansible/… )
Ramon de la Fuente
3
Insbesondere ist die Änderungsvariable changed_whennicht change_when. Ich bin gerade dabei geworden.
Abegosum
115

Wenn Sie gather_facts, die standardmäßig für Playbooks aktiviert ist, eine integrierte Variable namens set verwenden ansible_user_id, die den Benutzernamen angibt, unter dem die Aufgaben ausgeführt werden. Sie können diese Variable dann in anderen Aufgaben oder Vorlagen mit verwenden {{ ansible_user_id }}. Dies würde Ihnen den Schritt ersparen, eine Aufgabe zum Registrieren dieser Variablen auszuführen.

Siehe: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variables-discovered-from-systems-facts

Tony Cesaro
quelle
21
Für zukünftige Verweise gibt dies den Namen des Benutzers auf dem verwalteten Computer zurück, auch bekannt als der remote_user, nicht den Benutzer auf dem Hostcomputer. Um den Benutzernamen auf dem Host-Computer local_actionabzurufen , sehe ich keine Alternative zu a, wie von @Ramon erläutert.
Astorije
41
Eine Alternative zum Nachschlagen des Benutzers auf localhost, auf dem ansible ausgeführt wird, ist die Verwendung von lookup: {{lookup ('env', 'USER')}} docs.ansible.com/ansible/playbooks_lookups.html
Budric
10
@Budric Meiner Meinung nach sollte dies als Antwort gepostet werden
030
14
Allerdings {{ansible_user_id}}wird "Wurzel", wenn Siebecome:yes
Stephen Ostermiller
5
In Ansible 2.8.3 ansible_user_idscheint es nicht einmal mit root zu sein become: yes.
David Oliver
50

Ich habe in allen Vorlagen Folgendes eingefügt:

# Placed here by {{ lookup('env','USER') }} using Ansible, {{ ansible_date_time.date }}.

Wenn die Vorlage angezeigt wird, wird Folgendes angezeigt:

# Placed here by staylorx using Ansible, 2017-01-11.

Wenn ich {{ ansible_user_id }}root verwende und root geworden bin, gibt diese Variable "root" an, nicht das, was ich die meiste Zeit möchte.

Staylorx
quelle
Sie können diese Suche auch in einer Variablen am Anfang des Playbooks in einem varsAbschnitt hinzufügen . So: `` `- hosts: xxx collect_facts: no vars: user:" {{lookup ('env', 'USER')}} "` ``
Bludwarf
Sie können den jinja2-Kommentarfilter und die Variable ansible_managed verwenden, die in der Dokumentation docs.ansible.com/ansible/latest/… (Suche nach ansible_managed) beschrieben ist
dtrv
2

Dadurch wird der Benutzername vom Remote-System gelesen, da nicht garantiert werden kann, dass die Benutzernamen auf dem lokalen und dem Remote-System identisch sind. Es ist möglich, den Namen in der SSH-Konfiguration zu ändern.

- name: Run whoami without become.
  command: whoami
  changed_when: false
  become: false
  register: whoami

- name: Set a fact with the user name.
  set_fact:
    login_user: "{{ whoami.stdout }}"
ceving
quelle