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


Вы также можете добавить этот поиск в переменную в начале 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 }}"

0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.