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

506 lines
20 KiB
HTML
Raw Permalink Normal View History

2018-12-27 11:15:30 +01:00
<!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>