Як отримати змінну з іменем користувача, який запускає ansible?


80

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

Ви можете подумати, що це доступно у відповідальних фактах (наприклад, LOGNAME або SUDO_USER), але всі вони мають значення "root" або ідентифікатор розгортання, який використовується для ssh у віддаленій системі. Жоден з них не містить локального користувача, того, хто зараз виконує процес ansible.

Як я можу створити сценарій для отримання імені користувача, який запускає процес ansible, і використати його в моїй книзі ігор?

Відповіді:


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щоб переконатись, що він не намагається local_action
судозувати

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, а не користувача на хост-машині. Щоб отримати ім'я користувача на хост-машині, я не бачу альтернативи local_actionяк пояснюється @Ramon.
astorije

41
Альтернативою пошуку користувача на локальному хості, що працює на Ansible, є використання пошуку: {{lookup ('env', 'USER')}} docs.ansible.com/ansible/playbooks_lookups.html
Будріч,

10
@Budric На мою думку, це слід розмістити як відповідь
030

14
Однак {{ansible_user_id}}закінчується тим, що ви "корінь", якщо виbecome:yes
Стівен Остерміллер

5
У Ansible 2.8.3, ansible_user_idздається, не закінчується root навіть 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", а не те, що я хочу більшу частину часу.


Ви також можете додати цей пошук у var на початку книги до varsрозділу. Ось так: `` - `` - hosts: xxx collect_facts: no vars: user: "{{lookup ('env', 'USER')}}" `` `
Bludwarf

Ви можете використовувати фільтр коментарів 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}} у своїй книзі ігор, але він визначається лише при виконанні вручну

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.