@obazoud - @joelwurtz#tdd4devops
Test Driven Infrastructure
@obazoud - @jwurtz
Kyriba, Jolicode
Chefs étoilés
@obazoud - @joelwurtz#tdd4devops 2
Speakers
•Olivier Bazoud
–Développeur, DevOps
–Spring-*/JEE, Node.js, ...
–Co-auteur de “Spring Batch in Action”
•Joel Wurtz
–Développeur pour les devs @jolicode
–PHP (haters gonna hate), Chef, Docker, ...
–Formateur Chef @humancoders
@obazoud - @joelwurtz#tdd4devops 3
Test Driven Infrastructure
•Présentation de chef - 25mn
•Cookbooks
•Tout est ressource
•Tests et qualités
•Mise en place de l'environnement de travail - 5mn
•Écriture d'un cookbook en TDD - 2h30
@obazoud - @joelwurtz#tdd4devops 4
Gestionnaire de configuration
•Automatisation de son infrastructure
•Orchestration
•Configuration unique, partagée et dynamique
•Framework de scripts
•Normalisation
@YourTwitterHandle#DVXFR14{session hashtag} @obazoud - @joelwurtz#tdd4devops
@obazoud - @joelwurtz#tdd4devops 6
Chef
•Créé en 2008
•Open-source (Apache)
•Ruby (+ Erlang pour le serveur)
•Écriture des scripts en ruby et json
•Système agent-serveur
•Exécution des scripts dans l'ordre où c'est écrit
•Disponible sans serveur (chef-solo)
•Script en mode Normalisation over Configuration
•Idempotent
@obazoud - @joelwurtz#tdd4devops 7
Bien plus que des scripts...
•Orchestration complète de votre infrastructure
•Interfaçage avec différents providers
– Amazon
– Google Cloud
– Vagrant
– ...
•Nombreux scripts open-source
– community.opscode.com
– Cookbooks TravisCi
– ...
@obazoud - @joelwurtz#tdd4devops 8
Composants
•Chef-Solo : Joue les recettes chef sur un environnement
•Chef-Client : Chef-Solo + Récuperation des recettes sur
un serveur distant (Chef-Server)
•Chef-Server : Possède la connaissance de votre
infrastructure
•Knife : Outil permettant de communiquer avec
Chef-Server
@YourTwitterHandle#DVXFR14{session hashtag} @obazoud - @joelwurtz#tdd4devops
Cookbooks
@obazoud - @joelwurtz#tdd4devops 10
Chef repository
certificats/
cookbooks/
tomcat7/
...
data_bags/
environments/
roles/
@obazoud - @joelwurtz#tdd4devops 11
Cookbooks
cookbooks/
tomcat7/
php/
mysql/
...
Ensemble de scripts décrivant l'installation d'un (et
un seul) service/application
@obazoud - @joelwurtz#tdd4devops 12
Cookbook (sans le s)
cookbooks/
tomcat7/
recipes/
default.rb Minimum requis pour un cookbook (exemple d'une
recette pour tomcat7)
@obazoud - @joelwurtz#tdd4devops 13
Exemple
# Install package
package 'tomcat7' do
action :install
end
# Use setenv.sh template
template '/usr/share/tomcat7/bin/setenv.sh' do
source 'setenv.sh.erb'
owner 'tomcat7'
group 'tomcat7'
mode '755'
end
# Service managed by Chef
service 'tomcat7' do
supports restart: true, reload: false, status: true
action [:start, :enable]
end
@obazoud - @joelwurtz#tdd4devops 14
Exemple
# Install package
package 'tomcat7' do
action :install
end
@obazoud - @joelwurtz#tdd4devops 15
Exemple
# Use setenv.sh template
template '/usr/share/tomcat7/bin/setenv.sh' do
source 'setenv.sh.erb'
owner 'tomcat7'
group 'tomcat7'
mode '755'
end
@obazoud - @joelwurtz#tdd4devops 16
Exemple
# Service managed by Chef
service 'tomcat7' do
supports restart: true, reload: false, status: true
action [:start, :enable]
end
@YourTwitterHandle#DVXFR14{session hashtag} @obazoud - @joelwurtz#tdd4devops
Ressources
@obazoud - @joelwurtz#tdd4devops 18
Tout est ressource
•DSL Chef
•package, template et service sont des ressources
•Une ressource est une définition
•Une ressource consiste en un type, un nom et des
attributs
•L’exécution de cette dernière est réalisée avec des
providers
@obazoud - @joelwurtz#tdd4devops 19
Exemple
# Install package
package 'tomcat7' do
action :install
end
@obazoud - @joelwurtz#tdd4devops 20
Ressource
•Certains attributs sont communs à toutes les ressources
– action : état souhaité de la ressource (le nom est
trompeur)
– ignore_failure : n'arrête pas l’exécution en cas
d'erreur
– provider : implémentation pour la ressource
– …
@obazoud - @joelwurtz#tdd4devops 21
Ressource
•Condition d'exécution
–attributs permettant de définir si la ressource doit
s’exécuter (permet de passer une ressource non
idempotente en ressource idempotente)
• Subscribes
–attribut permettant de dire que la ressource s'exécute
après une autre ressource
•Notifications
–exécute une action sur une autre ressource après
l'exécution de la ressource courante
@YourTwitterHandle#DVXFR14{session hashtag} @obazoud - @joelwurtz#tdd4devops
Tests
@obazoud - @joelwurtz#tdd4devops 23
Tests
•Unitaires : rspec, chefspec
•Intégrations : test-kitchen
•Bonne pratique et qualité : rubocop, foodcritic
•Indépendant de chef : bats, minitest, serverspec
@obazoud - @joelwurtz#tdd4devops 24
TDD
@obazoud - @joelwurtz#tdd4devops 25
TDD
•Écrire un test pour une fonctionnalité
•Vérifier qu'il ne passe pas
•Écrire son implémentation minimal pour qu'il passe
•Répéter le cycle sur les autres fonctionnalités en faisant
en sorte que les tests existants passent toujours
@obazoud - @joelwurtz#tdd4devops 26
Chefspec
•Rspec : Spécification en test unitaire de nos
fonctionnalites
•Chefspec : Librairie pour écrire les spécifications de nos
cookbooks avec rspec
•On ne teste pas Chef !
@obazoud - @joelwurtz#tdd4devops 27
Chefspec
require 'chefspec'
describe 'example::default' do
let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
it 'does something' do
expect(chef_run).to install_package('tomcat7')
end
end
@obazoud - @joelwurtz#tdd4devops 28
Test-kitchen
•Exécution de nos cookbooks sur plusieurs
environnements
•Permet de tester la chaine complète
•Très utile pour multi OS / multi environnement
•Driver : Utilisable avec Vagrant, Amazon EC2, Docker,
Rackspace, …
•Busser : Exécute des tests bats, serverspec, minitest,
cucumber, …
@obazoud - @joelwurtz#tdd4devops 29
Test-kitchen
driver:
name: vagrant
provisioner:
name: chef_zero
platforms:
- name: ubuntu-13.04
- name: centos-6.5
suites:
- name: client
run_list:
- recipe[postgresql::client]
- name: server
run_list:
- recipe[postgresql::server]
@obazoud - @joelwurtz#tdd4devops 30
Bats
•Bash Automated Testing System (indépendant de Chef)
•Écriture des spécifications pour vos serveurs
•Basé sur bash
@obazoud - @joelwurtz#tdd4devops 31
Bats
#!/usr/bin/env bats
@test 'it creates tomcat directory' {
test -d /var/lib/tomcat7
}
@test 'it starts tomcat' {
service tomcat7 status
}
@test 'it responses with content' {
run curl http://localhost:8080/
[ "$status" -eq 0 ]
echo "$output" | grep 'hipster'
}
@obazoud - @joelwurtz#tdd4devops 32
Minitest
•Outil en Ruby - indépendant de Chef
•Écriture des spécifications pour vos serveurs
•Offre une gamme complète : TDD, BDD, Mock, Bench,...
@obazoud - @joelwurtz#tdd4devops 33
Minitest
require 'minitest/autorun'
describe 'stack::tomcat7' do
describe 'services' do
# You can assert that a service must be running following the converge:
it 'runs as a daemon' do
assert system('service tomcat7 status')
end
# And that it will start when the server boots:
it 'boots on startup' do
assert File.exists?(Dir.glob('/etc/rc5.d/S*tomcat7').first)
end
end
end
@obazoud - @joelwurtz#tdd4devops 34
Serverspec
•Outil en Ruby (indépendant de Chef)
•Écriture des spécifications pour vos serveurs
•Basé sur rspec
•À distance (via ssh) ou en local
•Support multi OS
•Init d'un projet : serverspec-init
@obazoud - @joelwurtz#tdd4devops 35
Serverspec
require 'spec_helper'
describe package('httpd') do
it { should be_installed }
end
describe service('httpd') do
it { should be_enabled }
it { should be_running }
end
describe port(80) do
it { should be_listening }
end
describe file('/etc/httpd/conf/httpd.conf') do
it { should be_file }
its(:content) { should match /ServerName www.example.jp/ }
end
@obazoud - @joelwurtz#tdd4devops 36
Rubocop
•Vérifie les bonnes pratiques Ruby
•Analyse statique du code Ruby
•https://github.com/bbatsov/rubocop
@obazoud - @joelwurtz#tdd4devops 37
Foodcritic
•Vérifie les bonnes pratiques pour vos recettes
•Règles établies par la communauté
•http://acrmp.github.io/foodcritic/
•Vous pouvez rajouter vos propres règles
@YourTwitterHandle#DVXFR14{session hashtag} @obazoud - @joelwurtz#tdd4devops
Environnement de travail
@obazoud - @joelwurtz#tdd4devops 39
Environnement de travail
•Ruby 1.9.3
– bundle install --local
•Vagrant 1.4.3
•VirtualBox 4.3.10
•Git 1.9
•Et votre éditeur de texte préféré :)
•Voir les instructions
@YourTwitterHandle#DVXFR14{session hashtag} @obazoud - @joelwurtz#tdd4devops
Cookbook en TDD
@obazoud - @joelwurtz#tdd4devops 41
Cookbook en TDD
• Cookbook « Stack »
– Mysql
– Tomcat 7
– Jhipster
Disclaimer « bonnes pratiques »
– Il faudrait séparer en plusieurs cookbooks « stack »
– Il faudrait créer une ressource pour la création de la
base de données
@obazoud - @joelwurtz#tdd4devops 42
Cookbook en TDD
@obazoud - @joelwurtz#tdd4devops 43
Cookbook en TDD
• Mysql
– Déploiement du fichier seed
– Installation du package mysql-server / mysql-client
– Création de la base 'jhipster'
• Tomcat 7
– Installation du package tomcat7
– Personnalisation de setenv.sh
• JHipster
– Application java / spring
– Déploiement du WAR
@obazoud - @joelwurtz#tdd4devops 44
#tdd4devops
@obazoud - @joelwurtz#tdd4devops 45
Liens utiles
• http://docs.opscode.com/just_enough_ruby_for_chef.html
• http://docs.opscode.com/resource.html
• http://community.opscode.com/
• https://github.com/travis-ci/travis-cookbooks
• http://code.sethvargo.com/chefspec/
• http://serverspec.org/

TDD for DevOps with Chef

  • 1.
    @obazoud - @joelwurtz#tdd4devops TestDriven Infrastructure @obazoud - @jwurtz Kyriba, Jolicode Chefs étoilés
  • 2.
    @obazoud - @joelwurtz#tdd4devops2 Speakers •Olivier Bazoud –Développeur, DevOps –Spring-*/JEE, Node.js, ... –Co-auteur de “Spring Batch in Action” •Joel Wurtz –Développeur pour les devs @jolicode –PHP (haters gonna hate), Chef, Docker, ... –Formateur Chef @humancoders
  • 3.
    @obazoud - @joelwurtz#tdd4devops3 Test Driven Infrastructure •Présentation de chef - 25mn •Cookbooks •Tout est ressource •Tests et qualités •Mise en place de l'environnement de travail - 5mn •Écriture d'un cookbook en TDD - 2h30
  • 4.
    @obazoud - @joelwurtz#tdd4devops4 Gestionnaire de configuration •Automatisation de son infrastructure •Orchestration •Configuration unique, partagée et dynamique •Framework de scripts •Normalisation
  • 5.
  • 6.
    @obazoud - @joelwurtz#tdd4devops6 Chef •Créé en 2008 •Open-source (Apache) •Ruby (+ Erlang pour le serveur) •Écriture des scripts en ruby et json •Système agent-serveur •Exécution des scripts dans l'ordre où c'est écrit •Disponible sans serveur (chef-solo) •Script en mode Normalisation over Configuration •Idempotent
  • 7.
    @obazoud - @joelwurtz#tdd4devops7 Bien plus que des scripts... •Orchestration complète de votre infrastructure •Interfaçage avec différents providers – Amazon – Google Cloud – Vagrant – ... •Nombreux scripts open-source – community.opscode.com – Cookbooks TravisCi – ...
  • 8.
    @obazoud - @joelwurtz#tdd4devops8 Composants •Chef-Solo : Joue les recettes chef sur un environnement •Chef-Client : Chef-Solo + Récuperation des recettes sur un serveur distant (Chef-Server) •Chef-Server : Possède la connaissance de votre infrastructure •Knife : Outil permettant de communiquer avec Chef-Server
  • 9.
  • 10.
    @obazoud - @joelwurtz#tdd4devops10 Chef repository certificats/ cookbooks/ tomcat7/ ... data_bags/ environments/ roles/
  • 11.
    @obazoud - @joelwurtz#tdd4devops11 Cookbooks cookbooks/ tomcat7/ php/ mysql/ ... Ensemble de scripts décrivant l'installation d'un (et un seul) service/application
  • 12.
    @obazoud - @joelwurtz#tdd4devops12 Cookbook (sans le s) cookbooks/ tomcat7/ recipes/ default.rb Minimum requis pour un cookbook (exemple d'une recette pour tomcat7)
  • 13.
    @obazoud - @joelwurtz#tdd4devops13 Exemple # Install package package 'tomcat7' do action :install end # Use setenv.sh template template '/usr/share/tomcat7/bin/setenv.sh' do source 'setenv.sh.erb' owner 'tomcat7' group 'tomcat7' mode '755' end # Service managed by Chef service 'tomcat7' do supports restart: true, reload: false, status: true action [:start, :enable] end
  • 14.
    @obazoud - @joelwurtz#tdd4devops14 Exemple # Install package package 'tomcat7' do action :install end
  • 15.
    @obazoud - @joelwurtz#tdd4devops15 Exemple # Use setenv.sh template template '/usr/share/tomcat7/bin/setenv.sh' do source 'setenv.sh.erb' owner 'tomcat7' group 'tomcat7' mode '755' end
  • 16.
    @obazoud - @joelwurtz#tdd4devops16 Exemple # Service managed by Chef service 'tomcat7' do supports restart: true, reload: false, status: true action [:start, :enable] end
  • 17.
    @YourTwitterHandle#DVXFR14{session hashtag} @obazoud- @joelwurtz#tdd4devops Ressources
  • 18.
    @obazoud - @joelwurtz#tdd4devops18 Tout est ressource •DSL Chef •package, template et service sont des ressources •Une ressource est une définition •Une ressource consiste en un type, un nom et des attributs •L’exécution de cette dernière est réalisée avec des providers
  • 19.
    @obazoud - @joelwurtz#tdd4devops19 Exemple # Install package package 'tomcat7' do action :install end
  • 20.
    @obazoud - @joelwurtz#tdd4devops20 Ressource •Certains attributs sont communs à toutes les ressources – action : état souhaité de la ressource (le nom est trompeur) – ignore_failure : n'arrête pas l’exécution en cas d'erreur – provider : implémentation pour la ressource – …
  • 21.
    @obazoud - @joelwurtz#tdd4devops21 Ressource •Condition d'exécution –attributs permettant de définir si la ressource doit s’exécuter (permet de passer une ressource non idempotente en ressource idempotente) • Subscribes –attribut permettant de dire que la ressource s'exécute après une autre ressource •Notifications –exécute une action sur une autre ressource après l'exécution de la ressource courante
  • 22.
  • 23.
    @obazoud - @joelwurtz#tdd4devops23 Tests •Unitaires : rspec, chefspec •Intégrations : test-kitchen •Bonne pratique et qualité : rubocop, foodcritic •Indépendant de chef : bats, minitest, serverspec
  • 24.
  • 25.
    @obazoud - @joelwurtz#tdd4devops25 TDD •Écrire un test pour une fonctionnalité •Vérifier qu'il ne passe pas •Écrire son implémentation minimal pour qu'il passe •Répéter le cycle sur les autres fonctionnalités en faisant en sorte que les tests existants passent toujours
  • 26.
    @obazoud - @joelwurtz#tdd4devops26 Chefspec •Rspec : Spécification en test unitaire de nos fonctionnalites •Chefspec : Librairie pour écrire les spécifications de nos cookbooks avec rspec •On ne teste pas Chef !
  • 27.
    @obazoud - @joelwurtz#tdd4devops27 Chefspec require 'chefspec' describe 'example::default' do let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) } it 'does something' do expect(chef_run).to install_package('tomcat7') end end
  • 28.
    @obazoud - @joelwurtz#tdd4devops28 Test-kitchen •Exécution de nos cookbooks sur plusieurs environnements •Permet de tester la chaine complète •Très utile pour multi OS / multi environnement •Driver : Utilisable avec Vagrant, Amazon EC2, Docker, Rackspace, … •Busser : Exécute des tests bats, serverspec, minitest, cucumber, …
  • 29.
    @obazoud - @joelwurtz#tdd4devops29 Test-kitchen driver: name: vagrant provisioner: name: chef_zero platforms: - name: ubuntu-13.04 - name: centos-6.5 suites: - name: client run_list: - recipe[postgresql::client] - name: server run_list: - recipe[postgresql::server]
  • 30.
    @obazoud - @joelwurtz#tdd4devops30 Bats •Bash Automated Testing System (indépendant de Chef) •Écriture des spécifications pour vos serveurs •Basé sur bash
  • 31.
    @obazoud - @joelwurtz#tdd4devops31 Bats #!/usr/bin/env bats @test 'it creates tomcat directory' { test -d /var/lib/tomcat7 } @test 'it starts tomcat' { service tomcat7 status } @test 'it responses with content' { run curl http://localhost:8080/ [ "$status" -eq 0 ] echo "$output" | grep 'hipster' }
  • 32.
    @obazoud - @joelwurtz#tdd4devops32 Minitest •Outil en Ruby - indépendant de Chef •Écriture des spécifications pour vos serveurs •Offre une gamme complète : TDD, BDD, Mock, Bench,...
  • 33.
    @obazoud - @joelwurtz#tdd4devops33 Minitest require 'minitest/autorun' describe 'stack::tomcat7' do describe 'services' do # You can assert that a service must be running following the converge: it 'runs as a daemon' do assert system('service tomcat7 status') end # And that it will start when the server boots: it 'boots on startup' do assert File.exists?(Dir.glob('/etc/rc5.d/S*tomcat7').first) end end end
  • 34.
    @obazoud - @joelwurtz#tdd4devops34 Serverspec •Outil en Ruby (indépendant de Chef) •Écriture des spécifications pour vos serveurs •Basé sur rspec •À distance (via ssh) ou en local •Support multi OS •Init d'un projet : serverspec-init
  • 35.
    @obazoud - @joelwurtz#tdd4devops35 Serverspec require 'spec_helper' describe package('httpd') do it { should be_installed } end describe service('httpd') do it { should be_enabled } it { should be_running } end describe port(80) do it { should be_listening } end describe file('/etc/httpd/conf/httpd.conf') do it { should be_file } its(:content) { should match /ServerName www.example.jp/ } end
  • 36.
    @obazoud - @joelwurtz#tdd4devops36 Rubocop •Vérifie les bonnes pratiques Ruby •Analyse statique du code Ruby •https://github.com/bbatsov/rubocop
  • 37.
    @obazoud - @joelwurtz#tdd4devops37 Foodcritic •Vérifie les bonnes pratiques pour vos recettes •Règles établies par la communauté •http://acrmp.github.io/foodcritic/ •Vous pouvez rajouter vos propres règles
  • 38.
    @YourTwitterHandle#DVXFR14{session hashtag} @obazoud- @joelwurtz#tdd4devops Environnement de travail
  • 39.
    @obazoud - @joelwurtz#tdd4devops39 Environnement de travail •Ruby 1.9.3 – bundle install --local •Vagrant 1.4.3 •VirtualBox 4.3.10 •Git 1.9 •Et votre éditeur de texte préféré :) •Voir les instructions
  • 40.
    @YourTwitterHandle#DVXFR14{session hashtag} @obazoud- @joelwurtz#tdd4devops Cookbook en TDD
  • 41.
    @obazoud - @joelwurtz#tdd4devops41 Cookbook en TDD • Cookbook « Stack » – Mysql – Tomcat 7 – Jhipster Disclaimer « bonnes pratiques » – Il faudrait séparer en plusieurs cookbooks « stack » – Il faudrait créer une ressource pour la création de la base de données
  • 42.
  • 43.
    @obazoud - @joelwurtz#tdd4devops43 Cookbook en TDD • Mysql – Déploiement du fichier seed – Installation du package mysql-server / mysql-client – Création de la base 'jhipster' • Tomcat 7 – Installation du package tomcat7 – Personnalisation de setenv.sh • JHipster – Application java / spring – Déploiement du WAR
  • 44.
  • 45.
    @obazoud - @joelwurtz#tdd4devops45 Liens utiles • http://docs.opscode.com/just_enough_ruby_for_chef.html • http://docs.opscode.com/resource.html • http://community.opscode.com/ • https://github.com/travis-ci/travis-cookbooks • http://code.sethvargo.com/chefspec/ • http://serverspec.org/