meetup-ansible-mrs/2018-12/index.html

506 lines
20 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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 &amp; 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 &lt;jlecour@evolix.fr&gt;
Grégory Colpart &lt;reg@evolix.fr&gt;
<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>