Ansible est un logiciel de gestion de configuration et d'orchestration de tâches. Le but est de simplifier l'administration au quotidien, notamment pour déployer des changements de configuration de service ou l'installation d'une nouvelle machine.

Ansible est disponible dans les dépots Debian, la version 1.7 ou supérieure est recommandée, disponible depuis wheezy-backports.

Utilisation chez Grenode

Grenode a quelques playbooks pour gérer ses machines, tout est dans le répertoire ansible à la raçine du présent dépôt git.

Installer une nouvelle machine

Commencer par rajouter la machine à l'inventaire (ficher hosts).

Ensuite, installer et configurer etckeeper :

ansible-playbook etckeeper.yml -K -l nouvellemachine.grenode.net

Enfin, utiliser le playbook "base", qui va configurer SSH, les mails sortants, installer des paquets de base…

ansible-playbook base.yml -K -l nouvellemachine.grenode.net

Attention, ce playbook modifie le port du serveur SSH ! Il faut donc le changer ensuite dans votre configuration SSH ou dans l'inventaire Ansible.

Pour installer et configurer l'agent check_mk, utiliser ce playbook :

ansible-playbook check-mk-agent.yml -K -l nouvellemachine.grenode.net

Il faut par contre ajouter manuellement la nouvelle machine à superviser au serveur de Supervision-checkmk sur gaffe.

Mettre à jour les machines de Grenode

Un playbook upgrade.yml est disponible pour mettre à jour les machines de Grenode.

Pour voir quels paquets seraient mis à jour sur chaque machine :

ansible-playbook upgrade.yml -K --tags dryrun

Pour effectivement mettre à jour les machines :

ansible-playbook upgrade.yml -K

Mettre à jour la configuration d'une ou plusieurs machines

Il arrive qu'on veuille modifier la configuration d'une ou plusieurs machines. Une manière propre est d'effectuer ces changements via Ansible si ils concernent plusieurs machines.

Il faut donc commencer par modifier un rôle existant (base, etckeeper, etc) ou bien créer un nouveau rôle et un playbook associé.

Pour tester si le playbook ne casse rien sur la machine, commencer par tester ce que ferait ansible :

ansible-playbook monplaybook.yml --check --diff -K -l 'machine.grenode.net'

Si tout a l'air normal, on peut alors appliquer le changement pour de vrai :

ansible-playbook monplaybook.yml --diff -K -l 'machine.grenode.net'

Attention, --check ne peut pas tout tester, donc on peut avoir des erreurs sur le "vrai" déploiement alors que le test indiquait que tout est censé bien se passer.

Documentation générale

Fichiers de configuration

Les fichiers de directives se situe dans le dépot du wiki, dans le dossier ansible à la racine de ce dépot.

Il sont de trois types :

  • Inventory: hosts, puis host_vars et group_vars, contenant les variables les machines et leurs propriétés
  • roles: décrivent des ensemble de tâches à exécuter
  • playbooks: appliquent des rôles à des machines

Par défaut, ansible prend la config dans /etc ou dans ~/ansible.cfg, il nous faut lui dire d'utiliser le fichier de configuration du répertoire git. Le plus simple est d'exporter la variable ANSIBLE_CONFIG avec le chemin.

cd .../ansible
export ANSIBLE_CONFIG=$(pwd)/ansible.cfg

Commandes distribuées

Ansible permet d'exécuter des commandes simples sur toutes les machines d'un groupe (la liste des groupes est dans le fichiers hosts). Par exemple l'uptime des serveurs:

ansible all -m command -a uptime

Ici, all correspond à toutes les machines du fichiers hosts, on peut spécifier un nom de machine seul, ou bien plusieurs en les séparant avec le caractère « : ».

L'option -m indique le module à utiliser, ici commande qui exécute une commande et ses arguments, qui sont passés par le paramètre -a. Pour exécuter des commandes avec des pipe ou des glob, il faut utiliser le module shell, qui exécute en fait 'sh -c'.

Playbooks

Les playbooks sont des regroupements de tâches pour atteindre un objectif précis. Ils sont exécutés par la commande ansible-playbooks.

ansible-playbook fichierplaybook.yml [options]

Les options les plus courantes sont -e var=value, pour surcharger la valeur de la variable 'var', ansi que --limit (-l) pour restreindre l'exécution du playbook aux machines listées.