@drawoharajag ❤️ det här! << klicka på mig 🐛 🫖 🧚
/cooking-up-a-storm-with-vagrant-librarian-and-chef-solo
publicerad den: 2013-02-19

Det är ganska lätt att konfigurera apache på en enskild dator. Det blir lite mer intressant om du har flera värdar i konfigurationen. Det blir ännu mer roligt när du har en komplex konfiguration som inkluderar proxyfunktioner, URL-omskrivning och någon textersättning.

Men ändå, inget som en erfaren systemadministratör inte kan hantera med lite omsorg.

Tills, väl, du måste göra det igen.

Här kommer verktyg som Chef och Puppet in i bilden. Båda verktygen tillåter dig att deklarera och definiera hur system bör se ut och hur de bör konfigureras. Båda är kraftfulla och båda används aktivt för att konfigurera allt från utvecklar arbetsstationer till stora distributioner av hundratusentals maskiner.

Precis som mjukvara måste du fortfarande bygga och testa den konfiguration du bygger. Dina alternativ för detta sträcker sig från mycket dyrt (köp en eller flera servrar), till måttligt dyrt (kör några instanser på EC2) till mycket, mycket billigt. Det mycket, mycket billiga alternativet skulle vara att bygga och testa dina recept på virtuell(a) dator(er) som körs på ditt system. Här kommer Vagrant in i bilden.

Vagrant är ett omslag kring Oracle:s VirtualBox desktop-virtualiseringsplattform. Vagrants konfiguration kretsar kring några enkla begrepp. Du har en konfigurationsfil med namnet Vagrantfile i roten av projektet. Den filen innehåller någon grundläggande konfiguration såsom vilken baslåda som ska användas för projektet och vilka portar som ska exponeras för värdsystemet. Och lika viktigt, den kan beskriva hur den virtuella maskinen ska provisioneras så att den passar projektets behov. Medan Vagrant stöder både Puppet och Chef, valde jag att använda Chef-Solo för att provisionera detta projekt.

Att komma igång med Vagrant är enkelt. Första steget är enkelt att installera vagrant gem. Precis som vilket annat Ruby-projekt som helst, valde jag att installera vagrant och några andra gems via Bundler. Här är den resulterande Gemfile:

source 'https://rubygems.org'
gem 'vagrant'
gem 'librarian'

Att köra bundle install installerade de nödvändiga gems i projektkatalogen. En snabb rbenv rehash gjorde Vagrant-skriptet tillgängligt för mitt shell.

Nästa steg var att ställa in den mest grundläggande Vagrant-konfigurationen. Jag körde vagrant init och redigerade sedan den resulterande Vagrantfilen så att den såg ut så här:

Vagrant::Config.run do |config|
  # Varje Vagrant virtuella miljö kräver en låda att bygga från.
  config.vm.box = "ubuntu-precise-64"
  
  # URL:en från var 'config.vm.box' lådan hämtas om den
  # inte redan finns på användarens system.
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
end

Detta uppnår två saker. Först, deklarerar det namnet på den låda vi ska bygga på och var vi kan hitta den lådan. En snabb vagrant up kommer initialt att ladda ner baslådan, importera den i projektet och starta VM:en. Det tar en stund att ladda ner lådan, men den är cachad på ditt system så du behöver inte ladda ner den igen. Du kan även återanvända samma baslåda om du väljer att göra det i andra projekt. Att anropa vagrant halt stoppar VM:en och att anropa vagrant destroy, väl, förstör VM:en själv.

Vi har fortfarande inte gjort mycket för att provisionera vår VM ännu. Nästa steg är att berätta för Vagrant hur man gör det.

Librarian är en annan fin gem i linje med Bundler och CocoaPods som tillåter dig att deklarera vilka Chef-recept du använder. I vårt fall ser en redigerad kopia av projektets Cheffile ut så här:

#!/usr/bin/env ruby
#^syntax detection
site 'http://community.opscode.com/api/v1'
cookbook 'apt'
cookbook 'apache2', '>= 1.0.0'
cookbook 'rbenv', :git => 'git://github.com/fnichol/chef-rbenv.git', :ref => 'v0.7.2'
cookbook 'ruby_build'
cookbook 'openssh', :git => 'git://github.com/fnichol/chef-openssh.git'
cookbook 'git'
cookbook 'build-essential'
cookbook 'vim'
cookbook 'user'
cookbook 'sudo'

Den största fördelen är att du inte behöver sälja kokböckerna i dina projekt. Att köra librarian-chef install kommer att hämta kokböckerna och installera dem under cookbooks-katalogen. Detta genererar även en Cheffile.lock för att dokumentera vilka versioner av kokböckerna som installerades.

Jag var då på en punkt där jag kunde berätta för Vagrant att använda Chef-Solo för att provisionera lådan genom att uppdatera Vagrantfile:

Vagrant::Config.run do |config|
  # Varje Vagrant virtuella miljö kräver en låda att bygga från.
  config.vm.box = "ubuntu-precise-64"
  
  # URL:en från var 'config.vm.box' lådan hämtas om den
  # inte redan finns på användarens system.
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
  
  # Aktivera provisionering med chef solo, anger en sökväg för kokböcker, roller
  # sökväg och sökväg för data_bags (alla relativt till denna Vagrantfil), och lägger till
  # några recept och/eller roller.
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
    chef.add_recipe "apt"
    chef.add_recipe "build-essential"
    chef.add_recipe "ruby_build"
    chef.add_recipe "rbenv::system"
    chef.add_recipe "rbenv::vagrant"
    chef.add_recipe "git"
    chef.add_recipe "user"
    chef.add_recipe "vim"
    chef.add_recipe "sudo"
    chef.add_recipe "openssh"
    chef.add_recipe "apache2"
    
    chef.json = {
      autorisering: {
        sudo: {
          lösenordsfritt: sant,
          grupper: ["admin", "sudo"]
        }
      },
      openssh: {
        tillåt_root_inloggning: "nej",
        lösenordsautentisering: "ja"
      },
      rbenv: {