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

80

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

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

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

Тесса Лау
источник

Ответы:

71

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

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

- 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

Рамон де ла Фуэнте
источник
1
установите, sudo: noчтобы убедиться, что он не пытается выполнить sudo перед запускомlocal_action
drs
1
в ansible 2.0 это было бы become: noили become: false. Но в остальном хороший совет, спасибо!
Рамон де ла Фуэнте,
Есть ли способ избежать changed=1? Кроме того, можно ли использовать делегирование фактов?
nponeccop
Конечно, есть, используйте change_when: False ( docs.ansible.com/ansible/… )
Рамон де ла Фуэнте,
3
Примечательно, что переменная изменения - changed_whenнет change_when. Просто меня это укусило.
abegosum
116

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

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

Тони Чезаро
источник
21
Для будущих ссылок это возвращает имя пользователя на управляемой машине, то же самое, что и remote_userимя пользователя на хост-машине. Чтобы получить имя пользователя на хост-машине, я не вижу альтернативы a, local_actionкак объяснил @Ramon.
astorije
41
Альтернативой поиску пользователя на локальном хосте, на котором запущен ansible, является использование поиска: {{lookup ('env', 'USER')}} docs.ansible.com/ansible/playbooks_lookups.html
Budric
10
@Budric По моему мнению, это должно быть отправлено в качестве ответа
030,
14
Однако в {{ansible_user_id}}конечном итоге становится "root", если выbecome:yes
Стивен Остермиллер
5
В анзибль 2.8.3, ansible_user_idвовсе не кажется, в конечном итоге корень даже become: yes.
Дэвид Оливер,
51

Я помещаю во все шаблоны примерно следующее:

# 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», а не то, что я хочу большую часть времени.

Staylorx
источник
Вы также можете добавить этот поиск в переменную в начале playbook в varsразделе. Как это: `` `- hosts: xxx gather_facts: no vars: user:" {{lookup ('env', 'USER')}} "` `
Блудварф
вы можете использовать фильтр комментариев jinja2 и переменную ansible_managed, которые описаны в документации docs.ansible.com/ansible/latest/… (поиск ansible_managed)
dtrv
3

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

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

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

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

Диего Фернандо Сапата Муньос
источник