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