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 🙂
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
Salut,
Le module package n’est pas une solution miracle et surtout il ne remplace ni APT ni YUM. C’est juste une équivalence de la commande install/remove d’un gestionnaire de paquets, ça ne prend rien d’autre en charge.
Je n’aurais pas pu faire mon article avec ce module en définitif.