Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Sysadmin 4 : Chef @ Fotolia

Sysadmin 4 : Chef @ Fotolia

Présenté au séminaire sysadmin #4 à Paris

Renaud Chaput

March 01, 2013
Tweet

More Decks by Renaud Chaput

Other Decks in Technology

Transcript

  1. 2012 • 70 serveurs • Debian (Lenny , Squeeze, FreeBSD

    8 & 9) • 90% géré par Chef • Dont tous les aspects «majeurs» (installation, monitoring, services principaux) • 10% restants : historique non migré
  2. Données de départ • Numéro de série • Emplacement physique

    (DC, baie) • Addresse IP • Hostname • Identifiants ILO
  3. { "eqx-server1.fotolia.loc": { "bootstrap": { "ilo": { "username": "Administrator", "ip":

    "10.12.0.1", "hostname": "ILOCZJ1100AA1", "password": "azerty" }, "parents": [ "eqx-sw4.fotolia.loc" ], "os": "debian-squeeze", "sn": "CZJ1100AA1", "physical_location": { "datacenter": "equinix", "rackposition": "2", "rack": "A5" }, "ip": "10.1.1.101" } } }
  4. Étape 1 : récupération de la MAC • VLAN dédié

    • DHCP avec un boot PXE par défaut • FreeBSD minimale • Au boot, lance un dmidecode et fait une requête HTTP pour associer la MAC de l’interface principale au serial dans Chef
  5. { "eqx-server1.fotolia.loc": { "bootstrap": { "ilo": { "username": "Administrator", "ip":

    "10.12.0.1", "hostname": "ILOCZJ1100AA1", "password": "azerty" }, "parents": [ "eqx-sw4-4948.fotolia.loc" ], "os": "debian-squeeze", "sn": "CZJ1100AA1", "physical_location": { "datacenter": "equinix", "rackposition": "2", "rack": "A5" }, "ip": "10.1.1.101", "mac": "00:26:55:aa:bb:cc", } } }
  6. Étape 2 : génération des fichiers d’installation • Sur le

    serveur d’installation, run Chef qui va écrire les fichiers d’installation : • Configuration DHCP pour boot spécifique selon la MAC • Preseed debian • ...
  7. Étape 3 : installation • Reboot du serveur • Boot

    PXE sur l’OS d’installation désiré • Récupération des fichiers de config en HTTP • Serveur installé !
  8. Étape 3 : installation • Reboot du serveur • Boot

    PXE sur l’OS d’installation désiré • Récupération des fichiers de config en HTTP • Serveur installé !
  9. Évolutions • Contrôle automatique des reboot/boot PXE/... • Boot PXE

    sur un OS qui met à jour les divers firmwares automatiquement • Utilisation de iPXE pour éviter l’étape de détection de la MAC
  10. Chef Server Infra Server DNS DHCP Proxy ... VM Linux

    VM Linux VM FreeBSD ... VMs VirtualBox Gérées par Vagrant Addresses dans 10.251.X.0/24 VBoxNet X Environnement X
  11. Chef Server Infra Server DNS DHCP Proxy ... VM Linux

    VM Linux VM FreeBSD ... VMs VirtualBox Gérées par Vagrant Addresses dans 10.251.X.0/24 VBoxNet X Firewall Backbone Environnement X
  12. Chef Server Infra Server DNS DHCP Proxy ... VM Linux

    VM Linux VM FreeBSD ... VMs VirtualBox Gérées par Vagrant Addresses dans 10.251.X.0/24 VBoxNet X Firewall Quagga Backbone Annonce des routes 10.251.0.0/16 Environnement X
  13. Chef Server Infra Server DNS DHCP Proxy ... VM Linux

    VM Linux VM FreeBSD ... VMs VirtualBox Gérées par Vagrant Addresses dans 10.251.X.0/24 VBoxNet X Firewall Quagga Backbone Annonce des routes 10.251.0.0/16 Autres environnements Environnement X
  14. Git

  15. ~ $ knife sharp align master production On server sandboxnico

    Aligning cookbooks * tacacs is not up-to-date (local: 0.0.6/remote: 0.0.5) Update tacacs cookbook item on server ? Y/N/(A)ll/(Q)uit [N] A * Uploading cookbook(s) tacacs * Bumping tacacs to 0.0.6 for environment production Aligning data bags Data bags are up-to-date. Aligning roles * Infrastructure role is not up-to-date (run list) Update Infrastructure role on server ? Y/N/(A)ll/(Q)uit [N] * Skipping Infrastructure role
  16. Exemple : collectd # cookbooks/collectd/recipes/default.rb template "/etc/collectd/collectd.conf" do source "collectd.conf.erb"

    variables( :auto_plugins => node.run_state[:collectd][:plugins] ) end # cookbooks/collectd/templates/default/collectd.conf.erb <% @auto_plugins.keys.sort.each do |name| %> LoadPlugin "<%= name %>" <% end %>
  17. Exemple : collectd # cookbooks/collectd/definitions/default.rb define :collectd_plugin, :options => []

    do name = params[:name] node.run_state[:collectd][:plugins][name] += params[:options] node.run_state[:collectd][:plugins][name].uniq! end # cookbooks/nginx/recipes/default.rb collectd_plugin "nginx" do options [ { 'URL' => "\"#{status_location}\"" } ] end
  18. Exemple : nginx # cookbooks/nginx/definitions/default.rb define :register_nginx_virtualhost do name =

    params[:name] template "/etc/nginx/vhosts.d/#{name}.conf" do source "vhosts/#{name}.conf.erb" cookbook "nginx" end node.run_state[:nginx][:vhosts] << name end # cookbooks/nginx/recipes/static_fotolia.rb include_recipe 'nginx::default' register_nginx_virtualhost 'static_fotolia' # cookbooks/nginx/templates/default/nginx.conf.erb http { <% node.run_state[:nginx][:vhosts].each do |vhost| %> include "vhosts.d/<%= vhost %>.conf"; <% end %> }
  19. Via les attributs nagios_check "check_nginx_connections" do description "Nginx connections count"

    check_command "check_nginx_connections" arguments node["nginx"]["status"]["port"].to_s servicegroups "nginx" end $ knife node show eqx-server1.fotolia.loc -a nagios.checks.check_nginx_connections -F json { "eqx-server1.fotolia.loc": { "nagios.checks.check_nginx_connections": { "check_command": "check_nginx_connections", "arguments": "8099", "description": "Nginx connections count", "servicegroups": "nginx", } } }
  20. Utilisation de la recherche checks = search(:node, "nagios_checks") checks.each do

    |check| template "/etc/nagios/auto/checks/#{check[:name]}" do ... end end $ cat auto/checks/check_nginx_connections.cfg # automatically registered check_nginx_connections # digest key : 4ef655104985c9c6ed70301164560810 define service { use generic-service service_description Nginx connections count check_command check_nginx_connections!8099 host_name eqx-server1.fotolia.loc, ... servicegroups nginx }
  21. Problématique • Stocker des informations dans un databag sans qu’elles

    ne soient lisibles par tous les noeuds • Exemple : certificats SSL
  22. Avantages • Reste un databag, donc : • Stockés à

    un endroit centralisé • Versionnables • Multi-valués • Il suffit de copier la clé sur la machine et le databag devient lisible
  23. $ openssl rand -base64 512 | tr -d '\r\n' >

    /tmp/my_data_bag_key $ knife data bag create --secret-file /tmp/my_data_bag_key postgresql credentials $ knife data bag show postgresql credentials { "id": "credentials", "pass": "trywgFA6R70NO28PNhMpGhEvKBZuxouemnbnAUQsUyo=\n", "user": "e/p+8WJYVHY9fHcEgAAReg==\n" } secret = Chef::EncryptedDataBagItem.load_secret( "#{node[:postgresql][:secretpath]}" ) creds = Chef::EncryptedDataBagItem.load("postgresql", "credentials", secret)
  24. Chef 11 • erchef / PostgreSQL / Solr • Partials

    dans les templates • knife • Support