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.

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

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

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


To najlepsze rozwiązanie w sytuacjach, gdy nie masz uprawnień sudo
Darrel Holt


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"
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.