Chef - Paris BlockCamp - Nov 09
Upcoming SlideShare
Loading in...5
×
 

Chef - Paris BlockCamp - Nov 09

on

  • 4,060 views

A short overview (in french) of Opscode Chef in an impromptu session @ Paris BlockCamp, Nov. 28 2009.

A short overview (in french) of Opscode Chef in an impromptu session @ Paris BlockCamp, Nov. 28 2009.

Statistics

Views

Total Views
4,060
Views on SlideShare
3,737
Embed Views
323

Actions

Likes
1
Downloads
66
Comments
0

3 Embeds 323

http://people.no-distance.net 306
http://www.slideshare.net 16
http://dige.st 1

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Chef - Paris BlockCamp - Nov 09 Chef - Paris BlockCamp - Nov 09 Presentation Transcript

  • Automatiser son infrastructure avec Chef Olivier Gutknecht Fotonauts, Inc. olg@fotonauts.com - twitter.com/olg An impromptu session @ Blockcamp Paris - 28/11/2009
  • Orage, ô désespoir X X X X X
  • CHEF
  • http://www.brooklynstreetart.com/theBlog/wp-content/uploads/2008/12/swedish_chef_bork-sleeper-cell.jpg
  • Mar 06, 2008 Born 6 mars 2008
  • Jan 05, 2009 Released
  • Apr 24, 2009 Funded
  • Chef en 2 lignes • Définir un état stable souhaité pour son infrastructure • ... et laisser Chef l’y amener
  • Vu de loin
  • Vu de loin • Un système de gestion de configuration
  • Vu de loin • Un système de gestion de configuration • Une bibliothèque Ruby pour l’implémenter
  • Vu de loin • Un système de gestion de configuration • Une bibliothèque Ruby pour l’implémenter • Une API REST pour interagir
  • Principes • Idempotent • Extensible • Introspectable • Validable
  • Infrastructure is Code • Du code, pas des lignes de commandes • Réutilisable, versionable, commenté • À un niveau global de l’infrastructure • “Quasi” déclaratif
  • Chef Server Polling Synchronisation des recettes Echange de l’état de configuration Chef Chef Client Client
  • Le Serveur Chef Chef Client Search index (solr, ferret) Chef Client Chef Server Cookbooks repository (filesystem) Nodes status repository (couchdb) Chef Client
  • Chef - Web UI
  • Chef - Web UI
  • chef-client • S’authentifie auprès du Chef Server • Envoie sa configuration locale (via Ohai) • Exécute les recettes transmises par le serveur
  • chef-server • Garde trace de la configuration des clients (dans CouchDB et dans le search index) • Maintient le livre de recettes (les cookbooks) • Fournit aux clients leur configuration et leurs recettes
  • Un nœud • Typiquement un système donné (un serveur) • ... avec une liste de recettes et d’attributs • ... qui lance régulièrement chef-client pour appliquer les recettes
  • Cookbooks activemq erlang lvm postfix stompserver apache2 fail2ban man postgresql subversion apparmor gems maradns python sudo apt git memcached quick_start teamspeak aws glassfish mercurial radiant thrift boost god munin rails tomcat6 bootstrap hadoop mysql redmine ubuntu buildessential haproxy nginx resolver varnish capistrano heartbeat nscd rsync xfs chef imagemagick ntp rsyslog zsh couchdb iptables openldap ruby ... django java openssh runit djbdns jira openvpn screen drbd keepalived packages solr dynomite kickstart passenger sqlite ec2 logrotate perl ssh emacs logwatch php known_hosts
  • Resources Meta HTTP Request Route Cron Ifconfig Ruby Block Deploy Link SCM Directory Mount Script Execute Package Service File Remote Directory Template Group Remote File User Un provider compare l’état voulu d’une resource avec l’état du système et prend les actions nécessaires Par exemple, il existe des “providers” rpm, apt-get ou gem pour les resources “Package”
  • Un cookbook attributes Valeurs par défaut, abstractions, customisation server.rb metadata.rb Description, documentation des attributs metadata.json recipes default.rb Recette par défaut pour le cookbook server.rb Variante spécialisée client.rb Variante spécialisée templates default Fichiers génériques de templates de configuration my.cfn.erb redhat Fichiers spécifiques à un système remplaçant les génériques my.cfn.erb libraries Bibliothèque de fonctions Ruby arbitraires my_specific_code.rb
  • Un exemple le cookbook memcached
  • Meta-data maintainer "Opscode, Inc." cookbooks/memcached/metadata.rb maintainer_email "cookbooks@opscode.com" license "Apache 2.0" description "Installs memcached and provides a define to set up an instance of memcache via runit" long_description IO.read(File.join(File.dirname(__FILE__), 'README.rdoc')) version "0.8" depends "runit" %w{ ubuntu debian }.each do |os|   supports os end attribute "memcached/memory",   :display_name => "Memcached Memory",   :description => "Memory allocated for memcached instance",   :default => "64"   attribute "memcached/port",   :display_name => "Memcached Port",   :description => "Port to use for memcached instance",   :default => "11211"   attribute "memcached/user",   :display_name => "Memcached User",   :description => "User to run memcached instance as",   :default => "nobody"
  • Attributes cookbooks/memcached/attributes/memcached.rb set_unless[:memcached][:memory] = 64 set_unless[:memcached][:port] = 11211 set_unless[:memcached][:user] = "nobody"
  • Recipe package "memcached" do cookbooks/memcached/recipes/default.rb   action :upgrade end   package "libmemcache-dev" do   action :upgrade end   service "memcached" do   action :nothing end   template "/etc/memcached.conf" do   source "memcached.conf.erb"   owner "root"   group "root"   mode "0644"   variables(     :ipaddress => node[:ipaddress],     :user => node[:memcached][:user],     :port => node[:memcached][:port],     :memory => node[:memcached][:memory]   )   notifies :restart, resources(:service => "memcached"), :immediately end
  • Template # cookbooks/memcached/templates/default/memcached.conf.erb # Configured by Chef. Local changes will be lost. # # Log memcached's output to /var/log/memcached logfile /var/log/memcached.log   # Start with a cap of 64 megs of memory. It's reasonable, and the daemon default # Note that the daemon will grow to this size, but does not start out holding this much # memory -m <%= @memory %>   # Default connection port is 11211 -p <%= @port %>   # Run the daemon as root. The start-memcached will default to running as root if no # -u command is present in this config file -u <%= @user %>   # Specify which IP address to listen on. The default is to listen on all IP addresses # This parameter is one of the only security measures that memcached has, so make sure # it's listening on a firewalled interface. -l <%= @ipaddress %>  
  • Autres exemples
  • Exemple: le monitoring http://www.flickr.com/photos/jiathwee/2870629436/sizes/l/
  • Exemple: le monitoring • Doit être intégré avec le déploiement/développement http://www.flickr.com/photos/jiathwee/2870629436/sizes/l/
  • Exemple: le monitoring • Doit être intégré avec le déploiement/développement • Utilisation du search index de Chef pour configurer dynamiquement le monitoring http://www.flickr.com/photos/jiathwee/2870629436/sizes/l/
  • (oui, tout automatiser) fotonauts[:admins] = { :kali => { :sms => "3360xxxxxx" }, :olg => { :sms => "3360xxxxxx" }, :ber => { :sms => "3360xxxxxx" }, :aymerick => { :sms => "3360xxxxxx" }, :manu => { :sms => "3360xxxxxx" }, :fred => { :sms => "3360xxxxxx" }, }
  • Exemple: Load Balancing • Simple ! • Chercher quels nœuds ont le rôle de backend rails • Et construire le fichier de configuration en fonction
  • # find all nodes with the "picor" (main app) and "search" recipes recipe client_be_attributes = search(:node, "recipe:picor") client_sr_attributes = search(:node, "recipe:searchr")   backends[:mainapp] = client_be_attributes.map{|cfg| {:hostname=> cfg["hostname"], :fqdn => cfg["fqdn"], :port => cfg["picor_port"], :weight => cfg["picor_backend_weight"]}} backends[:searchr] = client_sr_attributes.map{|cfg| {:hostname=> cfg["hostname"], :fqdn => cfg["fqdn"], :port => cfg["searchr_port"], :weight => cfg["searchr_backend_weight"]}} <% template varnish.conf @backends.each do |backend_name, servers|   next if servers.blank?   servers.each do |server| %> backend <%= backend_name %>_<%= server[:hostname] %> {   .host = "<%= server[:fqdn] %>";   .port = "<%= server[:port] %>"; } <%   end end %> <% unless @backends[:searchr].empty? %>   if (req.http.host ~ "search") {     // search request     set req.backend = searchr;   } <% end %> ...
  • Pratiques extrêmes Installation d’un varnish patché depuis le trunk SVN
  • One more thing Casserole
  • read-only 0.6 - WIP read-write 0.8
  • http://www.flickr.com/photos/jackol/1766679527/sizes/l/ Q &A + http://wiki.opscode.com irc.freenode.net #chef