Ansible: Erstellen Sie einen Benutzer mit Sudo-Berechtigungen

73

Ich habe einen Ubuntu 14.04 Server übernommen. Es hat einen Benutzer namens "Deployer" (wird mit Capistrano verwendet) und benötigt daher Sudo-Berechtigungen. Mit diesem Setup kann ich mich beim Server anmelden und Dinge tun wie:

workstation> ssh deployer@myserver
myserver>  sudo apt-get install git
myserver> exit
workstation>

Ich versuche herauszufinden, wie man mit Ansible (Version 2.0.2.0 und Python 2.7.3) einen Benutzer namens "Deployer" erstellt und sich mit dieser ID beim Server anmeldet und dann so sudo-ish Dinge wie "apt" -get install ". Mein Spielbuch sieht so aus:

---
- hosts: example
  become: yes
  tasks:
  - name: Update apt cache
    apt:
      update_cache: yes
      cache_valid_time: 3600

  - group: name=sudo state=present

  - name: Add deployer user and add it to sudo
    user: name=deployer
          state=present
          createhome=yes
    become: yes
    become_method: "sudo"

  - name: Set up authorized keys for the deployer user
    authorized_key: user=deployer key="{{item}}"
    with_file:
      - /home/jaygodse/.ssh/id_rsa.pub

Nachdem ich dieses Playbook ausgeführt habe, kann ich als "Deployer" (z. B. ssh deployer @ myserver) auf den Computer ssh. Wenn ich jedoch einen sudo-Befehl ausführe, werde ich immer nach meinem sudo-Passwort gefragt.

Ich verstehe, dass der "Deployer" -Benutzer letztendlich seinen Weg in die visudo-Benutzerdatei finden muss, aber ich kann nicht herausfinden, welche magischen Ansible-Beschwörungsformeln aufgerufen werden müssen, damit ich als Deployer in den Computer ssh und dann einen sudo-Befehl (z. B. sudo) ausführen kann apt-get install git ") ohne Aufforderung zur Eingabe eines sudo-Passworts.

Ich habe hoch und niedrig gesucht und kann anscheinend kein Ansible-Playbook-Fragment finden, das den Benutzer "Deployer" in die Sudo-Gruppe einordnet, ohne ein Kennwort zu benötigen. Wie wird das gemacht?

Jay Godse
quelle

Antworten:

136

Manchmal weiß man, was man fragen soll. Ich wusste es nicht, da ich ein Entwickler bin, der einige DevOps-Arbeiten übernommen hat.

Anscheinend ist 'passwortlos' oder NOPASSWD-Login eine Sache, die Sie in die Datei / etc / sudoers einfügen müssen.

Die Antwort auf meine Frage lautet Ansible: Best Practice für die Pflege der Liste der Sudoer .

Das Ansible-Playbook-Codefragment sieht nach meinem Problem folgendermaßen aus:

- name: Make sure we have a 'wheel' group
  group:
    name: wheel
    state: present

- name: Allow 'wheel' group to have passwordless sudo
  lineinfile:
    dest: /etc/sudoers
    state: present
    regexp: '^%wheel'
    line: '%wheel ALL=(ALL) NOPASSWD: ALL'
    validate: 'visudo -cf %s'

- name: Add sudoers users to wheel group
  user:
    name=deployer
    groups=wheel
    append=yes
    state=present
    createhome=yes

- name: Set up authorized keys for the deployer user
  authorized_key: user=deployer key="{{item}}"
  with_file:
    - /home/railsdev/.ssh/id_rsa.pub

Und das Beste daran ist, dass die Lösung idempotent ist. Die Zeile wird nicht hinzugefügt

%wheel ALL=(ALL) NOPASSWD: ALL

an / etc / sudoers, wenn das Playbook ein späteres Mal ausgeführt wird. Und ja ... Ich konnte als "Deployer" auf den Server ssh und sudo-Befehle ausführen, ohne ein Passwort eingeben zu müssen.

Jay Godse
quelle
66
Bitte fügen Sie die Zeile validate: 'visudo -cf %s'am Ende Ihres lineinfile:Abschnitts hinzu, um sie vor dem Speichern zu überprüfen. Wenn Sie die sudoers-Datei durcheinander bringen, wird der sudo-Zugriff dauerhaft gesperrt.
Simon Woodside
2
authorized_key akzeptiert den Schlüssel als Zeichenfolge im keyParameter seit v1.9
Tim
7
Sie können auch eine Datei erstellen / kopieren /etc/sudoers.d, die meisten Distributionen als Standard-Include-Zeile dafür ...
Gert van den Berg
Beachten Sie, dass der validateBefehl wahrscheinlich den vollständigen Pfad benötigt, um visudozu funktionieren.
Matt Hughes
1
Für Ansible 2.3 und höher sollte der Parameter dest in lineinfile in path geändert werden.
Indika K
16

Um einen Benutzer mit Sudo-Berechtigungen zu erstellen, müssen Sie den Benutzer in /etc/sudoersein Mitglied einer in angegebenen Gruppe einordnen oder es zu einem Mitglied machen /etc/sudoers. Und damit es kennwort weniger ist zusätzlich angeben NOPASSWDin /etc/sudoers.

Beispiel für /etc/sudoers:

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

## Same thing without a password
%wheel  ALL=(ALL)       NOPASSWD: ALL

Und anstatt mit /etc/sudoersDateien herumzuspielen , können wir eine neue Datei im /etc/sudoers.d/Verzeichnis erstellen, da dieses Verzeichnis /etc/sudoersstandardmäßig enthalten ist, wodurch die Möglichkeit vermieden wird, vorhandene Sudoers-Dateien zu beschädigen, und auch die Abhängigkeit vom Inhalt innerhalb von beseitigt wird /etc/sudoers.

Um oben in Ansible zu erreichen, beziehen Sie sich auf Folgendes:

- name: sudo without password for wheel group
  copy:
    content: '%wheel ALL=(ALL:ALL) NOPASSWD:ALL'
    dest: /etc/sudoers.d/wheel_nopasswd
    mode: 0440

Sie können durch %wheelandere Gruppennamen wie %sudoersoder andere Benutzernamen wie ersetzen deployer.

pallxk
quelle