2014-10-15 19 views
30

Sto eseguendo lo scripting di un processo di distribuzione che prende il nome dell'utente che esegue lo script ansible (ad es. Tlau) e crea una directory di distribuzione sul sistema remoto in base a tale nome utente e alla data/ora corrente (ad esempio tlau-deploy-2014 -10-15-16: 52).In ansible, come posso ottenere una variabile con il nome dell'utente che sta eseguendo l'ansible?

Si potrebbe pensare che questo sia disponibile in fatti ansibili (ad esempio LOGNAME o SUDO_USER), ma quelli sono tutti impostati su "root" o l'ID di distribuzione utilizzato per ssh nel sistema remoto. Nessuno di questi contiene l'utente locale, quello che sta attualmente eseguendo il processo ansible.

Come posso scrivere il nome dell'utente che esegue il processo ansible e usarlo nel mio playbook?

risposta

36

Se si intende il nome utente sul sistema host, immagino si potrebbe semplicemente eseguire un'azione locale:

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

- debug: var=username_on_the_host 

In questo esempio, l'output del comando whoami è registrato in una variabile chiamata "username_on_the_host" e il nome utente sarà contenuto in username_on_the_host.stdout.

(l'operazione di debug non è necessario qui, solo dimostra il contenuto della variabile)

+1

Grazie! Questo ha funzionato per me: https://gist.github.com/tlau/6f14fe089f2782fe7afa –

+1

impostare 'sudo: no' per assicurarsi che non provi a sudo prima di eseguire il' local_action' – drs

+1

in ansible 2.0, che sarebbe ' diventare: no' o 'diventare: false'. Ma per il resto un buon consiglio, grazie! –

39

Se gather_facts, che viene attivata per impostazione predefinita per Playbook, v'è una variabile incorporata che viene impostata chiamato ansible_user_id che fornisce all'utente che le attività vengono eseguite come. È quindi possibile utilizzare questa variabile in altre attività o modelli con {{ ansible_user_id }}. Ciò farebbe risparmiare il passo dell'esecuzione di un'attività per registrare tale variabile.

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

+11

Per riferimenti futuri, restituisce il nome dell'utente sulla macchina gestita allo stesso modo di 'remote_user', non dell'utente sul computer host. Per ottenere il nome utente sul computer host, non vedo un'alternativa a un 'local_action' come spiegato da @Ramon. – astorije

+22

Un'alternativa per cercare l'utente su localhost che esegue ansible è utilizzare la ricerca: {{lookup ('env', 'USER')}} http://docs.ansible.com/ansible/playbooks_lookups.html – Budric

+7

@Budric Nel mio opinione questa dovrebbe essere postata come risposta – 030

13

ho messo qualcosa di simile a quanto segue in tutti i modelli:

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

Quando templato su di esso si presenta come:

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

se uso {{ ansible_user_id }} mi e' Sono diventato root quindi quella variabile indica "root", non quello che voglio la maggior parte del tempo.

+0

Puoi anche aggiungere questa ricerca in una var all'inizio del playbook in un 'vars 'sezione.Come questo: '' ' - padroni di casa: xxx gather_facts: no Vars: utente: "{{lookup ('env', 'UTENTE')}}" ' '' – Bludwarf

+0

è possibile utilizzare il commento Jinja2 filtro e la variabile ansible_managed che è descritta nella documentazione http://docs.ansible.com/ansible/latest/playbooks_filters.html#comment-filter (cerca ansible_managed) – dtrv