Débuter avec Ansible, les rôles et les playbooks

1/52/53/54/55/5 (10 votes, moyenne: 3,00 sur 5)
Loading...
D

Attention, cet article a plus d'une année d'ancienneté. Il est possible que les informations présentées ne soient plus à jour, spécialement dans le cadre d'un article technique.


Bonjour à tous,

Aujourd’hui on va reparler d’Ansible. Contrairement à pas mal de monde, j’aime bien commencer les choses par le début surtout dès que ça touche à l’informatique, assurez-vous d’avoir lu mon précédent article sur l’installation de Ansible avant tout.

Concrètement aujourd’hui, on va aborder les notions de rôles et de playbooks.

Je ne vais pas vous montrer comment créer un rôle, mais simplement comment en utiliser un. Et on verra comment créer des playbooks avec un rôle.

 

Le but :

On va faire deux choses dans cet exemple.

La première chose sera le déploiement d’un fichier sources.list sur tous nos hôtes Debian avec un simple playbook.

Ça sera le fichier sources.list que j’utilise sur tous mes articles, il faudra donc certains logiciels, les clefs de signatures des repo de MariaDB et Dotdeb et le fichier sources.list.

La deuxième chose sera le déploiement d’une configuration ntp sur tous nos hôtes Debian / Ubuntu / RHEL / CentOS avec un rôle pré-fait et un playbook.

 

Créez d’abord deux dossiers avec les commandes suivantes :

mkdir -p /etc/ansible/ressources/conf
mkdir -p /etc/ansible/playbooks

 

Le dossier ressources/conf vous servira à stocker des fichiers de configuration pour les déploiements.

Le dossier playbooks servira à stocker les playbooks.

 

Déploiement d’un fichier sources.list :

Dans cette partie, on va commencer light en utilisant simplement un playbook.

On va d’abord définir ce qu’est un playbook pour commencer. Pour faire simple, un playbook est une recette de cuisine ou un scénario qui sera suivi par Ansible lorsque vous l’exécuterez.

Rien de plus, rien de moins. Si la cuisine est une notion inconnue pour vous et que vous ne savez pas ce qu’est un scénario alors, voyez ça comme un script. 🙂

Ce playbook utilise une syntaxe YAML et c’est plutôt sympathique comme langage hormis les problèmes à deux balles qu’apporte systématiquement un langage basé sur l’indentation.

 

Bref, dans un premier temps, créez un dossier pour les configurations relatives à APT et créez y votre fichier sources.list :

mkdir -p /etc/ansible/ressources/conf/apt
nano /etc/ansible/ressources/conf/apt/sources.list.debian

 

Remplissez-le avec le fichier sources.list que vous souhaitez déployer :

#Debian Mirrors
deb http://httpredir.debian.org/debian jessie main contrib non-free
deb-src http://httpredir.debian.org/debian jessie main contrib non-free
deb http://httpredir.debian.org/debian jessie-updates main contrib non-free
deb-src http://httpredir.debian.org/debian jessie-updates main contrib non-free
deb http://httpredir.debian.org/debian jessie-backports main contrib non-free
deb-src http://httpredir.debian.org/debian jessie-backports main contrib non-free

#MariaDB Mirrors
deb http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.1/debian jessie main
deb-src http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.1/debian jessie main

#Dotdeb mirrors
deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

 

Maintenant, créez un playbook avec la commande suivante :

nano /etc/ansible/playbooks/debian-sources.yml

 

Et remplissez-le avec ceci :

- hosts: deb-sources
  become: yes
  become_method: sudo
  tasks:
    - name: Check needed softwares
      apt: name={{ item }} state=present
      with_items:
        - software-properties-common
        - python-software-properties

    - name: Add MariaDB key
      apt_key: keyserver=keyserver.ubuntu.com id=0xcbcb082a1bb943db
      notify: update

    - name: Add DotDeb key
      apt_key: url=https://www.dotdeb.org/dotdeb.gpg state=present
      notify: update

    - name: Copy sources.list
      copy: src=/etc/ansible/ressources/conf/apt/sources.list.debian dest=/etc/apt/sources.list owner=root group=root mode=644 backup=yes
      notify: update

  handlers:
    - name: update
      apt: update_cache=yes

 

Il est vital de respecter cette indentation et avant de vous expliquer comment lancer le truc, je vais vous expliquer à quoi chaque partie correspond.

- hosts: deb-sources
  become: yes
  become_method: sudo
  tasks:

 

Cette partie correspond au groupe d’hôte défini dans votre fichier d’hôtes Ansible.
Elle indique également que toutes les commandes devront être lancées en tant que SUDO.
Tout ce qui viendra après tasks: définira les tâches que l’on souhaite exécuté sur les hôtes définis.

    - name: Check needed softwares
      apt: name={{ item }} state=present
      with_items:
        - software-properties-common
        - python-software-properties

    - name: Add MariaDB key
      apt_key: keyserver=keyserver.ubuntu.com id=0xcbcb082a1bb943db
      notify: update

    - name: Add DotDeb key
      apt_key: url=https://www.dotdeb.org/dotdeb.gpg state=present
      notify: update

    - name: Copy sources.list
      copy: src=/etc/ansible/ressources/conf/apt/sources.list.debian dest=/etc/apt/sources.list owner=root group=root mode=644 backup=yes
      notify: update

 

Toute cette partie correspond aux différentes tâches.

On va d’abord utiliser le module apt pour installer différents paquets qui seront définis dans la boucle {{ item }} à savoir : software-properties-common et python-software-properties.

Ensuite, on va utiliser le module apt_key pour successivement ajouter les clefs de MariaDB et Dotdeb sur tous les serveurs.

On utilisera ensuite le module copy pour copier le fichier sources.list créé précédemment sur tous nos serveurs en spécifiant les droits dessus et en faisant une sauvegarde des fichiers originaux sur chaque serveur.

L’action notify permets d’appeler un handler à la fin du fichier si une modification est détectée sur les serveurs.

Dans notre cas, le Handler se nomme update.

  handlers:
    - name: update
      apt: update_cache=yes

 

Ce Handler permettra de lancer l’équivalent de la commande apt-get update sur tous les serveurs si une modification est constatée sur une ou plusieurs des tâches effectuées.
Par exemple, un changement au niveau des clefs de signature ou du fichier sources.list.

 

Voilà, le playbook est prêt, maintenant, il va falloir définir tous les hôtes qui recevront ce fichier sources.list dans le fichier hosts de Ansible :

nano /etc/ansible/hosts

 

Par exemple :

[deb-sources]
serveur1.wololo.ansible:12345        ansible_connection=ssh        ansible_user=ansible
serveur2.wololo.ansible:22        ansible_connection=ssh        ansible_user=ansible

 

Maintenant, rendez-vous dans le répertoire de Ansible (pas obligatoire, mais je préfère) et lancez le playbook avec la commande suivante :

cd /etc/ansible
ansible-playbook playbooks/debian-sources.yml

 

Vous pourrez suivre la progression du playbook en temps réel. Logiquement tous les serveurs devraient se mettre en state=changed lors du premier lancement.

 

Vous pourrez relancer ce playbook à chaque modification de votre fichier sources.list par exemple ou de façon périodique si les clefs de signature changent.

 

Déploiement de NTPd et de sa configuration :

Cette fois-ci, on va utiliser un rôle. Le sujet n’est pas de créer un rôle, simplement de se servir de quelque chose d’existant qui a été publié sur Ansible Galaxy.

Un rôle n’est rien d’autre qu’un playbook réutilisable qui permet d’avoir une simple inclusion dans des playbooks existants au lieu d’avoir des playbooks à rallonge.

Ça permet d’éviter les erreurs d’indentation entre autres.

 

On va d’abord installer le rôle NTP de Resmo avec la commande suivante :

ansible-galaxy install resmo.ntp

 

Ensuite, vous allez créer un playbook avec la commande suivante :

nano /etc/ansible/playbooks/ntp.yml

 

Remplissez-le avec ceci :

- hosts: all
  become: yes
  become_method: sudo
  roles:
    - role: resmo.ntp
      ntp_config_server: [0.fr.pool.ntp.org, 1.fr.pool.ntp.org, 2.fr.pool.ntp.org, 3.fr.pool.ntp.org]

 

Même principe que pour l’ancien playbook. On spécifie juste le rôle précédemment télécharger et on rentre les serveurs NTP que l’on souhaite utiliser dans la variable de configuration.

 

Lancez finalement le playbook avec la commande suivante :

cd /etc/ansible
ansible-playbook playbooks/ntp.yml

 

Et voila, c’est tout pour aujourd’hui 🙂

A propos de l'auteur

Nicolas Simond

Ingénieur Systèmes et Réseaux et guitariste hard rock et metal à mes heures perdues.
Je suis le créateur et l'unique rédacteur d'Abyss Project, c'est ici que je note la plupart de mes procédures et quelques divagations.

Si vous l'article vous a aidé, pensez à me payer un café :)

Subscribe
Notify of
guest

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

3 Commentaires
Plus récents
Plus anciens Populaires
Inline Feedbacks
View all comments
Wojtek
Wojtek
7 années plus tôt

Il est maintenant possible (depuis la version 2) d’utiliser le module package au lieu de apt ou yum pour éviter d’avoir a gérer plusieurs playbooks ou bien des if à rallonge