Vous avez besoin d'une stratégie pour déployer votre infrastructure ? Je vais vous donner une méthode qui vient du monde du développement. Dans le but d'avoir une plate-forme stable.
Décrivez ce dont vous avez besoin dans votre future recette "Je veux un serveur HTTP" est testez avec un outil du type BDD (Développement Piloté par les Fonctionnalités).
Maintenant, vous allez devoir de décrire (avec un langage de plus bas niveau) les prérequis dont vous avez besoin pour cette fonctionnalité (vérifier si NGINX est installé).
Vous basculez donc dans le mode TDD (Développement Piloté par les Tests). Quand votre recette est prête, vous allez l'ajouter à votre gestionnaire de sources. Et votre système d'Intégration Continue va tester votre recette à chaque mise à jour.
Comme pour un système de développement. Je vous l'ai dit “Infrastructure as code”
28. Ça donne :
% for i in node client cookbook environment role ; do
echo "===== $i:"
knife $i list
done
===== node:
!
===== client:
nledez-demo-validator
===== cookbook:
!
===== environment:
_default
===== role:
29. Un repo tout prêt
% cd /mon/repertoire/de/chef
% ls
Gemfile Gemfile.lock README.md
% git clone https://github.com/opscode/chef-repo.git
Cloning into 'chef-repo'...
remote: Counting objects: 209, done.
remote: Compressing objects: 100% (126/126), done.
remote: Total 209 (delta 75), reused 170 (delta 49)
Receiving objects: 100% (209/209), 35.05 KiB, done.
Resolving deltas: 100% (75/75), done.
35. Édition des metadatas
% cd cookbooks/nginx_unicorn
% vi metadata.rb # Ou l'éditeur texte que vous voulez
name 'nginx_unicorn'
maintainer 'YOUR_COMPANY_NAME'
maintainer_email 'YOUR_EMAIL'
license 'All rights reserved'
description 'Installs/Configures nginx_unicorn'
long_description IO.read(
File.join(File.dirname(__FILE__), 'README.md'))
version '0.1.0'
36. Les corrections
name 'nginx_unicorn'
maintainer 'Ledez Incorporated'
maintainer_email 'yes-I-love@spam.com'
license 'All rights reserved'
description 'Installs/Configures nginx & unicorn'
long_description
IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version '0.1.0'
% bundle exec foodcritic .
37. Premier lancement de tests
% bundle exec knife cookbook create_specs nginx_unicorn
** Creating specs for cookbook: nginx_unicorn
% bundle exec rspec --color
*
!
Pending:
nginx_unicorn::default should do something
# Your recipe examples go here.
# ./spec/default_spec.rb:5
!
Finished in 0.00045 seconds
1 example, 0 failures, 1 pending
38. Le test
require 'chefspec'
!
describe 'nginx_unicorn::default' do
let (:chef_run) { ChefSpec::ChefRunner.new.converge 'nginx_unicorn::default' }
it 'should do something' do
pending 'Your recipe examples go here.'
end
end
it 'should deploy nginx' do
runner = expect(chef_run)
!
runner.to install_package "nginx"
end
39. Le test KO
% bundle exec rspec --color
Compiling Cookbooks...
F
!
Failures:
!
1) nginx_unicorn::default should deploy nginx
Failure/Error: runner.to install_package "nginx"
No package resource named 'nginx' with action :install found.
# ./spec/default_spec.rb:8:in `block (2 levels) in '
!
Finished in 0.00393 seconds
1 example, 1 failure
!
Failed examples:
!
rspec ./spec/default_spec.rb:5 # nginx_unicorn::default should deploy
nginx
40. Le code
#
# Cookbook Name:: nginx_unicorn
# Recipe:: default
#
# Copyright 2013, Ledez Incorporated
#
# All rights reserved - Do Not Redistribute
#
package "nginx" do
action :install
end
41. Qui passe vert
% bundle exec rspec --color
Compiling Cookbooks...
.
!
Finished in 0.00429 seconds
1 example, 0 failures