Meetup Ansible #1
20 décembre 2018 – organisé par Evolix
- 18h – accueil, discussions…
- 19h – présentation par Grégory et Jérémy (Evolix)
- 20h – apéro
$ who
Jérémy Lecour <jlecour@evolix.fr>
Grégory Colpart <reg@evolix.fr>
$ whois Evolix
EVOLIX-AS : AS 197696
$ man Evolix
Open Source managed hosting provider
$ uptime
up 14 years, 20 users
$ whereis Evolix
/fr/Marseille, /fr/Aix, /fr/Paris, /ca/Montréal
$ top
Linux/BSD servers: 800, customers: 120
- Infogérance / Hébergement dédié et Cloud / Conseil et Formations
- Linux, infra web, HA, virtualisation, conteneurs, Ansible
- Clients : agences web, SaaS, médias
Automatisation de configuration d'infrastructure et déploiement
Objectifs d'Ansible
- homogénéité
- fiabilité
- rapidité
Parfait pour
- tâches répétitives
- actions urgentes
- demandes spécifiques
- déploiement / orchestration
Idempotence
- f(f(x)) = f(x)
- le résultat compte…
- … pas la transformation
- killer-feature
Pas d'agent
- Rien à installer sur les serveurs
- Accès SSH + python
Modularité
- composition d'éléments de base
- extensible, comme un langage
Souplesse et légèreté
Ansible, le projet
- Ansible fait partie de RedHat
- les outils de base sont libres
- surcouche payante pour usage "entreprise"
- développement mixte : RedHat + communauté
Installation
Paquets pour de nombreuses distributions
$ apt install ansible
Commandes de base
$ ansible localhost --module ping
$ ansible localhost --module ping --one-line
$ ansible localhost --module setup
$ ansible localhost --module setup --args "filter=ansible_mem*"
$ ansible localhost --module lineinfile --args \
"dest=/etc/hosts regexp=example.com line='192.168.0.25 example.com'"
Modules
- couche d'abstraction du shell
- homogénéité
- idempotence
Tasks / Handlers
- invocation d'un module avec des paramètres
- le handler n'est exécuté qu'une fois
Playbooks
- exécution procédurale de tâches
- définition du contexte
- orchestration complexe
---
- hosts: localhost
tasks:
- name: example.com in /etc/hosts
lineinfile:
dest: /etc/hosts
regexp: example.com
line: '192.168.0.25 example.com'
state: present
$ ansible-playbook playbook.yml
Roles
- comme un paquet autonome
- contient tasks, handlers, variables, templates…
- inclus dans des playbooks
- structure conventionnelle
- stockés localement ou récupérés dans un registre
$ ansible-galaxy --offline init my-role
- my-role was created successfully
my-role
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
Inventaire et variables
- liste des serveurs
- moyens d'accès
- variables spécifiques (par hôte ou groupe)
inventory/
├── group_vars
│ ├── all.yml
│ ├── hypervisors.yml
│ └── proxies.yml
├── hosts
├── hosts-dev
└── host_vars
├── stack01-data01.yml
├── stack01-front01-web01.yml
└── stack01-front01.yml
kvm01 ansible_host=192.168.2.1
kvm02 ansible_host=192.168.2.2
stack01-front01 ansible_host=192.168.2.1 ansible_port=22020
stack01-front01-web01 ansible_host=192.168.2.1 ansible_port=22101
stack01-data01 ansible_host=192.168.2.1 ansible_port=22010
[hypervisors]
kvm01
kvm02
[fronts]
stack01-front01
[dbs]
stack01-data01
[web]
stack01-front01-web01
Python et YAML
- Ansible est écrit en Python
- … mais ça n'est pas important
- Approche déclarative écrite en YAML
Ansible Galaxy
Ansible Tower / AWX
ansible-roles / EvoLinux
- 69 roles, 2400 commits, 16K loc, 800 jours, 20 contributeurs
- evolinux v2 en beta
- nouvelles install 100% Ansible
- plusieurs infras complètes 100% Ansible
stats du projet sur Github
- 34.379 stars
- ~4000 contributeurs
- ~2100 modules
- 500k téléchargements par mois
autres projets
- Salt : ~9000 stars, ~2000 contributeurs
- Chef : ~5000 stars, ~500 contributeurs
- Puppet : ~5000 stars, ~500 contributeurs
releases Ansible
- Ansible 2.5 : mars 2018
- Ansible 2.6 : juin 2018
- Ansible 2.7 : sortie en octobre 2018
- Ansible 2.8 : prévue pour le 2 mai 2018
Ansible 2.7
- Python 3.5 (Python 2.6 sur les cibles)
- optimisation : une seule invocation de Python au lieu de 2
- ignore_unreachable : skip tâches au lieu de stopper le play
- module reboot
- modules Cloud (AWS/etc.), NetApp, VMware, Windows, etc.
- réseau : 40 plateformes supportées, ~570 modules réseau
- molecule, ansible-lint
C'est l'histoire d'un bug
Contexte
- Nous utilisons ansible 2.2
- la version 2.5 a introduit une régression
- impossible de changer de version, le bug est trop grave
- Ouverture en avril 2018
- une partie du bug initial est corrigé début octobre
- mais le mainteneur conteste le cœur du problème
- comment convaincre ?
Pull request #49409
- des tests qui reflètent le comportement voulu
- une implémentation qui passe les tests
- ajustement des commentaires, de la doc…
- victoire !