79 votes

Ansible : créer un utilisateur avec des privilèges sudo

J'ai repris un serveur Ubuntu 14.04. Il a un utilisateur appelé "deployer" (utilisé avec capistrano), et en tant que tel, il a besoin des privilèges sudo. Avec cette configuration, je peux me connecter au serveur et faire des choses comme.. :

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

J'essaie de comprendre comment utiliser Ansible (version 2.0.2.0 et python 2.7.3) pour créer un utilisateur appelé "deployer" et pouvoir se connecter au serveur avec cet identifiant et ensuite faire des choses sudoïdes comme "apt-get install". Mon playbook ressemble à ceci :

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

Après avoir exécuté ce playbook, je suis capable de me connecter à la machine en tant que "deployer" (par exemple, ssh deployer@myserver), mais si j'exécute une commande sudo, on me demande toujours mon mot de passe sudo.

Je comprends que l'utilisateur "deployer" doit finalement se retrouver dans le fichier visudo users, mais je n'arrive pas à trouver les incantations magiques Ansible à invoquer pour que je puisse me connecter à la machine en tant que deployer et ensuite exécuter une commande sudo (par exemple sudo apt-get install git") sans être invité à entrer un mot de passe sudo.

J'ai cherché partout et je n'arrive pas à trouver un fragment de playbook Ansible qui place l'utilisateur "deployer" dans le groupe sudo sans exiger de mot de passe. Comment cela se fait-il ?

0 votes

156voto

Jay Godse Points 5157

Parfois, il s'agit de savoir quoi demander. Je ne le savais pas, car je suis un développeur qui a pris en charge une partie du travail de DevOps.

Apparemment, la connexion sans mot de passe ou NOPASSWD est une chose que vous devez mettre dans le fichier /etc/sudoers.

La réponse à ma question se trouve à l'adresse suivante Ansible : meilleure pratique pour maintenir la liste des sudoers .

Le fragment de code du playbook Ansible ressemble à ce que je vois dans mon problème :

- 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

Et la meilleure partie est que la solution est idempotente. Elle n'ajoute pas la ligne

%wheel ALL=(ALL) NOPASSWD: ALL

à /etc/sudoers lorsque le playbook est exécuté une fois suivante. Et oui... j'ai pu me connecter au serveur en tant que "deployer" et exécuter des commandes sudo sans avoir à donner de mot de passe.

70 votes

Veuillez ajouter la ligne validate: 'visudo -cf %s' à la fin de votre lineinfile: pour valider avant de sauvegarder. Une erreur dans le fichier sudoers vous bloquera définitivement l'accès sudo.

2 votes

authorized_key accepte la clé comme une chaîne de caractères dans le key paramètre depuis la v1.9

7 votes

Vous pouvez également créer/copier un fichier dans l'application /etc/sudoers.d la plupart des distributions ont une ligne d'inclusion par défaut pour cela...

19voto

pallxk Points 374

Pour créer un utilisateur avec des privilèges sudo, il faut placer l'utilisateur dans le répertoire /etc/sudoers ou faire de l'utilisateur un membre d'un groupe spécifié dans la section /etc/sudoers . Et pour le rendre sans mot de passe, il faut spécifier en plus NOPASSWD sur /etc/sudoers .

Exemple de /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

Et au lieu de tripoter /etc/sudoers nous pouvons créer un nouveau fichier dans /etc/sudoers.d/ puisque ce répertoire est inclus par /etc/sudoers par défaut, ce qui évite la possibilité de casser le fichier sudoers existant, et élimine également la dépendance vis-à-vis du contenu de la section /etc/sudoers .

Pour réaliser ce qui précède dans Ansible, reportez-vous à ce qui suit :

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

Vous pouvez remplacer %wheel avec d'autres noms de groupes comme %sudoers ou d'autres noms d'utilisateur comme deployer .

-7voto

F S Points 1

En utilisant visudo, appuyez sur Shift+G Et ajouter à la fin du fichier :

deployer  ALL=(ALL)       NOPASSWD: ALL

puis écrire et quitter ( :wq )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X