Automatiser
l’infrastructure avec
Ansible
par
Sébastien FLEURY 1 / 22
Introduction
●
Projet créé en 2012 entièrement en Python
●
Répond à des besoins de remplacement, de
déploiement ou de changements de serveur.
●
Agentless, accès SSH, pilote Windows,
Linux, Unix, Cisco, Juniper
●
D’autres produits ont un mode client/serveur :
Puppet en Ruby, Chef en Erlang, SaltStack
(également Agentless) en Python
2 / 22
Mise en oeuvre
●
Une installation simple (wsl sous windows)
– apt install ansible
– Mac M1 => Cliquer sur activer Rosetta dans le terminal
●
Un inventaire de l’infrastructure managée
– Organisé par groupe de machine
– Dans /etc/ansible ou dans un fichier inventory.yml qui serait
stocké dans votre projet
●
Des variables pour rendre les recettes génériques
– ansible_ssh_user définie l’utilisateur ssh utilisé
●
Utilisation du format YAML
3 / 22
Les outils
●
ansible : Execution d’une tâche
●
ansible-playbook : Execution de playbook (ensemble de tâches
à effectuer)
●
ansible-doc : Accès au listing + documentation des serveurs
●
ansible-vault : Gestion de fichiers chiffrés (stockage variable mot
de passe)
●
ansible-galaxy : Accès au dépôt des rôles d’ansible
Exemple :
ansible –i hosts all –m ping -k
ansible-doc --list
4 / 22
Les accès
●
En utilisant les informations de connexion dans l’inventaire
– ansible_host : IP Address
– ansible_user : remote_login
●
En précisant toutes les informations sur la ligne de commande ansible
– ansible -i inventory.yml all -m ping -u sfladmin -k
●
En configurant la machine de management pour une connexion
transparente
– Créer une paire de clé SSH (ssh-keygen)
– Déployer la clé publique sur chacun des serveurs
●
ssh-copy-id monuserdistant@monipdistante
– Le login utilisateur pour chaque hôte peut être spécifié dans l’inventaire
(ansible_user=remote_login)
5 / 22
Inventaire
webservers:
inventory.yml hosts:
foo.example.com:
ansible_host : 192.168.1.1
ansible_user : myuser
dbservers:
hosts:
one.example.com:
ansible_host : 192.168.1.2
ansible_user : myuser
two.example.com:
ansible_host : 192.168.1.3
ansible_user : myuser
three.example.com:
ansible_host : 192.168.1.4
ansible_user : myuser
6 / 22
ry
t o En tant qu’administrateur je souhaite initialiser un projet
S
r Ansible
e
Us
●
Créer un répertoire de projet ansible_tp1 et initialiser un dépôt Git
●
Créer une machine virtuelle VirtualBox ou Parallele (Mac) ou
mac.getutm.app (mac m1) en mode réseau bridge
– Pour obtenir son ip : ip a
●
Créer un fichier d’inventaire hosts.yml
– https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
●
Valider la connexion ssh vers la machine virtuelle
– Installer SSH sur la machine virtuelle (apt install openssh-server)
– Voir slide suivant sur les accès pour générer son identité
– ansible -i hosts.yml all -m ping -k
●
Récupérer les facts et identifier la variable qui contient le type de système
d’exploitation
– ansible -i hosts.yml all -m setup -k
7
Les modules
●
Ce sont les actions executées par Ansible
●
Ils sont modulaires, réutilisables, configurables, idempotent
●
Quelques modules courants
– ping : validation de l’inventaire
– setup : retourne une liste d’informations matériels de l’hôte
– shell et command : permettent d’exécuter des commandes sur les hôtes
– user : permet de gérer des utilisateurs sur les hôtes
– file : permet de gérer des droits sur des fichiers
– service : permet de gérer les services systèmes tel que :
arrêt/démarrage/redémarrage ou activation et désactivation au boot
– yum/apt/zypper : permet de gérer l’installation, la mise à jour et la suppression de
paquets
●
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html
8 / 22
Les playbooks
●
Ils exécutent un ensemble de taches (tasks) sur des
hôtes (hosts) de manière séquentiel
●
Ils peuvent aussi :
– Emettre des notifications, qui seront utiles pour déclencher
une action dans certaines conditions
– Effectuer des actions conditionnelles selon leur valeur (par
exemple le type de distribution du système)
– Utiliser des templates pour créer ou modifier des fichiers
●
On trouve aussi :
– Des rôles à utiliser
– Des handlers (tâches spécifiques se déclenchant grâce à
une notification)
– Des éléments de configuration pour Ansible (par exemple
l’utilisation de sudo)
– Des variables spécifiques qui ne sont pas reliées à
l’inventaire.
ansible-playbook -i inventory.yml install_apache.yml 9 / 22
ry
t o User Story
S
r Déployer un administrateur
e
Us
Prerequis : Sur la VM (apt install sudo ET usermod -a -G sudo <monuser>)
●
Créer un playbook system.yml
●
Créer un user esiee
– Utiliser le module user
– Ajouter become: true au playbook
– Ajouter -K a la ligne de commande pour le sudo password
●
Déployer la clés SSH des administrateurs à l’utilisateur esiee
– Utiliser le module authorized_keys
– Renseigner les clés dans des fichiers du projet (pas de lookup)
●
Ajouter le user au groupe des sudoers
– Autoriser l’utilisateur à effectuer un sudo sans mot de passe en créant le fichier
/etc/sudoers.d/esiee:
●
esiee ALL=(ALL) NOPASSWD :ALL
●
Valider le bon fonctionnement
– ssh esiee@monip => pas de mdp + sudo su => pas de mdp
– Modifier votre inventaire pour utiliser l’utilisateur esiee désormais
10
Variables
●
Types des variables
– Simple
●
project_name : ‘persoalea’
– Dictionnaire
●
ssh_keys :
– "public_keys/sebastien-fleury"
– "public_keys/john-snow"
●
Utilisation {{project_name}}
●
Les facts sont les variables alimentées par la collecte des caractéristiques serveurs
– ansible –m setup hostname
●
Dans l’inventaire par machine ou par groupe
– db1.digitalseeder.net :
var1 : master
var2 : autrecontenudevariable
●
Dans le playbook pour surcharger les variables par défaut des rôles
●
Dans le rôle comme variable par défaut
– Peuvent être stockés dans les répertoires group_vars, ou host_vars
– group_vars/mygroup/main.yml
11 / 22
Structure de controle
●
S’appliquent sur les taches ou dans les templates
●
Les conditions
– when: ansible_os_family == ‘Debian’
●
Les boucles
– with_items:
●
vim
●
Emacs
– Chaque itération alimente la variable item avec l’index courant du
dictionnaire, on peut ainsi utiliser la variable "{{ item }}"
●
Les inclusions
– include: common-setup.yml
12 / 22
Templates
●
Au format jinga2
●
Utilisation des structures de contrôle
●
Acceptent les variables définies dans le
projet
- name: Copy a new sudoers file into place, after passing validation with visudo
ansible.builtin.template:
src: templates/sudoers/esiee
dest: /etc/sudoers.d/esiee
validate: /usr/sbin/visudo -cf %s
13 / 22
ry
t o User Story
S
r Déployer un message of the day
e
Us
●
Déployer un message of the day
– Le fichier /etc/motd sera affiché par le serveur à la
connexion
●
Utiliser le module templates pour déployer le fichier
– https://docs.ansible.com/ansible/latest/collections/ansible/
builtin/template_module.html
●
Utiliser une variable fact, une variable globale et une
variable dédiée à l’hote
– Host => server_description :
– Global=> project_name :
14
Roles et galaxy ansible
●
Les rôles sont des ensembles de taches génériques réutilisables,
testables et distribuables
●
Création de l’arborescence d’un rôle common
– ansible-galaxy init common
●
Des rôles disponibles en ligne
– ansible-galaxy install geerlingguy.apache
●
Les dépendances s’installent depuis un fichier requirements.yml
– ansible-galaxy install -r requirements.yml
– https://galaxy.ansible.com/docs/using/installing.html
●
Les roles sont téléchargés dans ~/.ansible/roles
15 / 22
Secure Vault
●
Stocker les credentials
●
ansible-vault create group_vars/all.yml
– Use password to encrypt
●
ansible-vault edit group_vars/all.yml
– https://devopssec.fr/article/vaults-ansible
●
Executer le playbook avec l’option
– --ask-vault-pass
16 / 22
●
http://docs.ansible.com/ansible/modules_by_
category.html
●
https://blog.stephane-robert.info/post/ansible-
inventaire-static-precedence-tips/
●
https://www.makeareadme.com/
17 / 22
ry
t o User Story
S
r TP Ansible collaboratif
e
Us
●
Vous êtes en groupes de 3
– 1 projet Gitlab + chaque collaborateur est ajouté
●
Vous créez un projet déployant
– 1 serveur web avec Wordpress
●
Des règles de sécurité iptables n’autorisant que le port HTTP et SSH
– 1 serveur de BDD, les mots de passes seront stockés dans Vault
– 1 serveur DNS supportant le domaine esiee-tp.local
– 1 backup de la bdd en local est effectué tous les jours à 1h00
– Il doit être possible de renseigner plusieurs noms de domaine client
●
Www.esiee99.local
●
Www.esiee98.local
●
Le playbook doit pouvoir être lancé du poste client
●
Vous utilisez une bonne organisation des variables
●
Vous aurez un rôle system
●
Vous pouvez utiliser les roles de la galaxy
●
Présentation à 16h00
18
ry
t o
S TIPS and TRICKS
er
Us
●
Vous pouvez utiliser les roles Galaxy
– geerlingguy mysql
– geerlingguy apache
●
Creer un ticket puis merge request => crée la
branche
– Git fetch pour récupérer en local
– Git checkout pour s’y rendre
– Git push pour envoyer sa branche
– Consulter ensuite sa Merge Request
19
ry
t o
S Playbook GitlabRunner
er
Us
●
Coté Gitlab
– Retirer les runner partagés sur votre groupe de projets Gitlab
– Récupérer le token de groupe pour le runner gitlab
●
Créer un playbook déployant un runner Gitlab
– Utiliser le rôle https://github.com/riemers/ansible-gitlab-runner/
– Enregistrer le runner sur Gitlab en surchargeant la variable
registration_token
– Ajouter le déploiement du serveur web Nginx
●
Créer un nouveau projet Git sample_web_page avec 1 page web
– Créer un fichier .gitlab-ci.yml dans le projet en s’aidant du modèle de la
CI/CD
– Déployer une page web sur un serveur Nginx dans le répertoire
/var/www/html
20
Expertise DevOps depuis
2016
21 / 22
www.digitalseeder.com
22 / 22