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


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.