Infrastructure as Code Ansible Terraform Packer, © François-Emmanuel Goffinet, 2019
Support de formation de formation sur l’Infrastructure as Code (IaC), ses concepts et ses outils : Ansible, Terraform, Packer.
Pour la solution de lab, il est notamment proposé d’utiliser Tutoriels interactifs Ansible avec une installation très simple via Docker, mais d’autres solutions sont envisagées ou envisageables avec Docker, Vagrant/KVM/VirtualBox, Libvirtd, … tout prestataire de services IaaS dans le nuage.
Les livres de jeu exposés dans ce support sont maintenus (dans une certaine mesure) à l’adresse https://github.com/goffinet/guide-ansible-playbooks.
On trouvera aussi un Quiz Ansible fondamental qui vérifie la connaissance de concepts fondamentaux sur Ansible. Il s’agit d’un questionnaire (à choix multiples) de dix questions puisées dans une banque plus large avec vingt minutes de temps alloué. Il n’y a pas de limites dans le nombre d’essais.
Enfin, en plus de la publication de ce support sur le Web en HTML en intégration continue grâche GitHub, Gitlab-CI, Netlify, Cloudflare et GoHugo avec le thème Learn, l’auteur offre gratuitement la version PDF du support de formation généré grâce à Gitbook-cli et Calibre.
Infrastructure as Code Ansible Terraform Packer, © François-Emmanuel Goffinet, 2019
Copyright © Red Hat, Inc | Ansible.
Ansible is released under the terms of the GPLv3 License.
License MIT github.com/network-automation/linklight
Copyright © Cisco Systems
Partie I. Infrastructure as Code Introduction à l'Infrastructure as Code L'Infrastructure as Code, IaC (en tant que) est un type d'infrastructure informatique que les équipes d'exploitation peuvent automatiquement gérer et approvisionner via du code, plutôt que d'utiliser un processus manuel ou interactif. L'infrastructure en tant que code est parfois appelée infrastructure programmable. On trouvera dans cet article les principes, les objectifs, le marché et une présentation des outils IaC Infrastructure as Code.
L'Infrastructure as Code, IaC (en tant que) est un type d'infrastructure informatique que les équipes d'exploitation peuvent automatiquement gérer et approvisionner via du code, plutôt que d'utiliser un processus manuel ou interactif. L'infrastructure en tant que code est parfois appelée infrastructure programmable. On trouvera dans cet article les principes, les objectifs, le marché et une présentation des outils IaC Infrastructure as Code.
On trouvera ici une introduction à DevOps
Exécution sur AWS EC2, Création d'une instance EC2 avec aws cli
Introduction à Terraform
Installation de Terraform
Terraform et Ansible
Packer et Ansible
Partie II. Ansible Fondamental Cette partie du support de formation intitulée “Ansible Fondamental” a pour principal objet la gestion de noeuds Linux qui supportent différents types d’applications OpenSource. Le document suit le cahier des charges des formations officielles Red Hat (Voyez le document Programmes de formation Ansible). Objectifs du support de formation Le support de cours poursuit les objectifs suivants : Comprendre les composants de base d’Ansible Inventaires Modules Variables “Facts” Jeux Playbooks Fichiers de configuration Exécuter des commandes ad-hoc Ansible Utiliser des inventaires statiques et dynamiques pour définir des groupes d’hôtes Utiliser un script d’inventaire dynamique existant Créez des jeux et des playbooks Ansible Savoir travailler avec les modules Ansible d’usage courant Utiliser des variables pour récupérer les résultats de l’exécution d’une commande Utiliser les conditions (“conditionals”) pour contrôler l’exécution de la lecture Configurer la gestion des erreurs Créer des playbooks pour configurer les systèmes dans un état spécifié Exécuter sélectivement des tâches spécifiques dans des playbooks à l’aide de balises (“tags”) Créer et utiliser des modèles pour créer des fichiers de configuration personnalisés Travailler avec des variables et des “Facts” Ansibles Créer et travailler avec les rôles Télécharger des rôles depuis Ansible Galaxy et les utiliser Gérer le parallélisme Utilisez Ansible Vault dans les playbooks pour protéger les données sensibles Installer Ansible Tower et l’utiliser pour gérer les systèmes Utiliser la documentation fournie pour rechercher des informations spécifiques sur les modules et commandes Ansible Installer Vagrant ou Docker et les utiliser pour tester des playbooks Environnement de lab L’auteur suggère d’utiliser sa solution https://github.
Ce document est une description du projet Ansible à lire en regard du document de présentation sur l'Infrastructure as Code.
Ce document décrit la terminologie et les composants Ansible. On tentera ici de comprendre de manière sommaire les composants de base d'Ansible tels que les connexions selon les cibles, les inventaires, les modules, le mode ad-hoc, les variables, les Facts, les jeux, les playbooks ou livres de jeux, les fichiers de configuration YAML et INI, les sorties JSON et les modèles Jinja2, les rôles, Ansible Tower, l'idempotence.
Ce document indique les procédures d'installation de Ansible sur une machine de contrôle Red Hat, CentOS, Fedora, Debian, Ubuntu, via PIP ou encore sous Windows WSL.
Ce document propose d'examiner les principales options de configuration de Ansible sur le noeud de contrôle. Son architecture son agent laisse le soin à chacun de configurer finement et personnellement le comportement par défaut de la solution. Le comportement d'Ansible peut être influencé de différentes manières : en configurant des variables d'environnement, en passant directement les paramètres sur la ligne de commande `ansible` ou `ansible-playbook`, en définissant un fichier de configuration `ansible.cfg`
Ansible vient avec plusieurs programmes. ansible est le programme initial pour l’exécution de commandes ad-hoc, ansible-config Vérifie la configuration courante d’Ansible, ansible-inventory Liste les informations de l’inventaire en format JSON ou YAML, ansible-doc Permet de consulter la documentation hors-ligne, ansible-playbook Permet d’exécuter des livres de jeu, ansible-vault Permet de chiffrer les fichiers qui contiennent des données sensibles, ansible-galaxy Permet de gérer des rôles sur Ansible galaxy, ansible-console Offre une console interactive REPL pour l’exécution de tâches Ad-Hoc, ansible-pull ansible-pull est un petit script qui prend ses informations de configuration d’un repo git et qui exécute un livre de jeu Ansible sur ce contenu, ansible-test Utilitaire de test
Ansible présente en sortie standard les résultats de ses actions en format JSON. On présentera ici le format JSON et son traitement avec l'outil jq. Ansible utilise le format YAML pour ses fichiers de données statiques pour la facilité d'usage. Enfin, les variables sont présentées dans Ansible grâce aux modèles Jinja2.
Une inventaire peut être une collection d'hôtes définis dans un fichier plat ou un script dynamique (qui interroge un CMDB par exemple) qui génère une liste de périphériques à utiliser dans les livres de jeux. Il est peut être statique, soit défini d'avance ; il peut se créer dynamiquement ou encore être mis à jour dynamiquement. La portée d'un jeu (play) au sein du livre de jeu, le playbook, est limitée aux groupes d'hôtes définis dans l'inventaire (inventory).
Ce document poursuite l'objectif d'expliquer le concept, le rôle, la manipulation et les codes de retour des modules. Le développement de modules devrait faire l'objet d'un document spécifique. Les modules Ansible sont des bouts de codes écrits principalement en Python (mais tout langage supportant les retours JSON est autorisé) pour modifier l'état d'une propriété d'un hôte. Les modules sont invoqués par l'exécution de tâches soit directement dans la ligne de commande `ansible` ou dans des livres de jeu avec la commande `ansible-playbook`.
Synthèse sur les livres de jeu.
Jouer avec les facts, les variables, les conditions et les boucles.
Il est possible d' inclure ou d'importer dans un livre de jeu des fichiers qui comprennent une liste de jeux ou de tâches. L'importation est statique et l'inclusion est dynamique. Ansible Galaxy fait référence au site Web de Galaxy https://galaxy.ansible.com à partir duquel les utilisateurs peuvent partager des rôles. Il fait aussi référence à un outil en ligne de commande pour l’installation, la création et la gestion de rôles à partir de dépôts git. Les rôles permettent de charger automatiquement certains fichiers vars_files, tasks et handlers en fonction d'une structure de fichier connue. Le regroupement de contenu par rôles permet également de les partager facilement avec d'autres utilisateurs. En bref, une organisation en rôle n'est jamais qu'une manière d'abstraire son livre de jeu. Toutes les règles de conception d'un livre de jeu sont respectées sur base d'une structure de fichiers et de dossiers connue.
Si vous avez un grand livre de jeu, il peut s'avérer utile de ne pouvoir en exécuter qu'une partie spécifique plutôt que de tout lire dans le livre. Ansible prend en charge un attribut tags: pour cette raison.
Gestion des Erreurs Ansible : Ignorer les tâches en échec, Contrôler l'état changed, Contrôler l'état failed, Tâche en échec et handlers, Module fail
Gestion des connexions dans Ansible.
Ansible-vault est un outil intégré à Ansible qui permet de chiffrer les fichiers qui contiennent des données sensibles.
Inventaire dynamique Ansible
Ansible Tower est Ansible au niveau de l'entreprise. Il s’agit d’une solution Web permettant de gérer une organisation avec une interface utilisateur très simple qui fournit un tableau de bord avec des résumés de l’état de tous les hôtes, qui permet des déploiements rapides et surveille toutes les configurations. Tower permet de partager les informations d'identification SSH sans les exposer, de consigner tous les travaux, de gérer graphiquement les inventaires et de les synchroniser avec un large éventail de fournisseurs clouds.
https://docs.ansible.com/ansible/latest/reference_appendices/glossary.html Action Une action fait partie d’une tâche qui précise les modules à exécuter et les arguments à transmettre à ce module. Chaque tâche ne peut avoir qu’une seule action, mais elle peut aussi avoir d’autres paramètres. Ad Hoc Désigne l’exécution d’Ansible pour exécuter une commande rapide, en utilisant /usr/bin/ansible, plutôt que le langage d’orchestration, qui est /usr/bin/ansible-playbook. Un exemple de commande ad hoc pourrait être le redémarrage de 50 machines dans votre infrastructure.
Partie III. Ansible Linux (DevOps) Partie Automation Ansible Linux. Environnement de lab Linux Ansible Environnement de lab Linux Ansible 1. Installation du stack Libvirtd Afin de mieux profiter des capacités de virtualisation d’un hôte Linux, il est recommandé d’installer le stack “libvirtd”. Installation des pré-requis : echo "Go to the home folder" cd echo "Install Git" apt-get -y install git echo "Clone the virt-script repo on Github" git clone https://github.
Environnement de lab Linux Ansible 1. Installation du stack Libvirtd Afin de mieux profiter des capacités de virtualisation d’un hôte Linux, il est recommandé d’installer le stack “libvirtd”. Installation des pré-requis : echo "Go to the home folder" cd echo "Install Git" apt-get -y install git echo "Clone the virt-script repo on Github" git clone https://github.com/goffinet/virt-scripts echo "Go to the virt-scripts folder" cd virt-scripts echo "Install the requirements" ./autoprep.sh systemctl stop apache2 Test en lançant trois invités :
Source Source : https://github.com/goffinet/guide-ansible-playbooks/tree/master/ansible-linux/08-mode-adhoc Liste des modules utilisés ping setup apt service yum easy_install iptables mysql_user user group stat copy fetch file git 1. Pré-requis Le mode ad-hoc permet d’exécuter des tâches ad-hoc. Rappelons qu’une tâche n’est rien d’autre que l’appel à un module. Un fichier de configuration et un inventaire sont nécessaires. [webservers] app1 app2 [dbservers] db [all:vars] ansible_connection=ssh ansible_user=root ansible_ssh_pass=testtest 2. Se documenter Se documenter sur la commande ansible La commande ansible offre la possibilité d’exécuter des modules ansible de manière “ad-hoc”, c’est à dire tâche par tâche, commande par commande.
1. Source Source : https://github.com/goffinet/guide-ansible-playbooks/tree/master/ansible-linux/09-un-premier-playbook 2. Variables Il est de bonne pratique d’organiser ses procédures avec des variables. Les variables Ansible peuvent être déclarées à différents endroits. Dans l’inventaire ou dans les group_vars/’ ou ‘host_vars/. Mais aussi dans le livre de jeu, sous forme de : valorisation directe en référence à un fichier en incluant des variables d’environnement par “inclusion” sont générés ou récoltées dynamiquement (facter) viennent de l’inventaire sont définies par défaut dans un rôle Les variables sont applées en format Jinja2 sous la forme : {{ interface }} ou encore {{ ipv4.
Source Source : https://github.com/goffinet/guide-ansible-playbooks/tree/master/ansible-linux/10-deployer-un-serveur-nodejs-centos Objectifs Un second livre de jeu. Enregistrement de variables (register:) et appel de la variable dans une autre tâche sous condition (when:) 1. Présentation Dans cet exemple, on déploie une application Node.JS avec NPM sur Centos. Il s’agit d’un exemple de déploiement simple d’un stack de développement. 2. Variables On définit une variable node_apps_location dans le jeu. On peut définir la variable dans la ligne de commande --extra-vars="node_apps_location=/usr/local/opt/node"
Simple livre de jeu Source Source : https://github.com/goffinet/guide-ansible-playbooks/tree/master/ansible-linux/11-lamp-drupal-ubuntu 1. Défintion du jeu --- - hosts: all become: yes vars_files: - vars.yml pre_tasks: - name: Update apt cache if needed. apt: update_cache=yes cache_valid_time=3600 handlers: - name: restart apache service: name=apache2 state=restarted 2. Variables Le livre de jeu est accompagné d’un fichier vars.yml qui contient des variables : --- # The core version you want to use (e.g. 8.5.x, 8.6.x). drupal_core_version: "8.
Ce lab poursuit uniquement objectif pédagogique, intellectuel et démonstratif qui démarre d’une “solution d’infrastructure” parmi beaucoup d’autres possiblités. Aussi, une mise en production exigerait une autre approche probablement orientée sur l’application et les services qu’elle rendra aux clients. Source originale : https://github.com/geerlingguy/ansible-for-devops/tree/master/lamp-infrastructure. Livres de jeu adaptés : https://github.com/goffinet/ansible-for-devops/, dans le dossier lamp-infrastructure. 1. Architecture de l’infrastructure Voici l’architecture de départ constituée de six serveurs Centos 7 : Un serveur Cache/Reverse Proxy/Load Balancer “Frontend” Varnish.
Solutions
Partie IV. Ansible Réseau Partie Ansible Réseau. Ces documents sont fondés sur les Workshops sous License MIT du projet “github.com/network-automation/linklight” qui ont été adaptés et traduits de manière libre. Mais on sera aussi curieux dans la consultation de la page officielle Ansible for Network Automation. En dernière étape, la démarche vous invite à exploiter vos livres de jeu et rôles avec Ansible Tower ou Ansible AWX. Prérequis Lab Ansible automation réseau 1.
1. Installation de GNS3 Server sur un serveur (distant) Installation de GNS3 Server sur un serveur (distant). cd /tmp curl https://raw.githubusercontent.com/GNS3/gns3-server/master/scripts/remote-install.sh \ > gns3-remote-install.sh bash gns3-remote-install.sh --with-openvpn Il sera nécessaire de redémarrer matériellement le serveur. On charge une topologie mise à disposition et on attaque la gestion directement à partir de l’hôte de virtualisation ou à partir d’un hôte dans la topologie. 2. Préparation des périphériques Les noeuds gérés, s’ils sont en Linux/Unix, doivent disposer de Python 2.
Étape 1 : Dossier de travail Créer si n’est déjà fait le dossier networking-workshop et s’y rendre. mkdir networking-workshop cd networking-workshop/ Étape 2 : Vérification de la configuration Lancer la commande ansible avec l’option --version pour examiner sa configuration. ansible --versionansible 2.6.2 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.
1. Rappel théoriques Maintenant que vous en savez assez sur le fichier d’inventaire et les variables de groupe et d’hôte, nous allons écrire notre premier livre de jeu. Définition d’un premier livre de jeu Le livre de jeu est une liste (de jeux) qui commence par trois “dash” : --- La cible d’un jeu est défini par la directive hosts qui désigne soit : un hôte ou un groupe le groupe all l’hôte implicite localhost Il est utile définir le plugin de connexion : connection : network_cli La collection de facts est générée par le module ios_facts.
1. Théorie Modules Les modules sont ces pièces de code qui font le job d’Ansible, ils sont exécutés pour chaque tâche d’un livre de jeu. Il sont typiquement écrits en Python (mais pas seulement). Il sont idempotent (pas nécessairement leur usage). Les modules prennent les entrées des utilisateurs en paramètres (arguments). Modules pour l’automation du réseau Les modules Ansible pour l’automation du réseau sont désignés par le constructeur de l’OS suivi d’un nom de module :
1. Théorie Le module *_config Les modules *_config spécifiques aux fabricants de solutions permettent notamment de mettre à jour la configuration des périphériques du réseau. Il existe plusieurs manières d’utiliser le module *_config. Pour placer des commandes de configuration : tasks: - name: ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT ios_config: commands: - snmp-server community ansible-public RO - snmp-server community ansible-private RW - snmp-server community ansible-test RO Pour placer un fichier de configuration :
1. Théorie Sauvegarder la configuration d’un routeur --- - name: BACKUP ROUTER CONFIGURATIONS hosts: cisco connection: network_cli gather_facts: no tasks: - name: BACKUP THE CONFIG ios_config: backup: yes register: config_output Le paramètre backup du module ios_config déclenche la sauvegarde de la configuration et l’enregistre dans le dossier local backup/. Nettoyer la configuration sauvegardée La configuration rapratriée commencera par deux lignes qui doivent être enlevées : Building configuration... Current configuration with default configurations exposed : 393416 bytes Le module lineinfile est celui qui permet de manipuler les lignes de texte des fichiers à la manière de sed.
1. Théorie Modèles Ansible intègre nativement le “template engine” Jinja2 (un logiciel qui met en forme des données) Les modèles de données sont transformés en configuration de périphériques Les sorties des périphériques peuvent être transformées en documentation Jinja2 permet aux utilisateurs de manipuler des variables, d’y appliquer une logique conditionnelle et répétitive et donc d’étendre la programmabilté dans l’automation du réseau. Source de l’image : TempEngGen015.svg Utiliser des modèles pour générer une configuration Un modèle de données en YAML :
1. Données structurées et rôles Des données structurées à partir des commandes show A partir de cette commande show interface : rtr2#show interfaces GigabitEthernet1 is up, line protocol is up Hardware is CSR vNIC, address is 0e56.1bf5.5ee2 (bia 0e56.1bf5.5ee2) Internet address is 172.17.16.140/16 MTU 1500 bytes, BW 1000000 Kbit/sec, DLY 10 usec, reliability 255/255, txload 1/255, rxload 1/255 Encapsulation ARPA, loopback not set Keepalive set (10 sec) Full Duplex, 1000Mbps, link type is auto, media type is Virtual output flow-control is unsupported, input flow-control is unsupported ARP type: ARPA, ARP Timeout 04:00:00 .
https://github.com/goffinet/ansible-ccna-lab/blob/master/README.md 1. Résumé On trouvera ici des livres de jeu Ansible inspirés des topologies et des sujets du Cisco CCNA (et plus) pour GNS3 (Cisco IOSv). Leur but est uniquement pédagogique visant à lier les compétences de gestion du réseau du CCNA avec un outil IaC (“Infrastructure as Code”) de gestion des configurations (“Configuration Management”) comme Ansible et un gestionnaire de source (“Source Control Management”) comme Git/Github. Il s’agit aussi d’avoir sous la main un outil souple pour créer et gérer des scénarios de labs qui demandent une préconfiguration ou des changements de configuration (afin de créer des erreurs à corriger manuellement par exemple).
Partie V. Ansible Avancé Partie Ansible Avancé. Ansible et Docker 1. Démarrer une automation Ansible de Docker Voir Getting Started with Docker. 2. Ansible pour gérer des conteneurs Docker ansible-container, ansible-container on Github “ansible-container” fournit un workflow basé sur Ansible pour la création, l’exécution, le test et le déploiement de conteneurs. Ansible Container vous permet de créer des images de conteneur et de les orchestrer en utilisant uniquement les livres de jeu Ansible.
1. Démarrer une automation Ansible de Docker Voir Getting Started with Docker. 2. Ansible pour gérer des conteneurs Docker ansible-container, ansible-container on Github “ansible-container” fournit un workflow basé sur Ansible pour la création, l’exécution, le test et le déploiement de conteneurs. Ansible Container vous permet de créer des images de conteneur et de les orchestrer en utilisant uniquement les livres de jeu Ansible. Décrivez votre application dans un seul fichier YAML et, plutôt que d’utiliser un fichier Dockerfile, répertoriez les rôles Ansible qui constituent vos images de conteneur.
Source : https://gist.github.com/michaellihs/dce661376674692f0e8a5694ece2ffb6 1. Molecule Molecule aids in the development and testing of Ansible roles. https://molecule.readthedocs.io. 2. Testing avec Ansible https://www.ansible.com/blog/testing-ansible-roles-with-docker http://docs.ansible.com/ansible/latest/test_strategies.html https://www.ansible.com/blog/five-questions-testing-ansible-playbooks-roles https://github.com/chrismeyersfsu/provision_docker Testing Ansible Roles & Projects https://www.youtube.com/watch?v=5nddt6X2Alg&feature=youtu.be
Voir guide-ansible-playbooks/ansible-api-gns3 Module uri Module wait_for_connection Module wait_for
Provision d'instances AWS EC2
Partie VI. Annexes Annexes. Bibliographie Ansible Bibliographie Ansible Documentation Ansible Jason Edelman, Network Automation with Ansible, O’Reilly Media, Inc, 2016. Lorin Hochstein, Rene Moser, Ansible: Up and Running, 2nd Edition, O’Reilly Media, Inc, 2018., Github Repo Ansible Automation Workshops Jeff Geerling, Ansible for DevOps, Server and configuration management for humans, LeanPub, 2018 Github Repo Liens Ansible Training Course for Ansible Network Automation Ansible role for hardening a Cisco IOS router or switch https://www.
Bibliographie Ansible Documentation Ansible Jason Edelman, Network Automation with Ansible, O’Reilly Media, Inc, 2016. Lorin Hochstein, Rene Moser, Ansible: Up and Running, 2nd Edition, O’Reilly Media, Inc, 2018., Github Repo Ansible Automation Workshops Jeff Geerling, Ansible for DevOps, Server and configuration management for humans, LeanPub, 2018 Github Repo Liens Ansible Training Course for Ansible Network Automation Ansible role for hardening a Cisco IOS router or switch https://www.
Ansible Network Tâches supplémentaires désactiver les bannières Spécificités automation réseau : https://docs.ansible.com/ansible/2.5/network/getting_started/network_differences.html Types de connexion Ansible https://docs.ansible.com/ansible/latest/network/user_guide/platform_index.html Connexion IOS CLI Exemple IOS CLI group_vars/ios.yml ansible_connection: network_cli ansible_network_os: ios ansible_user: myuser ansible_ssh_pass: !vault... ansible_become: yes ansible_become_method: enable ansible_become_pass: !vault... ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q bastion01"' Exemple NXOS CLI group_vars/nxos.yml ansible_connection: network_cli ansible_network_os: nxos ansible_user: myuser ansible_ssh_pass: !vault... ansible_become: yes ansible_become_method: enable ansible_become_pass: !vault... ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q bastion01"' Exemple NX-API group_vars/nxos.
Formation Ansible Essentials: Simplicity in Automation Technical Overview Découvrez les bases de l’automatisation et de la gestion de la configuration avec Ansible et bien plus encore Les vidéos de la série L’essentiel d’Ansible : automatiser en toute simplicité - Présentation technique (DO007) sont disponibles en ligne et à la demande. Elles vous permettront de tout savoir sur Ansible : automatisation, gestion de la configuration, provisionnement, déploiement et gestion d’une infrastructure de calcul dans des environnements physiques, virtuels et cloud.