web-dev-qa-db-fra.com

Ansible: créer un utilisateur avec les privilèges Sudo

J'ai repris un serveur Ubuntu 14.04. Il a un utilisateur appelé "deployer" (utilisé avec capistrano) et, à ce titre, 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 me connecter au serveur avec cet identifiant, puis de la sorte Sudo -ish choses 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 manuel, je peux ssh dans la machine en tant que "déployeur" (par exemple, ssh deployer @ myserver), mais si je lance une commande Sudo, elle me demande toujours mon mot de passe Sudo.

Je comprends que l’utilisateur "déployeur" doit en fin de compte se retrouver dans le fichier des utilisateurs visudo, mais je ne sais pas quelles incantations magiques Ansible invoquer afin que je puisse entrer dans la machine en tant que déployeur, puis exécuter une commande Sudo (par exemple, Sudo apt-get install git ") sans être invité à saisir un mot de passe Sudo.

J'ai cherché haut et bas, et je n'arrive pas à trouver un fragment de livre de lecture Ansible qui place l'utilisateur "déployeur" dans le groupe Sudo sans demander de mot de passe. Comment est-ce fait?

61
Jay Godse

Parfois, il faut savoir quoi demander. Je ne le savais pas car je suis un développeur qui a pris en charge certains travaux 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 est à Ansible: meilleure pratique pour maintenir la liste des sudoers .

Le fragment de code Ansible Playbook ressemble à ceci de 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. Il n'ajoute pas la ligne

%wheel ALL=(ALL) NOPASSWD: ALL

à/etc/sudoers lorsque le livre de lecture est exécuté ultérieurement. Et oui ... j’ai pu entrer sur le serveur en tant que "déployeur" et exécuter les commandes Sudo sans avoir à donner de mot de passe.

105
Jay Godse

Pour créer un utilisateur avec des privilèges Sudo, vous devez le placer dans /etc/sudoers ou lui faire devenir membre d'un groupe spécifié dans /etc/sudoers. Et pour le rendre sans mot de passe, vous devez également spécifier NOPASSWD dans /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 jouer avec le fichier /etc/sudoers, nous pouvons créer un nouveau fichier dans le répertoire /etc/sudoers.d/ puisque ce répertoire est inclus par /etc/sudoers par défaut, ce qui évite la possibilité de détruire le fichier sudoers existant, et élimine également la dépendance du contenu à l'intérieur de /etc/sudoers.

Pour atteindre ci-dessus dans Ansible, reportez-vous aux éléments suivants:

- 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 par d'autres noms de groupe tels que %sudoers ou d'autres noms d'utilisateur tels que deployer.

4
pallxk