506 lines
20 KiB
HTML
506 lines
20 KiB
HTML
<!doctype html>
|
||
<html>
|
||
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||
|
||
<title>Meetup Ansible #1 – Grégory Colpart & Jérémy Lecour – 20 décembre 2018</title>
|
||
|
||
<link rel="stylesheet" href="css/reveal.css">
|
||
<link rel="stylesheet" href="css/theme/evolix_blue.css">
|
||
|
||
<!-- Theme used for syntax highlighting of code -->
|
||
<link rel="stylesheet" href="lib/css/zenburn.css">
|
||
|
||
<!-- Printing and PDF exports -->
|
||
<script>
|
||
var link = document.createElement( 'link' );
|
||
link.rel = 'stylesheet';
|
||
link.type = 'text/css';
|
||
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
|
||
document.getElementsByTagName( 'head' )[0].appendChild( link );
|
||
</script>
|
||
</head>
|
||
|
||
<body>
|
||
<div class="reveal">
|
||
<div class="slides">
|
||
<section>
|
||
<h1>Meetup Ansible #1</h1>
|
||
<p>
|
||
<small>20 décembre 2018 – organisé par Evolix</small>
|
||
</p>
|
||
<ul>
|
||
<li>18h – accueil, discussions…</li>
|
||
<li>19h – présentation par Grégory et Jérémy (Evolix)</li>
|
||
<li>20h – apéro</li>
|
||
</ul>
|
||
</section>
|
||
|
||
<section>
|
||
<pre style="max-width: 55%;"><code class="hljs nohighlight" data-noescape data-trim style="max-height: 600px;">
|
||
<b>$ who</b>
|
||
Jérémy Lecour <jlecour@evolix.fr>
|
||
Grégory Colpart <reg@evolix.fr>
|
||
|
||
<b>$ whois Evolix</b>
|
||
EVOLIX-AS : AS 197696
|
||
|
||
<b>$ man Evolix</b>
|
||
Open Source managed hosting provider
|
||
|
||
<b>$ uptime</b>
|
||
up 14 years, 20 users
|
||
|
||
<b>$ whereis Evolix</b>
|
||
/fr/Marseille, /fr/Aix, /fr/Paris, /ca/Montréal
|
||
|
||
<b>$ top</b>
|
||
Linux/BSD servers: 800, customers: 120
|
||
</code></pre>
|
||
|
||
<aside class="notes">
|
||
<b>GC</b>
|
||
<br>Bonjour à tous,
|
||
<br>Jérémy et moi-même faisons partie d'Evolix, entreprise créée en 2004,
|
||
<br>on propose des services d'hébergement et d'infogérance à base de Logiciels Libres.
|
||
<br>Nous avons des bureaux et une équipe en France et au Canada.
|
||
<br>Pour situer, nous infogérons 800 serveurs pour 120 infras client.
|
||
</aside>
|
||
</section>
|
||
|
||
<section>
|
||
<img width="400" src="img/Evolix-400x150px.png" class="plain">
|
||
|
||
<br>
|
||
|
||
<ul>
|
||
<li class="fragment">Infogérance / Hébergement dédié et Cloud / Conseil et Formations</li>
|
||
<li class="fragment">Linux, infra web, HA, virtualisation, conteneurs, Ansible</li>
|
||
<li class="fragment">Clients : agences web, SaaS, médias</li>
|
||
</ul>
|
||
|
||
<aside class="notes">
|
||
<b>GC</b>
|
||
<br>Notre 1er métier, l'infogérance = prendre soin des serveurs
|
||
<br>Infra d'hébergement sur 4 datacenters, opère notre réseau
|
||
<br>On fait du conseil et de la formation sur mesure.
|
||
<br>contrairement à nos concurrents, 22h00 pas une astreinte, une vraie équipe.
|
||
<br>Mots clés, technologies d'expertise.
|
||
<br>Nos clients. On a des supers clients, on a le luxe de les choisir, on aime les défis !
|
||
</aside>
|
||
|
||
</section>
|
||
|
||
<section>
|
||
<img width="300" src="img/logo-ansible.png" border="0" alt="Ansible" class="plain">
|
||
<h4 class="fragment">Automatisation de configuration d'infrastructure et déploiement</h4>
|
||
</section>
|
||
<section>
|
||
<h3>Objectifs d'Ansible</h3>
|
||
<ul>
|
||
<li class="fragment">homogénéité</li>
|
||
<li class="fragment">fiabilité</li>
|
||
<li class="fragment">rapidité</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>Parfait pour</h3>
|
||
<ul>
|
||
<li class="fragment">tâches répétitives</li>
|
||
<li class="fragment">actions urgentes</li>
|
||
<li class="fragment">demandes spécifiques</li>
|
||
<li class="fragment">déploiement / orchestration</li>
|
||
</ul>
|
||
</section>
|
||
|
||
<section>
|
||
<h2>Principes fondateurs</h2>
|
||
</section>
|
||
<section>
|
||
<h3>Idempotence</h3>
|
||
<ul>
|
||
<li class="fragment">f(f(x)) = f(x)</li>
|
||
<li class="fragment">le résultat compte… </li>
|
||
<li class="fragment">… pas la transformation</li>
|
||
<li class="fragment">killer-feature</li>
|
||
</ul>
|
||
<aside class="notes">
|
||
<ul>
|
||
<li>on décrit l'état final souhaité</li>
|
||
<li>le logiciel fait les actions nécessaires pour y arriver</li>
|
||
</ul>
|
||
</aside>
|
||
</section>
|
||
<section>
|
||
<h3>Pas d'agent</h3>
|
||
<ul>
|
||
<li class="fragment">Rien à installer sur les serveurs</li>
|
||
<li class="fragment">Accès SSH + python</li>
|
||
</ul>
|
||
<aside class="notes">
|
||
<ul>
|
||
<li>rien à installer de spécifique sur les serveurs</li>
|
||
<li>dépend seulement d'un accès SSH et un interpêteur Python</li>
|
||
</ul>
|
||
</aside>
|
||
</section>
|
||
<section>
|
||
<h3>Modularité</h3>
|
||
<ul>
|
||
<li class="fragment">composition d'éléments de base</li>
|
||
<li class="fragment">extensible, comme un langage</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>Souplesse et légèreté</h3>
|
||
<aside class="notes">
|
||
<ul>
|
||
<li>on peut utiliser Ansible de manière ponctuelle et l'abandonner sans artefacts</li>
|
||
<li>il ne cherche pas à mettre la main sur tout le serveur</li>
|
||
<li>adoption progressive : one-shot → 100 % Infra As Code</li>
|
||
</ul>
|
||
</aside>
|
||
</section>
|
||
|
||
<section>
|
||
<h2>Ansible, le projet</h2>
|
||
<ul>
|
||
<li class="fragment">Ansible fait partie de RedHat</li>
|
||
<li class="fragment">les outils de base sont libres</li>
|
||
<li class="fragment">surcouche payante pour usage "entreprise"</li>
|
||
<li class="fragment">développement mixte : RedHat + communauté</li>
|
||
</ul>
|
||
</section>
|
||
|
||
<section>
|
||
<h2>Démarrage</h2>
|
||
</section>
|
||
|
||
<section>
|
||
<h3>Installation</h3>
|
||
<p>Paquets pour de nombreuses distributions</p>
|
||
<pre><code>$ apt install ansible</code></pre>
|
||
</section>
|
||
<section>
|
||
<h3>Commandes de base</h3>
|
||
<pre><code class="hljs nohighlight" data-trim>
|
||
$ 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'"
|
||
</code></pre>
|
||
</section>
|
||
|
||
<section>
|
||
<h2>Éléments de base</h2>
|
||
</section>
|
||
|
||
<section>
|
||
<h3>Modules</h3>
|
||
<ul>
|
||
<li class="fragment">couche d'abstraction du shell</li>
|
||
<li class="fragment">homogénéité</li>
|
||
<li class="fragment">idempotence</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3><i>Tasks</i> / <i>Handlers</i></h3>
|
||
<ul>
|
||
<li class="fragment">invocation d'un module avec des paramètres</li>
|
||
<li class="fragment">le handler n'est exécuté qu'une fois</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3><i>Playbooks</i></h3>
|
||
<ul>
|
||
<li class="fragment">exécution procédurale de tâches</li>
|
||
<li class="fragment">définition du contexte</li>
|
||
<li class="fragment">orchestration complexe</li>
|
||
</ul>
|
||
<aside class="notes">
|
||
<ul>
|
||
<li>contexte = variables, serveurs concernés, connexion…</li>
|
||
<li>orchestration = déploiement multi-tiers, ex. load-balancer en mode sequentiel</li>
|
||
</ul>
|
||
</aside>
|
||
</section>
|
||
<section>
|
||
<pre><code class="hljs yaml" data-trim>
|
||
---
|
||
- 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
|
||
</code></pre>
|
||
<pre><code class="hljs bash">$ ansible-playbook playbook.yml</code></pre>
|
||
<aside class="notes">
|
||
On retrouve la même action qu'avec le CLI <pre>$ ansible</pre>
|
||
</aside>
|
||
</section>
|
||
<section>
|
||
<h3><i>Roles</i></h3>
|
||
<ul>
|
||
<li class="fragment">comme un paquet autonome</li>
|
||
<li class="fragment">contient <em>tasks</em>, <em>handlers</em>, variables, <em>templates</em>…</li>
|
||
<li class="fragment">inclus dans des <em>playbooks</em></li>
|
||
<li class="fragment">structure conventionnelle</li>
|
||
<li class="fragment">stockés localement ou récupérés dans un registre</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<pre><code class="hljs nohighlight" data-trim>
|
||
$ ansible-galaxy --offline init my-role
|
||
- my-role was created successfully
|
||
</code></pre>
|
||
<pre><code class="hljs nohighlight" data-trim style="max-height: 500px">
|
||
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
|
||
</code></pre>
|
||
</section>
|
||
<section>
|
||
<h3>Inventaire et variables</h3>
|
||
<ul>
|
||
<li class="fragment">liste des serveurs</li>
|
||
<li class="fragment">moyens d'accès</li>
|
||
<li class="fragment">variables spécifiques (par hôte ou groupe)</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<pre><code class="hljs nohighlight" data-trim>
|
||
inventory/
|
||
├── group_vars
|
||
│ ├── all.yml
|
||
│ ├── hypervisors.yml
|
||
│ └── proxies.yml
|
||
├── hosts
|
||
├── hosts-dev
|
||
└── host_vars
|
||
├── stack01-data01.yml
|
||
├── stack01-front01-web01.yml
|
||
└── stack01-front01.yml
|
||
</code></pre>
|
||
</section>
|
||
<section>
|
||
<pre><code class="hljs ini" data-trim style="max-height: 600px">
|
||
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
|
||
</code></pre>
|
||
<aside class="notes">
|
||
grouper les serveurs
|
||
<ul>
|
||
<li>par responsabilité (ex. web, db, lb…),</li>
|
||
<li>par datacenter,</li>
|
||
<li>par client,</li>
|
||
<li>par famille d'OS…</li>
|
||
</ul>
|
||
On peut avoir autant de groupe qu'on veut, même superposés
|
||
</aside>
|
||
</section>
|
||
|
||
<section>
|
||
<h3>Python et YAML</h3>
|
||
<ul>
|
||
<li class="fragment">Ansible est écrit en Python</li>
|
||
<li class="fragment">… mais ça n'est pas important</li>
|
||
<li class="fragment">Approche déclarative écrite en YAML</li>
|
||
</ul>
|
||
<aside class="notes">
|
||
YAML = sérialization de données, avec types de base
|
||
<br>pas de structures conditionnelles (if, for, while…)
|
||
<br>ni programmation, ni balisage
|
||
<br>~ JSON, plus compact mais sensible aux espaces
|
||
<br>lisible par les humains et les machines
|
||
</aside>
|
||
</section>
|
||
<section>
|
||
<h3>Ansible Galaxy</h3>
|
||
<img src="img/ansible-galaxy.png" border="0" alt="Ansible Galaxy" height="400" class="plain">
|
||
<aside class="notes">
|
||
<ul>
|
||
<li>Registre publique de rôles, géré par Ansible/RedHat</li>
|
||
<li>comme NPM pour Node, Rubygems pour Ruby…</li>
|
||
</ul>
|
||
</aside>
|
||
</section>
|
||
<section>
|
||
<h3>Ansible Tower / AWX</h3>
|
||
<img src="img/ansible-tower.png" border="0" alt="Ansible Tower" class="plain">
|
||
</section>
|
||
|
||
</section>
|
||
<section>
|
||
<h3>ansible-roles / EvoLinux</h3>
|
||
<ul>
|
||
<li class="fragment">69 roles, 2400 commits, 16K loc, 800 jours, 20 contributeurs</li>
|
||
<li class="fragment">evolinux v2 en beta</li>
|
||
<li class="fragment">nouvelles install 100% Ansible</li>
|
||
<li class="fragment">plusieurs infras complètes 100% Ansible</li>
|
||
</ul>
|
||
</section>
|
||
|
||
<section>
|
||
<!-- <img width="300" src="img/logo-ansible.png" border="0" alt="Ansible" class="plain"> -->
|
||
<h1 class="">Des nouvelles d'Ansible</h1>
|
||
</section>
|
||
|
||
<section>
|
||
<h3>stats du projet sur Github</h3>
|
||
<ul>
|
||
<li class="fragment">34.379 stars</li>
|
||
<li class="fragment">~4000 contributeurs</li>
|
||
<li class="fragment">~2100 modules</li>
|
||
<li class="fragment">500k téléchargements par mois</li>
|
||
</ul>
|
||
</section>
|
||
|
||
<section>
|
||
<h3>autres projets</h3>
|
||
<ul>
|
||
<li class="fragment">Salt : ~9000 stars, ~2000 contributeurs</li>
|
||
<li class="fragment">Chef : ~5000 stars, ~500 contributeurs</li>
|
||
<li class="fragment">Puppet : ~5000 stars, ~500 contributeurs</li>
|
||
</ul>
|
||
</section>
|
||
|
||
<section>
|
||
<h3>releases Ansible</h3>
|
||
<ul>
|
||
<li class="fragment">Ansible 2.5 : mars 2018</li>
|
||
<li class="fragment">Ansible 2.6 : juin 2018</li>
|
||
<li class="fragment">Ansible 2.7 : sortie en octobre 2018</li>
|
||
<li class="fragment">Ansible 2.8 : prévue pour le 2 mai 2018</li>
|
||
</ul>
|
||
</section>
|
||
|
||
<section>
|
||
<h3>Ansible 2.7</h3>
|
||
<ul>
|
||
<li class="fragment">Python 3.5 (Python 2.6 sur les cibles)</li>
|
||
<li class="fragment">optimisation : une seule invocation de Python au lieu de 2</li>
|
||
<li class="fragment">ignore_unreachable : skip tâches au lieu de stopper le play</li>
|
||
<li class="fragment">module reboot</li>
|
||
<li class="fragment">modules Cloud (AWS/etc.), NetApp, VMware, Windows, etc.</li>
|
||
<li class="fragment">réseau : 40 plateformes supportées, ~570 modules réseau</li>
|
||
<li class="fragment">molecule, ansible-lint</li>
|
||
</ul>
|
||
</section>
|
||
|
||
|
||
|
||
<section>
|
||
<h1>C'est l'histoire d'un bug</h1>
|
||
</section>
|
||
<section>
|
||
<h2>Contexte</h2>
|
||
<ul>
|
||
<li class="fragment">Nous utilisons ansible 2.2</li>
|
||
<li class="fragment">la version 2.5 a introduit une régression</li>
|
||
<li class="fragment">impossible de changer de version, le bug est trop grave</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h2>Issue <a href="https://github.com/ansible/ansible/issues/38655">#38655</a></h2>
|
||
<ul>
|
||
<li class="fragment">Ouverture en avril 2018</li>
|
||
<li class="fragment">une partie du bug initial est corrigé début octobre </li>
|
||
<li class="fragment">mais le mainteneur conteste le cœur du problème</li>
|
||
<li class="fragment">comment convaincre ?</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h2>Pull request <a href="https://github.com/ansible/ansible/pull/49409">#49409</a></h2>
|
||
<ul>
|
||
<li class="fragment">des tests qui reflètent le comportement voulu</li>
|
||
<li class="fragment">une implémentation qui passe les tests</li>
|
||
<li class="fragment">ajustement des commentaires, de la doc…</li>
|
||
<li class="fragment">victoire !</li>
|
||
</ul>
|
||
</section>
|
||
|
||
<section>
|
||
<h1>Merci</h1>
|
||
<h2>à vos questions</h2>
|
||
</section>
|
||
|
||
<section>
|
||
<h1>Et la suite ?</h1>
|
||
<ul>
|
||
<li>dites-nous ce que vous espérez</li>
|
||
<li>venez parler de vos cas d'usages</li>
|
||
<li><a href="https://www.meetup.com/fr-FR/Ansible-Marseille/">www.meetup.com/Ansible-Marseille/</a></li>
|
||
<li><a href="https://twitter.com/ansible_mrs">@ansible_mrs</a></li>
|
||
</ul>
|
||
</section>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<script src="lib/js/head.min.js"></script>
|
||
<script src="js/reveal.js"></script>
|
||
|
||
<script>
|
||
// More info about config & dependencies:
|
||
// - https://github.com/hakimel/reveal.js#configuration
|
||
// - https://github.com/hakimel/reveal.js#dependencies
|
||
Reveal.initialize({
|
||
controls: false,
|
||
progress: true,
|
||
history: true,
|
||
center: true,
|
||
|
||
transition: 'none', // none/fade/slide/convex/concave/zoom
|
||
// specified using percentage units.
|
||
width: 1280,
|
||
height: 720,
|
||
dependencies: [
|
||
{ src: 'plugin/markdown/marked.js' },
|
||
{ src: 'plugin/markdown/markdown.js' },
|
||
{ src: 'plugin/notes/notes.js', async: true },
|
||
{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
|
||
]
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|