¿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?

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


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


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.


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 }}"

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.