Automatiser la gestion des comptes d’administrateurs locaux avec Ansible – Partie 2

Première chose à faire, préparer tous les hôtes afin qu’ils soient contrôlables par Ansible.

Pour cela, j’ai besoin de trois choses :

  • préparer une machine “pilote” depuis laquelle je vais contrôler toutes les autres, et qui disposera d’une clé privée rsa ;
  • déposer la clé publique RSA correspondante sur chaque hôte à contrôler, afin qu’ils acceptent les connexions ssh entrantes depuis ma machine pilote,
  • constituer en même temps un fichier inventaire de tous mes hotes à contrôler.

Préparation de la machine pilote

J’ai fait le choix de regrouper sur une VM tout ce qui concerne Ansible, c’est à dire les binaires et les scripts. Je suis parti sur une base de Centos 7 car la version d’Ansible dans les dépôts était récente au moment où j’ai fait l’installation.

Je vois plusieurs avantages à tout regrouper sur une VM :

  • tous les admins disposent de la même (et la bonne) version de binaire d’Ansible
  • la clé privée ssh n’est pas diffusée

L’idéal est que les scripts soient sous contrôle d’un gestionnaire de sources, comme subversion ou git, et que chaque admin en ait sa propre copie dans son compte local. Ça permet de tracer qui a lancé quoi, qui a modifié les scripts Ansible, et de retrouver d’anciennes versions si nécessaire. Je ne détaillerai cependant pas cet aspect qui est un peu hors sujet.

Commençons par la génération de la clé RSA.

# ssh-keygen -t rsa -f ~/.ssh/ansible_rsa

J’ai fait le choix de donner à ma clé un nom différent du nom par défaut afin qu’il faille donner explicitement la clé d’authentification dans les scripts ansible et qu’elle ne soit pas utilisée automatiquement par la commande ssh. L’exécution de cette commande créé deux fichiers : la clé privée, dans ~/.ssh/ansible_rsa, et la clé publique, dans ~/.ssh/ansible_rsa.pub.

Vient ensuite la création d’une arborescence pour ranger les scripts ansible. J’ai pour cela respecté le guide des fichiers : bonnes pratiques dans la documentation Ansible. Cette arborescence permet de mettre en place l’automatisation de la configuration des serveurs en fonction de leur rôle. J’y reviendrai. Cependant, il peut également être nécessaire d’automatiser des choses qui ne peuvent être indépendantes du rôle du serveur, et j’aurai besoin de ranger des playbooks en dehors de l’arborescence proposée. Aussi j’ajoute un répertoire “playbooks” à cette arborescence. Une fois créée, elle ressemble ceci :

[ansible@ansible ansible]$ ls -l
drwxrwxr-x. 2 ansible ansible    6 filter_plugins
drwxrwxr-x. 3 ansible ansible   40 group_vars
drwxrwxr-x. 2 ansible ansible    6 host_vars
-rw-rw-r--. 1 ansible ansible 6158 integration.yml
drwxrwxr-x. 2 ansible ansible    6 library
drwxrwxr-x. 2 ansible ansible    6 module_utils
drwxrwxr-x. 3 ansible ansible   25 playbooks
-rw-rw-r--. 1 ansible ansible 2518 preprod.yml
-rw-rw-r--. 1 ansible ansible 7632 production.yml
drwxrwxr-x. 4 ansible ansible   36 roles
-rw-rw-r--. 1 ansible ansible  103 site.yml

Dernière chose : j’ai constitué le fichier .ansible.cfg dans le homedir de mon user ansible, avec ce contenu :

[defaults]
private_key_file = ~/.ssh/ansible_id_rsa
host_key_checking = False

Ces paramètres seront utilisés par ansible pour respectivement, déterminer la clé ssh à utiliser pour se connecter aux serveurs et faciliter la connexion à ces serveurs, notamment lors de la première connexion.

 

Dépôt de la clé sur les hôtes à contrôler

C’est l’étape fastidieuse… Il me faut déposer la clé sur chaque machine, et comme les distributions linux et mots de passe root de mes hôtes sont très souvent différents, je ne peux pas tellement automatiser cette partie. J’ai même de nombreux hôtes qui ont un paramétrage de sshd avec “PermitRootLogin = no”, et il faut que je prenne la main depuis la console de la machine virtuelle… Clairement, pour automatiser cette partie, c’est mort… Mais différement, les commandes sshpass et ssh-copy-id m’auraient fait gagner un peu de temps.

Pas de recette miracle, donc, mais un bloc notes avec quelques commandes toutes prêtes à copier/coller m’ont bien aidé après que j’aie galéré à obtenir un accès root sur chaque hôte. Je les recopie ci-après.

J’ai besoin de m’assurer du bon paramètrage de PermitRootLogin du démon sshd. Pour que ça fonctionne avec Ansible, j’ai besoin de que le fichier /etc/ssh/sshd_config contienne un paramètre PermitRootLogin qui soit “without-password”, ce qui signifie qu’on peut se connecter en root sur la machine depuis le réseau par ssh mais uniquement avec une authentification par clé, ou “yes”, ce qui signifie qu’on accepte de pouvoir se connecter en tapant le mot de passe root. Pour moi, la cible sera “without-password”, mais dans un premier temps, tant que je n’aurai pas fait du ménage dans les comptes, je me contenterai de ne modifier que les fois où la valeur est “no” car c’est le seul cas qui me gêne et changer ce paramètre une fois Ansible prêt à fonctionner sera facile.

J’ai aussi besoin que le fichier /root/.ssh/authorized_keys contienne ma clé publique pour ansible. Je vais donc l’ajouter au fichier, et le créer, voire créer le répertoire .ssh s’il n’existe pas. Vous verrez ici que la commande echo contient ma clé publique RSA pour ansible générée plus haut.

Voici donc le petit bloc de commandes que j’ai copié / collé dans chaque hôte après m’y être connecté en tant que root. Prenez soin de remplacer le texte de la commande echo par votre propre clé publique. Ici j’en ai généré une pour les besoins de l’article.

# Pour que le serveur ssh accepte au moins les connexions par clé publique
sed -i 's/PermitRootLogin no/PermitRootLogin without-password/' /etc/ssh/sshd_config
[ -f /etc/init.d/sshd ] && service sshd restart
[ -f /etc/init.d/ssh ] && service ssh restart

# Pour insérer ma clé publique dans le fichier authorized_keys
[ -d ~/.ssh ] || mkdir ~/.ssh
echo "ssh-rsa AAAAB3NzaC [ blabla je coupe, vous mettrez la votre ] OhwJ ansible@ansible" >> ~/.ssh/authorized_keys

Une fois ceci fait, vous pouvez vérifier qu’il est possible de se connecter en ssh vers votre hôte, depuis la machine contrôleur sans que le mot de passe soit demandé, avec la commande suivante :

ssh -i ~/.ssh/ansible_rsa root@mon-hote

Constitution de fichiers d’inventaire

À ce stade j’ai besoin de constituer des fichiers d’inventaire de mes serveurs. Je verrai plus tard comment automatiser cette partie aussi. Comme je dois me connecter sur chaque serveur, ça ne me coûte pas beaucoup plus cher d’en faire une liste dans un fichier en même temps.

Enfin je dis un fichier, mais ça dépend de la classification souhaitée. J’ai fait un fichier par catégorie de serveur. J’ai des serveurs de production, de pré-production, et de tests, j’ai donc fait trois fichiers, “production” , “preprod” et “tests”, placés à la racine de mon arborescence ansible, et suivant l’utilisation qui est faite du serveur en question, j’ai mis son nom dans le bon fichier.

Une fois fini, chaque fichier contient une liste de machines qui ressemble à ça :

all:
  hosts:
    serveur1:
      ansible_host: 10.1.1.1
    serveur2:
    serveur3:
      ansible_host: 10.1.1.3

Ici j’ai fait le choix de préciser les adresses IP de certains de mes serveurs parce que je n’avais pas toujours de bonnes entrées DNS (je verrai plus tard), mais il vaut mieux être carré sur le DNS et ne pas avoir besoin de les préciser, comme dans l’exemple de serveur2.

Une fois ma clé publique déposée partout et mes fichiers d’inventaire constitués, je peux commencer à travailler sur les scripts pour automatiser la gestion des comptes locaux, ce que je vais décrire dans la partie 3 de cet article.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.