Linux : automatiser son infra avec Ansible

Présentation Ansible :

Ansible est un « open source configuration management software » qui permet donc d’automatiser la gestion et la configuration de son infrastructure sous Linux.

 

Il fonctionne de la manière suivante :

Le serveur Ansible répertorie les différents serveurs à administrer dans un fichier « hosts ». Ce serveur va ensuite exécuter des « playbooks » (une suite d’action scriptée en format YAML) et effectuer des tâches d’administration à distance (via SSH), sans aucune interaction humaine.

Les grandes forces d’Ansible sont :

  • La simplicité : Il est plus facile d’apprendre à utiliser Ansible que d’outils de configuration management comme Puppet.
  • Pas de client à installer sur les serveurs cibles : Ansible utilise uniquement SSH.
  • Outil intelligent : Comme le décrit si bien le site officiel du projet, Ansible se concentre uniquement sur le résultat. Si le playbook demande d’installer un logiciel déjà installé, il ne se passera rien et vous en serez notifié. Vous pouvez également n’effectuer qu’un upgrade de vos logiciels.

Note : Depuis la version 1.7 Ansible peut aussi fonctionner sur Windows, dans ce cas il n’utilise plus SSH pour l’administration à distance mais Powershell (winrm).

 

Contexte :

Je vais m’occuper dans cet article de reporter uniquement mes notes suite à mon lab virtuel d’introduction à Ansible. Mes tests n’étant pas complètement terminés sur cet outil…

Ceci n’est donc ni un tuto, ni une présentation complète de cet outil.

Lab :

J’ai utilisé 3 VM sous VirtualBox pour monter ce lab : une VM serveur Ansible et deux VM WebServer1 et WebServer2 (pour tester le déploiement sur de multiples hosts en même temps).

Toutes mes VMs tournent sous Debian 8.6

Ansible : 10.0.0.5
WebServer1 : 10.0.0.4
WebServer2: 10.0.0.6

Mes notes :

Installation d’Ansible sous Debian

apt-get install software-properties-common
apt-add-repositery -y ppa:ansible/ansible
apt-get updateapt-get install -y ansible

Après l’installation d’Ansible, un fichier hosts est créé pour servir d’exemple très bien détaillé sur comment renseigner les serveurs distants à administrer. /etc/ansible/hosts

Pour qu’Ansible puisse se connecter à distance sur nos serveurs, nous devons au préalable partager la clé publique sur ces serveurs:

ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub fred@10.0.0.4
ssh-copy-id -i ~/.ssh/id_rsa.pub fred@10.0.0.6

Test du fonctionnement de la connection SSH d’Ansible sur mes serveurs distants (renseignés dans le fichier hosts dans un groupe nommé « web ») :

ansible3

 ansible web -m ping

ansible1

À noter que la demande du pass pour sudo est une modification que j’ai apportée au fichier de configuration d’Ansible (/etc/ansible/ansible.cfg) :

ask_sudo_pass = True

Il est aussi possible de renseigner le mot de passe root dans un fichier. Il faudra alors crypter ce fichier par sécurité avec Vault :

export EDITOR="/usr/bin/nano"ansible-vault create pass.yml

Voici mon playbook de test pour l’installation d’Apache / MySQL / PHP sur mes deux serveurs Web :

ansible2

Pour exécuter le playbook voici différentes méthodes :

ansible-playbook playbook.yml --verbose

ansible-playbook playbook.yml --user=fred --ask-sudo-pass

ansible-playbook playbook.yml --vault-password-file=pass.yml

Lancement du playbook depuis le serveur Ansible :

ansible4

ansible5

Ici on peut voir le statut de nos actions : OK=4 (pas d’installation car logiciels déjà présents sur le serveur cible) changed=2 (2 installations effectuées par Ansible).

La couleur orange représente les modifications effectuées par Ansible. Dans cette capture d’écran Ansible a installé Apache et PHP sur le serveur web 10.0.0.6.

Si je relance la même commande, cette fois tout est à « OK » : Ansible ne fait rien car tout est déjà installé (tout est vert) !

ansible6

La prochaine étape de mes tests sera d’installer un serveur MySQL en réplication Master-Slave. Pour cela il va me falloir jouer avec les variables sous Ansible…