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.

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.

Initialisation de l'environnement de travail ansible

Depuis le répertoire ansible, lancer la commande :

  ./bin/init

Cela génère un environnement python virtuel avec la bonne version d'ansible.

Ensuite il faut activer l'environnement à chaque usage avec:

  . ./bin/activate

Les roles sont versionnés indépendamment. Chaque rôle a un dépôt git.

Installer une nouvelle machine

Sur la machine cible

Il faut d'abord :

  • créer un utilisateur avec les droits sudo
  • installer python
  • changer le port du daemon SSH (51083 au lieu de 22)

Ansible

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

Ensuite, lancer le playbook d'installation :

ansible-playbook playbooks/install.yml -l nouvellemachine.grenode.net

Celui-ci va installer et configurer etckeeper, installer des paquets de base, configurer les mails sortants… puis install check-mk et munin-node.

Il est aussi possible d'utiliser les playbooks séparément :

ansible-playbook playbooks/etckeeper.yml -l nouvellemachine.grenode.net
ansible-playbook playbooks/base.yml -l nouvellemachine.grenode.net
ansible-playbook playbooks/check-mk-agent.yml -l nouvellemachine.grenode.net
ansible-playbook playbooks/munin-node.yml -l nouvellemachine.grenode.net

Monitoring

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

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 playbooks/upgrade.yml --tags dryrun

Pour effectivement mettre à jour les machines :

ansible-playbook playbooks/upgrade.yml

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 playbooks/monplaybook.yml --check --diff -l 'machine.grenode.net'

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

ansible-playbook playbooks/monplaybook.yml --diff -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 playbooks/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.