Jak uzyskać zmienną z nazwą użytkownika uruchamiającego ansibl?

80

Tworzę skrypty procesu wdrażania, który przyjmuje nazwę użytkownika uruchamiającego skrypt ansible (np. Tlau) i tworzy katalog wdrożenia w systemie zdalnym na podstawie tej nazwy użytkownika i bieżącej daty / godziny (np. Tlau-deploy-2014-10 -15-16: 52).

Można by pomyśleć, że jest to dostępne w ansiblowych faktach (np. LOGNAME lub SUDO_USER), ale wszystkie są ustawione na „root” lub identyfikator wdrożenia używany do ssh w zdalnym systemie. Żaden z nich nie zawiera użytkownika lokalnego, który aktualnie uruchamia proces ansibla.

Jak mogę w skrypcie pobrać nazwę użytkownika uruchamiającego proces ansibla i użyć go w swoim playbooku?

Tessa Lau
źródło

Odpowiedzi:

72

Jeśli masz na myśli nazwę użytkownika w systemie hosta, istnieją dwie opcje:

Możesz uruchomić akcję lokalną (która działa na maszynie hosta, a nie na maszynie docelowej):

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

- debug: var=username_on_the_host

W tym przykładzie dane wyjściowe whoamipolecenia są rejestrowane w zmiennej o nazwie „nazwa_użytkownika_na_hoście”, a nazwa użytkownika będzie zawarta w username_on_the_host.stdout.

(zadanie debugowania nie jest tutaj wymagane, po prostu demonstruje zawartość zmiennej)


Drugą opcją jest użycie „wtyczki wyszukiwania”:

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

Przeczytaj o wtyczkach wyszukiwania tutaj: docs.ansible.com/ansible/playbooks_lookups.html

Ramon de la Fuente
źródło
1
ustaw, sudo: noaby upewnić się, że nie spróbuje sudo przed uruchomieniemlocal_action
drs
1
w ansiblu 2.0 byłoby to become: nolub become: false. Ale poza tym dobra wskazówka, dzięki!
Ramon de la Fuente
Czy jest sposób, aby tego uniknąć changed=1? Czy można również użyć delegowania faktów?
nponeccop
Jasne, użyj change_when: False ( docs.ansible.com/ansible/ ... )
Ramon de la Fuente
3
Warto zauważyć, że zmienna change changed_whennie change_when. Właśnie zostałem przez to ugryziony.
abegosum
116

Jeśli ty gather_facts, która jest domyślnie włączona dla elementów playbook, istnieje wbudowana zmienna o nazwie ansible_user_ido nazwie, która zawiera nazwę użytkownika, z którym wykonywane są zadania. Możesz następnie użyć tej zmiennej w innych zadaniach lub szablonach z{{ ansible_user_id }} . Oszczędziłoby to kroku uruchamiania zadania rejestracji tej zmiennej.

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

Tony Cesaro
źródło
21
Na potrzeby przyszłych odwołań zwraca to nazwę użytkownika na komputerze zarządzanym, czyli taką samą, jak nazwa użytkownika remote_user, a nie nazwę użytkownika na komputerze hosta. Aby uzyskać nazwę użytkownika na maszynie hosta, nie widzę alternatywy dla a, local_actionjak wyjaśniono przez @Ramon.
astorije
41
Alternatywą dla wyszukania użytkownika na hoście lokalnym, na którym działa ansible, jest użycie wyszukiwania: {{lookup ('env', 'USER')}} docs.ansible.com/ansible/playbooks_lookups.html
Budric
10
@Budric Moim zdaniem to powinno być opublikowane jako odpowiedź
030
14
Jednak {{ansible_user_id}}kończy się byciem "rootem", jeślibecome:yes
Stephen Ostermiller
5
W ansibl 2.8.3, ansible_user_idczy nie wydaje się skończyć się nawet z korzenia become: yes.
David Oliver
51

We wszystkich szablonach umieściłem coś takiego:

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

Po umieszczeniu na szablonie pojawia się jako:

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

Jeśli używam {{ ansible_user_id }}i zostanę rootem, wtedy ta zmienna wskazuje "root", a nie to, czego chcę przez większość czasu.

staylorx
źródło
Możesz również dodać to wyszukiwanie w zmiennej na początku podręcznika w varssekcji. W ten sposób: `` - hosts: xxx collect_facts: no vars: user: "{{lookup ('env', 'USER')}}" ``
Bludwarf
możesz użyć filtru komentarzy jinja2 i zmiennej ansible_managed, która jest opisana w dokumentacji docs.ansible.com/ansible/latest/ ... (szukaj ansible_managed)
dtrv
3

Powoduje to odczytanie nazwy użytkownika z systemu zdalnego, ponieważ nie gwarantuje się, że nazwy użytkowników w systemie lokalnym i zdalnym są takie same. Istnieje możliwość zmiany nazwy w konfiguracji SSH.

- 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
źródło
0

jeśli chcesz pozyskać użytkownika, który uruchamia szablon w wieży ansible, możesz użyć tej zmiennej {{tower_user_name}} w swoim playbooku, ale jest ona zdefiniowana tylko przy ręcznych wykonaniach

tower_user_name: nazwa użytkownika wieży, który rozpoczął to zadanie. Nie jest to dostępne w przypadku oddzwonienia ani zaplanowanych zadań.

sprawdź tę dokumentację https://docs.ansible.com/ansible-tower/latest/html/userguide/job_templates.html

Diego Fernando Zapata Munoz
źródło