# 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

GC
Bonjour à tous,
Jérémy et moi-même faisons partie d'Evolix, entreprise créée en 2004,
on propose des services d'hébergement et d'infogérance à base de Logiciels Libres.
Nous avons des bureaux et une équipe en France et au Canada.
Pour situer, nous infogérons 800 serveurs pour 120 infras client.

- Infogérance / Hébergement dédié et Cloud / Conseil et Formations
- Linux, infra web, HA, virtualisation, conteneurs, Ansible
- Clients : agences web, SaaS, médias

GC
Notre 1er métier, l'infogérance = prendre soin des serveurs
Infra d'hébergement sur 4 datacenters, opère notre réseau
On fait du conseil et de la formation sur mesure.
contrairement à nos concurrents, 22h00 pas une astreinte, une vraie équipe.
Mots clés, technologies d'expertise.
Nos clients. On a des supers clients, on a le luxe de les choisir, on aime les défis !

#### 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

## Principes fondateurs

### Idempotence

- f(f(x)) = f(x)
- le résultat compte…
- … pas la transformation
- killer-feature

- on décrit l'état final souhaité
- le logiciel fait les actions nécessaires pour y arriver

### Pas d'agent

- Rien à installer sur les serveurs
- Accès SSH + python

- rien à installer de spécifique sur les serveurs
- dépend seulement d'un accès SSH et un interpêteur Python

### Modularité

- composition d'éléments de base
- extensible, comme un langage

### Souplesse et légèreté

- on peut utiliser Ansible de manière ponctuelle et l'abandonner sans artefacts
- il ne cherche pas à mettre la main sur tout le serveur
- adoption progressive : one-shot → 100 % Infra As Code

## Ansible, le projet

- Ansible fait partie de RedHat
- les outils de base sont libres
- surcouche payante pour usage "entreprise"
- développement mixte : RedHat + communauté

## Démarrage

### 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'"

## Éléments de base

### 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

- contexte = variables, serveurs concernés, connexion…
- orchestration = déploiement multi-tiers, ex. load-balancer en mode sequentiel

                          ---
                          - 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

On retrouve la même action qu'avec le CLI

    $ ansible

### 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

grouper les serveurs

- par responsabilité (ex. web, db, lb…),
- par datacenter,
- par client,
- par famille d'OS…

On peut avoir autant de groupe qu'on veut, même superposés

### Python et YAML

- Ansible est écrit en Python
- … mais ça n'est pas important
- Approche déclarative écrite en YAML

YAML = sérialization de données, avec types de base
pas de structures conditionnelles (if, for, while…)
ni programmation, ni balisage
~ JSON, plus compact mais sensible aux espaces
lisible par les humains et les machines

### Ansible Galaxy

- Registre publique de rôles, géré par Ansible/RedHat
- comme NPM pour Node, Rubygems pour Ruby…

### 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

# Des nouvelles d'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

## Issue #38655

- 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 !

# Merci

## à vos questions

# Et la suite ?

- dites-nous ce que vous espérez
- venez parler de vos cas d'usages
- www.meetup.com/Ansible-Marseille/
- @ansible_mrs