¿Cómo obtengo una variable con el nombre del usuario que ejecuta ansible?

80

Estoy escribiendo un proceso de implementación que toma el nombre del usuario que ejecuta el script ansible (por ejemplo, tlau) y crea un directorio de implementación en el sistema remoto basado en ese nombre de usuario y la fecha / hora actual (por ejemplo, tlau-deploy-2014-10 -15-16: 52).

Usted pensaría que esto está disponible en datos ansible (por ejemplo, LOGNAME o SUDO_USER), pero todos están configurados como "root" o la identificación de implementación que se usa para ssh en el sistema remoto. Ninguno de ellos contiene el usuario local, el que actualmente está ejecutando el proceso ansible.

¿Cómo puedo obtener un script para obtener el nombre del usuario que ejecuta el proceso ansible y usarlo en mi libro de jugadas?

Tessa Lau
fuente

Respuestas:

71

Si te refieres al nombre de usuario en el sistema host, hay dos opciones:

Puede ejecutar una acción local (que se ejecuta en la máquina host en lugar de la máquina de destino):

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

- debug: var=username_on_the_host

En este ejemplo, la salida del whoamicomando se registra en una variable llamada "username_on_the_host", y el nombre de usuario estará contenido en username_on_the_host.stdout.

(la tarea de depuración no es necesaria aquí, solo demuestra el contenido de la variable)


La segunda opción es utilizar un "complemento de búsqueda":

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

Lea acerca de los complementos de búsqueda aquí: docs.ansible.com/ansible/playbooks_lookups.html

Ramón de la Fuente
fuente
1
configurado sudo: nopara asegurarse de que no intente sudo antes de ejecutar ellocal_action
drs
1
en ansible 2.0, eso sería become: noo become: false. Pero por lo demás un buen consejo, ¡gracias!
Ramon de la Fuente
¿Hay alguna forma de evitarlo changed=1? Además, ¿se puede utilizar la delegación de hechos?
nponeccop
Claro que sí, usa change_when: False ( docs.ansible.com/ansible/… )
Ramon de la Fuente
3
En particular, la variable de cambio changed_whenno lo es change_when. Solo me mordió esto.
abegosum
116

Si usted gather_facts, que está habilitado de forma predeterminada para los libros de jugadas, hay una variable incorporada que se establece llamada ansible_user_idque proporciona el nombre de usuario con el que se ejecutan las tareas. Luego puede usar esta variable en otras tareas o plantillas con {{ ansible_user_id }}. Esto le ahorraría el paso de ejecutar una tarea para registrar esa variable.

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

Tony Cesaro
fuente
21
Para referencias futuras, esto devuelve el nombre del usuario en la máquina administrada también conocido como el remote_user, no el usuario en la máquina host. Para obtener el nombre de usuario en la máquina host, no veo una alternativa a local_actioncomo lo explica @Ramon.
astorije
41
Una alternativa para buscar al usuario en localhost que ejecuta ansible es usar lookup: {{lookup ('env', 'USER')}} docs.ansible.com/ansible/playbooks_lookups.html
Budric
10
@Budric En mi opinión, esto debería publicarse como respuesta
030
14
Sin embargo, {{ansible_user_id}}termina siendo "root" si ustedbecome:yes
Stephen Ostermiller
5
En Ansible 2.8.3, ansible_user_idno no parecen llegar a ser incluso con raíz become: yes.
David Oliver
51

Puse algo como lo siguiente en todas las plantillas:

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

Cuando se aplica una plantilla, aparece como:

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

Si uso {{ ansible_user_id }}y me he convertido en root, esa variable indica "root", no lo que quiero la mayor parte del tiempo.

Staylorx
fuente
También puede agregar esta búsqueda en una var al comienzo del libro de jugadas en una varssección. Así: `` `- hosts: xxx collect_facts: no vars: user:" {{lookup ('env', 'USER')}} "` ``
Bludwarf
puede usar el filtro de comentarios jinja2 y la variable ansible_managed que se describe en la documentación docs.ansible.com/ansible/latest/… (busque ansible_managed)
dtrv
3

Esto lee el nombre de usuario del sistema remoto, porque no se garantiza que los nombres de usuario en el sistema local y remoto sean los mismos. Es posible cambiar el nombre en la configuración 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
fuente
0

si desea obtener el usuario que ejecuta la plantilla en ansible tower, puede usar esta var {{tower_user_name}} en su libro de jugadas, pero solo se define en ejecuciones manuales

tower_user_name: el nombre de usuario del usuario de Tower que inició este trabajo. Esto no está disponible para devoluciones de llamada o trabajos programados.

consulte estos documentos https://docs.ansible.com/ansible-tower/latest/html/userguide/job_templates.html

Diego Fernando Zapata Muñoz
fuente