Як переключити користувача на завдання чи набір завдань?


160

Повторною темою, що є в моїх відповідальних ігрових книгах, є те, що я часто повинен виконувати команду з привілеями sudo ( sudo: yes), тому що я хотів би це зробити для певного користувача. В ідеалі я б краще скористатися sudo, щоб перейти до цього користувача та виконувати команди нормально. Тому що тоді мені не доведеться робити чисті звичайні команди, такі як каталоги на заглушення. Ось фрагмент однієї з моїх ігрових книжок:

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
- name: change perms
  file: dest={{ dst }} state=directory mode=0755 owner=some_user
  sudo: yes

В ідеалі я міг би виконувати команди або набори команд як інший користувач, навіть якщо для цього потрібен sudo-su для цього користувача.

Відповіді:


241

З Ansible 1.9 або пізнішої версії

Анзібль використовує become, become_userі become_methodдирективи для досягнення привілеїв. Ви можете застосувати їх до цілої п’єси чи ігрової книги, встановити їх у включену програму чи встановити їх для певного завдання.

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  become: yes
  become_user: some_user

Ви можете become_withвказати, як досягається ескалація привілеїв, за замовчуванням sudo.

Директива діє для області блоку, в якому вона використовується ( приклади ).

Детальнішу документацію див. У " Хости та користувачі" для додаткових прикладів та станьте (Привілейована ескалація) .

На додаток до задач becomeта become_userдиректив, Ansible 1.9 додав нові змінні та параметри командного рядка для встановлення цих значень протягом тривалості відтворення за відсутності явних директив:

Відповідно до Ansible 2.0.2.0, старий sudo/ sudo_userсинтаксис, описаний нижче, все ще працює, але в повідомленні про депрекацію зазначено: "Ця функція буде видалена в майбутньому випуску."


Попередній синтаксис, застарілий з відповіді 1.9 та призначений для видалення:

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
  sudo_user: some_user

4
Щоб вказати sudo_user зі змінної, використовуйте лапки навколо шаблону змінної, наприклад цього - sudo_user: "{{ ansible_ssh_user }}"або ви отримаєте помилку синтаксису yaml.
Sumeet Pareek

Хороший улов. Я намагався якомога ближче узгодити формулювання проблеми ОП, але я згоден, що використання змінної інтерполяції буде найбільш поширеним вибором.
Бретт

5
З Ansible 1.9 це becomeсистема замість "sudo *".
AndiDog

2
Синтаксис 1.9+ для "стати" є правильним. Ви також можете перевірити "postal_method", оскільки "su" може бути часом кращим, ніж "sudo" за замовчуванням, залежно від налаштування вашої системи.
ElementalStorm

New Ansible variables and command line options are added to set these values for the duration of a play. @Brett так, це означає, що наступні завдання після цього будуть виконуватись, some_userа не оригінальний користувач, remote_userякий використовувався для підключення до хоста, чи правильно це?
JohnnyQ

43

У відповіді 2.x ви можете використовувати blockдля групи завдань:

- block:
    - name: checkout repo
      git:
        repo: https://github.com/some/repo.git
        version: master
        dest: "{{ dst }}"
    - name: change perms
      file:
      dest: "{{ dst }}"
      state: directory
      mode: 0755
      owner: some_user
  become: yes
  become_user: some user

26

У Ansible> 1.4 ви можете фактично вказати віддаленого користувача на рівні завдання, який повинен дозволяти вам увійти як цей користувач і виконати цю команду, не вдаючись до sudo. Якщо ви не можете увійти як цей користувач, рішення sudo_user також буде працювати.

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: yourname

Див. Http://docs.ansible.com/playbooks_intro.html#hosts-and-users


Це найкраще рішення для ситуацій, коли у вас немає привілеїв
судо

7

Рішення полягає у використанні includeоператора з remote_uservar (опишіть там: http://docs.ansible.com/playbooks_roles.html ), але це потрібно робити в програмі замість рівня завдання.


Це не гарне рішення для вищевказаного випадку використання. Однак я не знав про це рішення давно. Я думав, що можу включати лише ролі.
ArjanSchouten

1

Ви можете вказати, become_methodщоб замінити метод за замовчуванням, встановлений уansible.cfg (якщо такий є), і який можна встановити на один із sudo, su, pbrun, pfexec, doas, dzdo, ksu.

- name: I am confused
  command: 'whoami'
  become: true
  become_method: su
  become_user: some_user
  register: myidentity

- name: my secret identity
  debug:
    msg: '{{ myidentity.stdout }}'

Потрібно відображати

TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
    "msg": "some_user"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.