Chef infrastructure as code - paris.rb

304 views
273 views

Published on

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”

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
304
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Chef infrastructure as code - paris.rb

  1. 1. Infrastructure as code with Chef
  2. 2. <Nicolas Ledez>
  3. 3. Orange Business Service IT&L@bs
  4. 4. IT&L@bs Git Ruby Cloud Architecture
  5. 5. Human coders news / Ruby
  6. 6. http://rennesdevops.fr/ @Rennesdevops https://groups.google.com/forum/#!forum/ rennesdevops
  7. 7. @nledez
  8. 8. </Nicolas Ledez>
  9. 9. DevOps ?
  10. 10. Avec du "Opscode" dedans
  11. 11. Chef ? http://www.vectorarts.net/people/free-woman-chef-tree-vector-graphics/
  12. 12. Il faut (pour faire comme moi) Un Mac (sinon lis la doc) Ruby (avec rbenv, rvm, pik, ce que tu veux) Virtual Box (Sinon c'est plus cher et + dur)
  13. 13. Installation % gem install chef --no-ri --no-rdoc Successfully installed chef-11.4.4 1 gem installed
  14. 14. Création d'un compte https:// community.opscode.com /users/new
  15. 15. Les fichiers
  16. 16. Ça vous donne : ===== .chef/knife.rb current_dir = File.dirname(__FILE__) log_level :info log_location STDOUT node_name "nledez-demo" client_key "#{current_dir}/nledez-demo.pem" validation_client_name "nledez-demo-validator" validation_key "#{current_dir}/nledez-demo-validator.pem" chef_server_url "https://api.opscode.com/organizations/nledez-demo" cache_type 'BasicFile' cache_options( :path => "#{ENV['HOME']}/.chef/checksums" ) cookbook_path ["#{current_dir}/../cookbooks"]
  17. 17. Et aussi : ===== .chef/nledez-demo-validator.pem -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAtuj2RaZHccGQzTVo++ZMdO9NHhmOM+KjtBe5xdKcsRjdeJBZ DxcYt+gf/blIsf5V/MVt5WJDdaovwEXddwUnpnIAtKClOKqq7TZ0j6Z9LGmgSZ3X dRPYb7J3SvVgJCc3RIjvw5lBF1QANHZTMrymUptvJZQkqn9YstYrY128HaBJJqux m4dRFTuOZtEfM7PTioeyMg95WJkH3qrtz7ndsx/X1dUUOAl5xalj3g== -----END RSA PRIVATE KEY-----
  18. 18. Et enfin : ===== .chef/nledez-demo.pem -----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEAwCOC8jpxa+wqNsOKmwpwXyODDVLMkrO74LyK0vH1Rsn/MHO8 YAS/TNtj36Y/B/0sZSJSw1KEI99vie36M61XxVMytJRTGvOKHAx4HkHm+gdz5vi1 2JhkYo5JRCMzBXeMXgcrh8IDeUmdrjb2P/4yBYLPZrSSjwypbRrfB/Yx8cOZ9XKV JZYBAoGANwZ157/Afyus7ZIb5Rh3iCxCPqJKtmo257gh4Yzbv/MEcStI2Ync3k04 mCQ6MlSCH4XaEg6NhMDBy/ahnJ3gf8wzPsxDYbVMCgai9/RRxRJ5DTgDkyDma6f/ fbd1ldFNWrAyix7mOsIPLElEyYczVoYZDJsMf9EETwbvUArrcOo= -----END RSA PRIVATE KEY-----
  19. 19. Ç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:
  20. 20. 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.
  21. 21. Pour le compléter % cd chef-repo % ls LICENSE Rakefile chefignore cookbooks environments README.md certificates config data_bags roles % rm -rf .git % mv README.md ../README-chef.md # Si vous voulez garder votre README.md d'origine % mv * .. mv .gitignore .. % cd .. % git add .gitignore * % git commit -m "Add a clean chef repo" [master 2e7e758] Add a clean chef repo 11 files changed, 545 insertions(+), 1 deletion(-) create mode 100644 LICENSE create mode 100644 README-chef.md create mode 100644 Rakefile create mode 100644 certificates/README.md create mode 100644 chefignore create mode 100644 config/rake.rb create mode 100644 cookbooks/README.md create mode 100644 data_bags/README.md create mode 100644 environments/README.md create mode 100644 roles/README.md
  22. 22. Premier Cookbook En mode TDD
  23. 23. TDD ?
  24. 24. Création du cookbook % knife cookbook create nginx_unicorn % git status # On branch master # Untracked files: # cookbooks/nginx_unicorn/ % git add cookbooks/nginx_unicorn ; git commit -m "Fresh nginx_unicorn cookbook" [master 5be0d84] Fresh nginx_unicorn cookbook 4 files changed, 95 insertions(+) create mode 100644 cookbooks/nginx_unicorn/CHANGELOG.md create mode 100644 cookbooks/nginx_unicorn/README.md create mode 100644 cookbooks/nginx_unicorn/metadata.rb create mode 100644 cookbooks/nginx_unicorn/recipes/default.rb
  25. 25. Sanity checks % bundle exec foodcritic cookbooks/nginx_unicorn FC008: Generated cookbook metadata needs updating: cookbooks/nginx_unicorn/metadata.rb:2 FC008: Generated cookbook metadata needs updating: cookbooks/nginx_unicorn/metadata.
  26. 26. É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'
  27. 27. 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 .
  28. 28. 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
  29. 29. 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
  30. 30. 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
  31. 31. Le code # # Cookbook Name:: nginx_unicorn # Recipe:: default # # Copyright 2013, Ledez Incorporated # # All rights reserved - Do Not Redistribute # package "nginx" do   action :install end
  32. 32. Qui passe vert % bundle exec rspec --color Compiling Cookbooks... . ! Finished in 0.00429 seconds 1 example, 0 failures
  33. 33. Démo
  34. 34. QR ?
  35. 35. Merci
  36. 36. @nledez nicolas.ledez.net

×