Jak zmienić użytkownika na zadanie lub zestaw zadań?

160

Powtarzającym się motywem w moich playbookach jest to, że często muszę wykonać polecenie z uprawnieniami sudo ( sudo: yes), ponieważ chciałbym to zrobić dla określonego użytkownika. W idealnym przypadku wolałbym użyć sudo, aby przełączyć się na tego użytkownika i normalnie wykonywać polecenia. Ponieważ wtedy nie będę musiał czyścić moich zwykłych poleceń pocztowych, takich jak chowning katalogów. Oto fragment jednego z moich poradników:

- 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

W idealnym przypadku mógłbym uruchamiać polecenia lub zestawy poleceń jako inny użytkownik, nawet jeśli wymaga to od sudo su dla tego użytkownika.

rgrinberg
źródło

Odpowiedzi:

241

Z Ansible 1.9 lub nowszym

Ansibl używa become, become_user, i become_methoddyrektywy, aby osiągnąć przekroczenia uprawnień. Możesz zastosować je do całej gry lub poradnika, ustawić je w dołączonym poradniku lub ustawić je do określonego zadania.

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

Możesz użyć, become_withaby określić, w jaki sposób zostanie osiągnięta eskalacja uprawnień, domyślnie jest to sudo.

Dyrektywa obowiązuje dla zakresu bloku, w którym jest używana ( przykłady ).

Aby zapoznać się z dodatkowymi przykładami, zobacz Hosty i użytkownicy oraz Zostań (eskalacja uprawnień), aby uzyskać bardziej szczegółową dokumentację.

Oprócz dyrektyw o zakresie zadań becomei become_userdyrektyw, Ansible 1.9 dodał kilka nowych zmiennych i opcji wiersza poleceń, aby ustawić te wartości na czas trwania gry w przypadku braku wyraźnych dyrektyw:

Począwszy od Ansible 2.0.2.0, starsza składnia sudo/ sudo_useropisana poniżej nadal działa, ale w powiadomieniu o wycofaniu jest napisane: „Ta funkcja zostanie usunięta w przyszłej wersji”.


Poprzednia składnia, przestarzała od wersji Ansible 1.9 i przeznaczona do usunięcia:

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
  sudo_user: some_user
Brett
źródło
4
Aby określić sudo_user ze zmiennej, użyj cudzysłowów wokół szablonu zmiennej, w ten sposób - w sudo_user: "{{ ansible_ssh_user }}"przeciwnym razie wystąpi błąd składni yaml.
Sumeet Pareek
Dobry chwyt. Starałem się jak najdokładniej dopasować sformułowanie problemu przez PO, ale zgadzam się, że najczęstszym wyborem będzie zastosowanie interpolacji zmiennej.
Brett
5
Od Ansible 1.9 jest to becomesystem zamiast „sudo *”.
AndiDog
2
Składnia 1.9+ dla „zostań” jest właściwa. Możesz także zaznaczyć opcję „get_method”, ponieważ „su” może być czasem lepsze niż domyślne „sudo”, w zależności od konfiguracji systemu.
ElementalStorm
New Ansible variables and command line options are added to set these values for the duration of a play. @Brett czy to oznacza, że ​​kolejne zadania będą wykonywane przez some_userpierwotnego użytkownika, remote_userktóry był używany do łączenia się z hostem, a nie przez pierwotnego użytkownika , czy to prawda?
JohnnyQ
43

W Ansible 2.x możesz użyć blockdla grupy zadań:

- 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
Arbab Nazar
źródło
26

W Ansible> 1.4 możesz faktycznie określić zdalnego użytkownika na poziomie zadania, który powinien pozwolić ci zalogować się jako ten użytkownik i wykonać to polecenie bez uciekania się do sudo. Jeśli nie możesz zalogować się jako ten użytkownik, rozwiązanie sudo_user również będzie działać.

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

Zobacz http://docs.ansible.com/playbooks_intro.html#hosts-and-users

trcarden
źródło
To najlepsze rozwiązanie w sytuacjach, gdy nie masz uprawnień sudo
Darrel Holt
7

Rozwiązaniem jest użycie includeinstrukcji z remote_uservar (opisz je tam: http://docs.ansible.com/playbooks_roles.html ), ale należy to zrobić na poziomie podręcznika zamiast zadania.

Guillaume Dedrie
źródło
To nie jest dobre rozwiązanie dla powyższego przypadku użycia. Jednak długo nie byłem świadomy tego rozwiązania. Myślałem, że mogę zawrzeć tylko role.
ArjanSchouten
1

Możesz określić, become_methodaby zastąpić domyślną metodę ustawioną w ansible.cfg(jeśli istnieje), a którą można ustawić na jedną z 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 }}'

Powinien wyświetlić

TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
    "msg": "some_user"
}
avi.elkharrat
źródło