Cours 1 - Présentation

Plan

Module 1 : Installer ansible, configurer la connexion et commandes ad hoc ansible

Installation

  • créer un lab avec LXD
  • configurer SSH et python pour utiliser ansible

configurer ansible

  • /etc ou ansible.cfg
  • configuration de la connexion
  • connexion SSH et autres plugins de connection
  • versions de Python et d’Ansible

L’inventaire ansible

  • gérer des groupes de machines
  • L’inventaire est la source d’information principale pour Ansible

Ansible ad-hoc et les modules de base

  • la commande ansible et ses options
  • explorer les nombreux modules d’Ansible
  • idempotence des modules
  • exécuter correctement des commandes shell avec Ansible
  • le check mode pour controller l’état d’une ressource

TP1: Installation, configuration et prise en main avec des commandes ad-hoc

Module 2 : Les playbooks pour déployer une application web

syntaxe yaml des playbooks

  • structure d’un playbook

modules de déploiement et configuration

  • Templates de configuration avec Jinja2
  • gestion des paquets, utilisateurs et fichiers, etc.

Variable et structures de controle

  • explorer les variables
  • syntaxe jinja des variables et lookups
  • facts et variables spéciales
  • boucles et conditions

Idempotence d’un playbook

  • handlers
  • contrôler le statut de retour des tâches
  • gestion de l’idempotence des commandes Unix

debugging de playbook

  • verbosite
  • directive de debug
  • gestion des erreurs à l’exécution

TP2: Écriture d’un playbook simple de déploiement d’une application web flask en python.

Module 3 : Structurer un projet, utiliser les roles

Complexifier notre lab en ajoutant de nouvelles machines dans plusieurs groupes.

  • modules de provisionning de machines pour Ansible
  • organisation des variables de l’inventaire
  • la commande ansible-inventory

Les roles

  • Ansible Galaxy pour installer des roles.
  • Architecture d’un role et bonnes pratiques de gestion des roles.

Écrire un role et organiser le projet

  • Imports et includes réutiliser du code.
  • Bonne pratiques d’organisation d’un projet Ansible
  • Utiliser des modules personnalisés et des plugins pour étendre Ansible
  • gestion de version du code Ansible

TP3: Transformation de notre playbook en role et utilisation de roles ansible galaxy pour déployer une infrastructure multitiers.

Module 4 : Orchester Ansible dans un contexte de production

Intégration d’Ansible

  • Intégrer ansible dans le cloud un inventaire dynamique et Terraform
  • Différents type d’intégration Ansible

Orchestration

  • Stratégies : Parallélisme de l’exécution
  • Délégation de tâche
  • Réalisation d’un rolling upgrade de notre application web grace à Ansible
  • Inverser des tâches Ansible - stratégies de rollback
  • Exécution personnalisée avec des tags

Sécurité

  • Ansible Vault : gestion des secrets pour l’infrastructure as code
  • desctiver les logs des taches sensibles
  • Renforcer le mode de connexion ansible avec un bastion SSH

Exécution d’Ansible en production

  • Intégration et déploiement avec Gitlab
  • Gérer une production Ansible découvrir TOWER/AWX
  • Tester ses roles et gérer de multiples versions

TP4: Refactoring de notre code pour effectuer un rolling upgrade et déploiement dans le cloud + AWX

Présentation d’Ansible

Ansible

Ansible est un gestionnaire de configuration et un outil de déploiement et d’orchestration très populaire et central dans le monde de l'infrastructure as code (IaC).

Il fait donc également partie de façon centrale du mouvement DevOps car il s’apparente à un véritable couteau suisse de l’automatisation des infrastructures.

Histoire

Ansible a été créé en 2012 (plus récent que ses concurrents Puppet et Chef) autour d’une recherche de simplicité et du principe de configuration agentless.

Très orienté linux/opensource et versatile il obtient rapidement un franc succès et s’avère être un couteau suisse très adapté à l’automatisation DevOps et Cloud dans des environnements hétérogènes.

Red Hat rachète Ansible en 2015 et développe un certain nombre de produits autour (Ansible Tower, Ansible container avec Openshift).

Architecture : simplicité et portabilité avec ssh et python

Ansible est agentless c’est à dire qu’il ne nécessite aucun service/daemon spécifique sur les machines à configurer.

La simplicité d’Ansible provient également du fait qu’il s’appuie sur des technologies linux omniprésentes et devenues universelles.

  • ssh : connexion et authentification classique avec les comptes présents sur les machines.
  • python : multiplateforme, un classique sous linux, adapté à l’admin sys et à tous les usages.

De fait Ansible fonctionne efficacement sur toutes les distributions linux, debian, centos, ubuntu en particulier (et maintenant également sur Windows).

Ansible pour la configuration

Ansible est semi-déclaratif c’est à dire qu’il s’exécute séquentiellement mais idéalement de façon idempotente.

Il permet d’avoir un état descriptif de la configuration:

  • qui soit auditable
  • qui peut évoluer progressivement
  • qui permet d'éviter que celle-ci ne dérive vers un état inconnu

Ansible pour le déploiement et l’orchestration

Peut être utilisé pour des opérations ponctuelles comme le déploiement:

  • vérifier les dépendances et l’état requis d’un système
  • récupérer la nouvelle version d’un code source
  • effectuer une migration de base de données (si outil de migration)
  • tests opérationnels (vérifier qu’un service répond)

Ansible à différentes échelles

Les cas d’usages d’Ansible vont de …:

  • petit:

    • … un petit playbook (~script) fournit avec le code d’un logiciel pour déployer en mode test.
    • … la configuration d’une machine de travail personnelle.
    • etc.
  • moyen:

    • … faire un lab avec quelques machines.
    • … déployer une application avec du code, une runtime (php/jav etc) et une base de données à migrer.
    • etc.
  • grand:

    • … gestion de plusieurs DC avec des produits multiples.
    • … gestion multi-équipes et logging de toutes les opérations grâce à Ansible Tower.
    • etc.

Ansible et Docker

Ansible est très complémentaire à docker:

  • Il permet de provisionner des machines avec docker ou kubernetes installé pour ensuite déployer des conteneurs.
  • Il permet une orchestration simple des conteneur avec le module docker_container.

Plus récemment avec l’arrivé d'Ansible container il est possible de construire et déployer des conteneurs docker avec du code ansible. Cette solution fait partie de la stack Red Hat Openshift. Concrêtement le langage ansible remplace (avantageusement ?) le langage Dockerfile pour la construction des images Docker.

Partie 1, Installation, configuration et commandes ad hoc.

Pour l’installation plusieurs options sont possibles:

  • Avec le gestionnaire de paquet de la distribution ou homebrew sur OSX:
    • version généralement plus ancienne (2.4 ou 2.6)
    • facile à mettre à jour avec le reste du système
    • Pour installer une version récente on il existe des dépots spécifique à ajouter: exemple sur ubuntu: sudo apt-add-repository --yes --update ppa:ansible/ansible
  • Avec pip le gestionnaire de paquet du langage python: sudo pip3 install
    • installe la dernière version stable (2.8 actuellement)
    • commande d’upgrade spécifique sudo pip3 install ansible --upgrade
    • possibilité d’installer facilement une version de développement pour tester de nouvelles fonctionnalité ou anticiper les migrations.

Pour voir l’ensemble des fichier installé par un paquet pip3 :

pip3 show -f ansible | less

Pour tester la connexion aux serveurs on utilise la commande ad hoc suivante. ansible all -m ping

Les inventaires statiques

Il s’agit d’une liste de machines sur lesquelles vont s’exécuter les modules Ansible. Les machines de cette liste sont:

  • Classées par groupe et sous groupes pour être désignables collectivement (exp executer telle opération sur)

  • La méthode connexion est précisée soit globalement soit pour chaque machine.

  • Des variables peuvent être définies pour chaque machine ou groupe pour contrôler dynamiquement par la suite la configuration ansible.

  • Classées par groupe et sous groupes pour être désignables collectivement (exp executer telle opération sur)

  • La méthode connexion est précisée soit globalement soit pour chaque machine.

  • Des variables peuvent être définies pour chaque machine ou groupe pour contrôler dynamiquement par la suite la configuration ansible.

Exemple :

[all:vars]
ansible_ssh_user=elie
ansible_python_interpreter=/usr/bin/python3

[awx_nodes]
awxnode1 node_state=started ansible_host=10.164.210.101 container_image=centos_ansible_20190901

[dbservers]
pgnode1 node_state=started ansible_host=10.164.210.111 container_image=centos_ansible_20190901
pgnode2 node_state=started ansible_host=10.164.210.112 container_image=centos_ansible_20190901

[appservers]
appnode1 node_state=started ansible_host=10.164.210.121 container_image=centos_ansible_20190901
appnode2 node_state=started ansible_host=10.164.210.122 container_image=centos_ansible_20190901

Les inventaires peuvent également être au format YAML (plus lisible mais pas toujours intuitif) ou JSON (pour les machines).

Configuration

Ansible se configure classiquement au niveau global dans le dossier /etc/ansible/ dans lequel on retrouve en autre l’inventaire par défaut et des paramètre de configuration.

Ansible est très fortement configurable pour s’adapter à des environnement contraints. Liste des paramètre de configuration:

Alternativement on peut configurer ansible par projet avec un fichier ansible.cfg présent à la racine. Toute commande ansible lancée à la racine du projet récupère automatiquement cette configuration.

La commande ansible

  • version minimale : ansible <groupe_machine> -m <module> -a <arguments_module>

  • ansible all -m ping: Permet de tester si les hotes sont joignables et ansible utilisable (SSH et python sont présents et configurés).

  • version plus complète : ansible <groupe_machine> --inventory <fichier_inventaire> --become -m <module> -a <arguments_module>

Les modules Ansible

Ansible fonctionne grâce à des modules python téléversés sur sur l’hôte à configurer puis exécutés. Ces modules sont conçus pour être cohérents et versatiles et rendre les tâches courantes d’administration plus simples.

Il en existe pour un peu toute les tâches raisonnablement courantes : un slogan Ansible “Batteries included” ! Plus de 1300 modules sont intégrés par défaut.

  • ping: un module de test Ansible (pas seulement réseau comme la commande ping)

  • yum/apt: pour gérer les paquets sur les distributions basées respectivement sur Red Hat ou Debian.

... -m yum -a "name=openssh-server state=present"

  • systemd (ou plus générique service): gérer les services/daemons d’un système.

... -m systemd -a "name=openssh-server state=started"

  • user: créer des utilisateurs et gérer leurs options/permission/groupes

  • file: pour créer, supprimer, modifier, changer les permission de fichiers, dossier et liens.

  • shell: pour exécuter des commandes unix grace à un shell

Option et documentation des modules

La documentation des modules Ansible se trouve à l’adresse https://docs.ansible.com/ansible/latest/modules/file_module.html

Chaque module propose de nombreux arguments pour personnaliser son comportement:

exemple: le module file permet de gérer de nombreuses opérations avec un seul module en variant les arguments.

Il est également à noter que la plupart des arguments sont facultatifs.

  • cela permet de garder les appel de modules très succints pour les taches par défaut
  • il est également possible de rendre des paramètres par défaut explicites pour augmenter la clarté du code.

Exemple et bonne pratique: toujours préciser state: present même si cette valeur est presque toujours le défaut implicite.

Commençons le TP1