Как мне получить переменную с именем пользователя, который запускает ansible?

Я пишу сценарий процесса развертывания, который берет имя пользователя, запускающего сценарий ansible (например, tlau), и создает каталог развертывания в удаленной системе на основе этого имени пользователя и текущей даты / времени (например, tlau-deploy-2014-10 -15-16: 52).

Вы могли бы подумать, что это доступно в доступных фактах (например, LOGNAME или SUDO_USER), но все они имеют значение «root» или идентификатор развертывания, используемый для ssh в удаленной системе. Ни один из них не содержит локального пользователя, который в настоящее время запускает доступный процесс.

Как я могу получить сценарий для получения имени пользователя, запускающего доступный процесс, и использовать его в своей книге?


person Tessa Lau    schedule 15.10.2014    source источник


Ответы (6)


Если вы имеете в виду имя пользователя в хост-системе, есть два варианта:

Вы можете запустить локальное действие (которое выполняется на хост-машине, а не на целевой машине):

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

- debug: var=username_on_the_host

В этом примере вывод команды whoami зарегистрирован в переменной с именем username_on_the_host, а имя пользователя будет содержаться в username_on_the_host.stdout.

(задача отладки здесь не требуется, она просто демонстрирует содержимое переменной)


Второй вариант - использовать плагин поиска:

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

Прочтите о подключаемых модулях поиска здесь: docs.ansible.com/ansible/playbooks_lookups.html

person Ramon de la Fuente    schedule 16.10.2014
comment
установите sudo: no, чтобы убедиться, что он не пытается выполнить sudo перед запуском local_action - person drs; 02.02.2016
comment
в ansible 2.0 это будет become: no или become: false. Но в остальном хороший совет, спасибо! - person Ramon de la Fuente; 04.02.2016
comment
Есть ли способ избежать changed=1? Кроме того, можно ли использовать делегирование фактов? - person nponeccop; 12.03.2016
comment
Конечно, есть, используйте change_when: False (docs.ansible.com/ansible /) - person Ramon de la Fuente; 12.03.2016
comment
Примечательно, что переменная изменения changed_when, а не change_when. Просто меня это укусило. - person abegosum; 26.10.2017
comment
Имя пользователя в локальной системе не обязательно совпадает с именем в удаленной системе. Его можно изменить в конфигурации SSH. Так что лучше запустить whoami в удаленной системе. - person ceving; 18.11.2019

Если вы gather_facts, который включен по умолчанию для playbooks, будет установлена ​​встроенная переменная с именем ansible_user_id, которая предоставляет имя пользователя, от имени которого выполняются задачи. Затем вы можете использовать эту переменную в других задачах или шаблонах с {{ ansible_user_id }}. Это избавит вас от необходимости запускать задачу по регистрации этой переменной.

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

person Tony Cesaro    schedule 06.11.2014
comment
Для будущих ссылок это возвращает имя пользователя на управляемой машине, то же самое, что и remote_user, а не имя пользователя на хост-машине. Чтобы получить имя пользователя на хост-машине, я не вижу альтернативы local_action, как объяснил @Ramon. - person astorije; 11.03.2015
comment
Альтернативой поиску пользователя на локальном хосте, на котором запущен ansible, является использование поиска: {{lookup ('env', 'USER')}} docs.ansible.com/ansible/playbooks_lookups.html - person Budric; 17.03.2016
comment
@Budric На мой взгляд, это следует опубликовать как ответ - person 030; 19.07.2016
comment
Однако {{ansible_user_id}} становится root, если вы become:yes - person Stephen Ostermiller; 08.08.2017
comment
В Ansible 2.8.3 ansible_user_id не, похоже, оказывается root даже с become: yes. - person David Oliver; 14.08.2019
comment
Это зависит от того, с каким пользователем был запущен модуль setup. Системные факты собираются в начале. Если исходный пользователь был root и был запущен gather_facts, это будет root. Если первоначальный пользователь был joe, это будет joe. Не имеет значения, был ли become включен / выключен в задаче, в которой используется факт. - person udondan; 08.09.2019
comment
В моем тестировании (Ansible 2.8.5) установка become: yes на уровне playbook делает ansible_user_id root, даже если задача имеет become: no. Единственный надежный способ получить настоящее имя пользователя, который я нашел, - это поиск env, как в комментарии @ Budric выше. - person cfiske; 26.09.2019

Я помещаю во все шаблоны что-то вроде следующего:

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

При создании шаблона он отображается как:

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

Если я использую {{ ansible_user_id }} и стал пользователем root, тогда эта переменная указывает на «root», а не на то, что я хочу большую часть времени.

person staylorx    schedule 11.01.2017
comment
Вы также можете добавить этот поиск в переменную в начале playbook в разделе vars. Как это: `` `- hosts: xxx gather_facts: no vars: user: {{lookup ('env', 'USER')}}` `` - person Bludwarf; 31.07.2017
comment
вы можете использовать фильтр комментариев jinja2 и переменную ansible_managed, описанную в документации docs.ansible.com/ansible/latest/ (поиск ansible_managed) - person dtrv; 11.01.2018

Это считывает имя пользователя из удаленной системы, поскольку не гарантируется, что имена пользователей в локальной и удаленной системе совпадают. Имя можно изменить в конфигурации 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 }}"
person ceving    schedule 18.11.2019

если вы хотите получить пользователя, который запускает шаблон в ansible tower, вы можете использовать эту переменную {{tower_user_name}} в своей playbook, но она определяется только при выполнении вручную

tower_user_name: имя пользователя Tower, запустившего это задание. Это недоступно для обратного вызова или запланированных заданий.

проверьте эти документы https://docs.ansible.com/ansible-tower/latest/html/userguide/job_templates.html

person Diego Fernando Zapata Munoz    schedule 23.12.2020

Кажется, это работает для меня (доступный 2.9.12):

- name: get the non root remote user
  set_fact:
    remote_regular_user: "{{ ansible_env.SUDO_USER or ansible_user_id }}"

Вы также можете просто установить это как переменную - например, в вашем group_vars/all.yml:

remote_regular_user: "{{ ansible_env.SUDO_USER or ansible_user_id }}"
person tshalif    schedule 08.05.2021