Wie wechsle ich einen Benutzer pro Aufgabe oder Aufgabengruppe?

159

Ein wiederkehrendes Thema in meinen Ansible-Playbooks ist, dass ich häufig einen Befehl mit sudo-Berechtigungen ( sudo: yes) ausführen muss, weil ich dies für einen bestimmten Benutzer tun möchte. Im Idealfall würde ich lieber sudo verwenden, um zu diesem Benutzer zu wechseln und die Befehle normal auszuführen. Denn dann muss ich meine üblichen Post-Befehle nicht mehr bereinigen, z. B. Chowning-Verzeichnisse. Hier ist ein Ausschnitt aus einem meiner Spielbücher:

- 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

Im Idealfall könnte ich Befehle oder Befehlssätze als anderer Benutzer ausführen, selbst wenn sudo erforderlich ist, um diesen Benutzer zu unterstützen.

rgrinberg
quelle

Antworten:

241

Mit Ansible 1.9 oder höher

Ansible Anwendungen des become, become_userund become_methodRichtlinien zur Privilegieneskalation zu erreichen. Sie können sie auf ein ganzes Spiel oder ein ganzes Spielbuch anwenden, sie in einem enthaltenen Spielbuch festlegen oder sie für eine bestimmte Aufgabe festlegen.

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

Hier können Sie become_withangeben, wie die Berechtigungseskalation erreicht wird. Die Standardeinstellung ist sudo.

Die Richtlinie gilt für den Umfang des Blocks, in dem sie verwendet wird ( Beispiele ).

Weitere Beispiele finden Sie unter Hosts und Benutzer. Weitere Informationen finden Sie unter Werden (Berechtigungseskalation) .

Zusätzlich zu den Aufgabenbereichen becomeund become_userAnweisungen hat Ansible 1.9 einige neue Variablen und Befehlszeilenoptionen hinzugefügt, um diese Werte für die Dauer eines Spiels festzulegen , wenn keine expliziten Anweisungen vorliegen :

Ab Ansible 2.0.2.0 funktioniert die unten beschriebene ältere sudo/ sudo_userSyntax weiterhin, in der Verfallsmitteilung heißt es jedoch: "Diese Funktion wird in einer zukünftigen Version entfernt."


Vorherige Syntax, ab Ansible 1.9 veraltet und zum Entfernen geplant:

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
  sudo_user: some_user
Brett
quelle
4
Um den sudo_user aus einer Variablen anzugeben, verwenden Sie Anführungszeichen um Ihre Variablenvorlage, sudo_user: "{{ ansible_ssh_user }}"oder Sie würden einen yaml-Syntaxfehler erhalten.
Sumeet Pareek
Guter Fang. Ich habe versucht, die Formulierung des Problems durch das OP so genau wie möglich anzupassen, aber ich stimme zu, dass die Verwendung variabler Interpolation die häufigste Wahl ist.
Brett
5
Ab Ansible 1.9 ist es das becomeSystem anstelle von "sudo *".
AndiDog
2
Die Syntax 1.9+ für "Werden" ist richtig. Möglicherweise möchten Sie auch "werden_Methode" überprüfen, da "su" je nach Systemkonfiguration manchmal besser als "sudo" sein kann.
ElementalStorm
New Ansible variables and command line options are added to set these values for the duration of a play. @Brett bedeutet das, dass die nachfolgenden Aufgaben danach ausgeführt werden some_userund nicht der ursprüngliche Benutzer, remote_userder für die Verbindung zum Host verwendet wurde. Ist das richtig?
JohnnyQ
42

In Ansible 2.x können Sie Folgendes blockfür eine Gruppe von Aufgaben verwenden:

- 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
quelle
26

In Ansible> 1.4 können Sie tatsächlich einen Remote-Benutzer auf Aufgabenebene angeben, der es Ihnen ermöglichen soll, sich als dieser Benutzer anzumelden und diesen Befehl auszuführen, ohne auf sudo zurückzugreifen. Wenn Sie sich nicht als dieser Benutzer anmelden können, funktioniert auch die Lösung sudo_user.

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

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

trcarden
quelle
Dies ist die beste Lösung für Situationen, in denen Sie keine Sudo-Berechtigungen haben
Darrel Holt
7

Eine Lösung besteht darin, die includeAnweisung mit remote_uservar zu verwenden (beschreiben Sie dort: http://docs.ansible.com/playbooks_roles.html ), sie muss jedoch auf Playbook-Ebene anstatt auf Aufgabenebene ausgeführt werden.

Guillaume Dedrie
quelle
Dies ist keine gute Lösung für den obigen Anwendungsfall. Diese Lösung war mir jedoch lange nicht bekannt. Ich dachte, ich kann nur Rollen einschließen.
ArjanSchouten
1

Sie können angeben become_method, dass die in ansible.cfg(falls vorhanden) festgelegte Standardmethode überschrieben werden soll, die auf eine von festgelegt werden kann 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 }}'

Sollte angezeigt werden

TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
    "msg": "some_user"
}
avi.elkharrat
quelle