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
Ansible

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

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é

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

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

Ansible Tower / AWX

Ansible Tower

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 ?