Après maints périples, vous avez progressivement amélioré votre capacité à gérer des environnements au travers d'Infra as Code. Votre code initialement simple a pris de l'embonpoint et vous sentez la réalité vous rattraper implacablement : vous êtes en train de créer de la complexité, voire même de la dette.
Loin d'être une fatalité, à partir de notre expérience de développeur (Fabien) et d'ops (Alexandre), nous vous proposons un road trip dans des
pratiques de développement déclinées sur l'Infra as Code (Bash, Puppet et Ansible).
Nous présentons des pratiques, des plus simples activables immédiatement à des démarches plus complexes pour dessiner une big picture de l'Infra as Code, de ses contraintes, de ses forces et de ses pièges.
* Comment mettre en place des boucles de feedback les plus courtes possibles ?
* Comment faire du test driven development sur l'infrastructure ?
* Quels patterns et outils pour tester une configuration sans tirer toute votre infra et itérer plus rapidement ?
* Quel est le rapport entre Tetris, un ascenceur et l'Infra as Code ?
Gab17 lyon-Docker pour quoi faire - Cédric Leblond et Derue
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
1. #DevoxxFR
Devoxx France 2016
Infra as Code, choisissez vous
la pilule rouge ou la pilule bleue ?
Fabien Arcellier @farcellier
Alexandre Raoul @alex_raoul
1
2. #DevoxxFR
Alexandre Raoul
L’OPS, kiffs : Puppet, Ansible, des
APIs et pas de clicodrome
2
Fabien Arcellier
Le DEV, kiffs : tout automatiser,
mettre en prod
3. #DevoxxFR 3
Infra as code, késako?
Une team de winner
Une gestion du code de winner
Aller en production comme un winner
Au programme
4. #DevoxxFR
Infra as Code
Décrire sous forme de code
exécutable et testable la configuration
de l’architecture technique
d’infrastructure
5. #DevoxxFR
If you can’t spin up
a full copy of your infra and test it,
you don’t actually have “infrastructure as code”.
You just have ... some code, and duct tape.
https://charity.wtf/2016/03/23/aws-networking-environments-and-you/
8. #DevoxxFR
La Pilule Rouge,
on prend conscience
… qu’à l’arrache ou en mode
pompier, on ne tiendra pas
longtemps pas la cadence
… que l’Infra as Code c’est du
code finalement assez classique
8
La Pilule Bleue,
on reste
… à maintenir les services
disponibles avec des bouts de
ficelle,
… à scripter l’existant tel quel et à
survivre avec les systèmes pourris
Pilule Bleue ou Rouge ?
10. #DevoxxFR
Oui mais bon, on parle de l’infra là ...
10
“Je monte une copie de
mon SI pour valider ma
sonde de monitoring”
“Je le fais en prod - YOLO”
12. #DevoxxFR
# Exemple de container
# qui monte un elasticsearch
?> docker run -d --name search -v $pwd:/mnt -
w /mnt ubuntu
?> docker exec --tty search ansible-playbook
roles/elasticsearch/tests.yml
?> docker exec --tty search curl http:
//localhost:9200
?> docker stop search
12
Pilule rouge : les outils pour isoler existent
# Exemple de VM avec Vagrant
# qui monte un elasticsearch
?> vagrant up
?> vagrant ssh -c 'curl http://localhost:9200'
?> vagrant halt
Monter des VMs avec vagrant Monter des containers avec docker
13. #DevoxxFR
Pilule rouge : utiliser des pratiques de développement adaptés
---
- hosts: all
roles:
- role: fabientools.monitoring
when: ff_monitoring_active
feature flipping
---
- hosts: all
roles:
- role: fabientools.monitoring,
nagios_plugins_nrpe_url: 'http://www.trololo.org/nagios_plugins_nrpe.tar.gz'
injection de configuration
13
15. #DevoxxFR 15
if (grep -q “(d){1,3}.(d){1,3}.(d){1,3}.(d){1,3}(s)+myapi.dev”
/etc/hosts | grep -qv 127.0.0.1); then sed ‘s/.* myapi.dev/127.0.0.1 myapi.
dev/g’ -i /etc/hosts; fi
if (!grep -q myapi.dev /etc/hosts); then echo "127.0.0.1 myapi.dev" >>
/etc/hosts; fi
echo "127.0.0.1 myapi.dev" >> /etc/hosts
Pilule bleue : ajouter une entrée
dans un fichier hosts
16. #DevoxxFR 16
if (grep -q “(d){1,3}.(d){1,3}.(d){1,3}.(d){1,3}(s)+myapi.dev”
/etc/hosts | grep -qv 127.0.0.1); then sed ‘s/.* myapi.dev/127.0.0.1 myapi.
dev/g’ -i /etc/hosts; fi
if (!grep -q myapi.dev /etc/hosts); then echo "127.0.0.1 myapi.dev" >>
/etc/hosts; fi
echo "127.0.0.1 myapi.dev" >> /etc/hosts
Pilule bleue : ajouter une entrée
dans un fichier hosts
17. #DevoxxFR
Le monte charge
Je suis au 6e, je veux aller au 2e
1) Je reste appuyé sur Down
2) Je vois “2”
3) J'arrête d’appuyer
17
L’ascenseur
Je suis au 6e, je veux aller au 2e
1) J’appuie sur “2”
2) Je joue sur mon téléphone
Bonus : je suis au 2e, j’appuie sur “2”, rien ne se passe
L’idempotence, c’est ça
20. #DevoxxFR
Le super héros
Résout vos problèmes
mais …
casse tout autour pour le faire
20
Le moine codeur
Implémente tout ce que vous voulez
mais …
dans son coin
Le grand architecte
Fait un dossier d’archi pour chaque
évolution mais …
il se retrouve périmé après
chaque implem’
Le critique
A des convictions sur tout
mais …
n’a jamais rien implémenté de concret
L’archiviste
Refactore le code tout le temps
mais …
ne fait rien de nouveau
22. #DevoxxFR 22
Méthode : Revue de code
Identifier les erreurs
Monter / Faire monter en
compétence
Expliquer le code
Faire émerger les standards
de l’équipe
Partager la propriété du code
23. #DevoxxFR
C’est quoi le meilleur “DevOps tool” ?
23
Objectif :
Partager la vérité sur ce qui doit se passer
28. #DevoxxFR 28
Pilule rouge : maîtriser ses scripts bash
#!/usr/bin/env bash
echo "Hello world"
Objectif : ramener bash dans le droit chemin
set -o errexit
set -o nounset Arrête l'exécution si une variable n’est pas déclarée
Arrête l'exécution si une commande échoue
Petit bonus lisibilité : utilisez les flags en mode long
Genre “curl --output” et pas “curl -o”
Et bien sûr plein d’autres …
31. #DevoxxFR
Pilule rouge : pour savoir ce qu’il y a en prod,
il faut logger chaque changement d’infra
infra à
l’instant T
31
le code
d’infrastructure
le résultat de
l'exécution= +
Le résultat peut vivre dans Jenkins, PuppetDB,
Ansible Tower, Rundeck, être remonté via ELK …
32. #DevoxxFR
Pilule rouge : pour savoir ce qu’il y a en prod,
il faut logger chaque changement d’infra
infra à
l’instant T
32
le code
d’infrastructure
le résultat de
l'exécution= +
Le résultat peut vivre dans Jenkins, PuppetDB,
Ansible Tower, Rundeck, être remonté via ELK …
33. #DevoxxFR
- name: wait for tomcat to be ready
pause: seconds=30
33
Pilule bleue : après avoir lancé Tomcat,
“on attend un peu”
- name: start Tomcat
service: name=tomcat state=started
34. #DevoxxFR
- name: wait for tomcat to be ready
pause: seconds=30
34
Pilule bleue : après avoir lancé Tomcat,
“on attend un peu plus”
- name: start Tomcat
service: name=tomcat state=started
- name: wait for tomcat to be ready
pause: seconds=60
35. #DevoxxFR 35
Pilule rouge : Retirer tous les “sleep”
Objectif : rendre le système plus prédictible
- name: start Tomcat
service: name=tomcat state=started
- name: wait for tomcat to listen
wait_for: port=8080
- name: wait to be serving
uri:
url: "http://127.0.0.1:8080/ABC"
status_code: 200
register: result
until: 'ABC app' in result.content
retries: 5
delay: 10
36. #DevoxxFR 36
Methode : cli first !
un script qui tourne sur jenkins, ... , doit fonctionner en ligne de commande
● Debugger plus facilement
● Jouer en mode dégradé
● Versionner le code de votre job
37. #DevoxxFR 37
la pyramide des tests
Test
manuel
Tests
End to End
Tests
Intégrations
Tests
Unitaires
38. Un test qui sert à quelque chose ...
Spécifier l’intention d’un code
Assurer la non régression dans le temps
Assurer que le code fait ce qu’il dit
38
39. #DevoxxFR 39
à propos des tests unitaires ...
Tests unitaires de l’outil
à ne pas confondre avec
Tests unitaires de notre code construit avec le DSL
40. #DevoxxFR 40
Un petit refactoring avec les tests unitaires
dans le monde Puppet
On a une classe toute simple qui installe “curl” et “vim”
On veut rendre cette liste de packages variable sans casser l’existant
47. #DevoxxFR 47
à propos des tests d’intégration ...
On crée une VM et on lance le code
Forcément, c’est long
La boucle de feedback en prend un coup ...
Et vu qu’on a une combinatoire infinie,
il faut faire des choix
48. #DevoxxFR 48
à propos des tests d’intégration ...
Pas de solution miracle
Quand on ne sait pas, on fait ultra simple !
49. #DevoxxFR 49
à propos des tests d’intégration ...
Pas de solution miracle
Quand on ne sait pas, on fait ultra simple !
Setup, test, teardown :
1) On crée une VM,
2) On lance le code,
3) On lance les tests,
4) On nettoie
50. #DevoxxFR 50
à propos des tests d’intégration ...
Niveau 1 : Smoke test
Niveau 2 : Test de la voie royale
Niveau 3 : Tests de non régression en
cas de bug d’intégration
Niveau 4 : venez faire un talk dessus
L'échelle de maturité du vendredi soir
52. #DevoxxFR 52
Vous croyez que les technologies
changent le monde ?
Nous aussi ! Rejoignez-nous !
recrutement@octo.com
Merci
Culture Code
Software Craftsmanship :
Better Places with Better Code
Un livre collectif disponible
gratuitement en téléchargement
http://www.octo.com/fr/publications/20-culture-code