2014-10-15 27 views
30

Skryptuję proces wdrażania, który pobiera nazwę użytkownika uruchamiającego skrypt ansibli (np. Tlau) i tworzy katalog wdrażania w systemie zdalnym na podstawie tej nazwy użytkownika i bieżącej daty/czasu (np. Tlau-deploy-2014 -10-15-16: 52).W ansibla, w jaki sposób uzyskać zmienną o nazwie użytkownika uruchamiającego ansibl?

Można by pomyśleć, że jest to dostępne w faktach ansible (na przykład LOGNAME lub SUDO_USER), ale wszystkie są ustawione na "root" lub identyfikator wdrożenia używany do ssh w systemie zdalnym. Żaden z nich nie zawiera użytkownika lokalnego, który obecnie obsługuje proces ansibla.

W jaki sposób mogę uzyskać skrypt zawierający nazwę użytkownika uruchamiającego proces ansibli i użyć go w moim podręczniku?

Odpowiedz

36

Jeśli masz na myśli nazwę użytkownika w systemie hosta, wyobrażam sobie można po prostu uruchomić działania lokalne:

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

- debug: var=username_on_the_host 

W tym przykładzie, wyjście komendy whoami jest zarejestrowany w zmiennej o nazwie „username_on_the_host” , a nazwa użytkownika będzie zawarta w username_on_the_host.stdout.

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

+1

Dzięki! To działało dla mnie: https://gist.github.com/tlau/6f14fe089f2782fe7afa –

+1

ustaw 'sudo: no', aby upewnić się, że nie próbuje sudo przed uruchomieniem' local_action' – drs

+1

w ansible 2.0, który byłby ' stać się: nie "lub" stać się: fałszem ". Ale poza tym dobra wskazówka, dzięki! –

39

jeśli gather_facts, która jest domyślnie włączona dla playbooks, jest wbudowany w zmiennej, która jest ustawiona zwanego ansible_user_id zapewnia użytkownikowi, że zadania są uruchamiane jako. Następnie możesz użyć tej zmiennej w innych zadaniach lub szablonach z {{ ansible_user_id }}. Pozwoli to zaoszczędzić Ci kroku w uruchomieniu zadania rejestracji tej zmiennej.

Patrz: http://docs.ansible.com/playbooks_variables.html#information-discovered-from-systems-facts

+11

W przypadku przyszłych odwołań zwraca to nazwę użytkownika na zarządzanym komputerze, tak samo jak 'zdalny_użytkownik', a nie użytkownik na hoście. Aby uzyskać nazwę użytkownika na komputerze hosta, nie widzę alternatywy dla 'local_action', jak wyjaśniono przez @Ramon. – astorije

+22

Alternatywą dla wyszukiwania użytkownika na localhost z ansibli jest użycie odnośnika: {{lookup ('env', 'USER')}} http://docs.ansible.com/ansible/playbooks_lookups.html – Budric

+7

@Budric In my opinia ta powinna być opublikowana jako odpowiedź – 030

13

kładę coś jak następuje we wszystkich szablonach:

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

Kiedy matrycy nad nim pojawia się jako:

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

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

+0

Możesz również dodać to odnośnik w var na początku instrukcji w 'vars 'sekcja.Tak: '' ' - gospodarze: xxx gather_facts: brak Vars: Użytkownik: "{{lookup ('env', 'user')}}" ' '' – Bludwarf

+0

można użyć komentarz jinja2 filter i ansibli_managed zmienna opisana w dokumentacji http://docs.ansible.com/ansible/latest/playbooks_filters.html#comment-filter (search ansible_managed) – dtrv