Provisionando con Chef

@jjmerelo para Granada Geek + @iv_gii

Provisionar == amueblar

1. Provisionar

2. Comprobar

Usando chef-run

chef-run
    -i .vagrant/machines/default/virtualbox/private_key
      vagrant@127.0.0.1:2222 package ruby action=install
ejecutando

chef-run es

chef-run objetivo recurso nombre [otras cosas]
chef-run localhost package ruby [..]

Recursostareas

Recurso + recurso +... → Receta

Recursos →

Describen el estado deseado

Y los pasos para alcanzarlo

Y el tipo

Y propiedades adicionales

chef-run es

chef-run localhost package ruby action=install
chef-run localhost tipo-recurso recurso pasos

chef-run se auto-instala

Necesita acceso sudo

Usando recetas

package 'git' do
  action :install
end
            
chef-run -i path-to/private_key user@host git.rb

Una receta

git 'microservice' do
  repository 'https://github.com/JJ/microservices-broker'
  user 'vagrant'
  destination '/home/vagrant/microservice'
  action :checkout
end
            

Sh*t happens

apt_package 'ruby' do
  default_release '2.3'
end
            
The converge of the remote host failed for the
following reason:

  Expected process to exit with [0], but received '100'
            

Usa los logs, Luke

 tail   ~/.chef-workstation/logs/default.log
STDOUT: ruby:
  Installed: 1:2.1.5+deb8u2
  Candidate: 1:2.1.5+deb8u2
  Version table:
 *** 1:2.1.5+deb8u2 0
        500 http://httpredir.debian.org/debian/ jessie/main amd64 Packages
        100 /var/lib/dpkg/status
STDERR: E: The value '2.3' is invalid for APT::Default-Release as such a release is not available in the sources
---- End output of ["apt-cache", "-o", "APT::Default-Release=2.3", "policy", "ruby"] ----
Ran ["apt-cache", "-o", "APT::Default-Release=2.3", "policy", "ruby"] returned 100
            

Usuario y directorio

user 'app' do
  comment 'User for app'
  home '/app'
  shell '/bin/bash'
  password '$1$JJsvHslasdfjVEroftprNn4JHtDi'
end

directory '/app' do
  owner 'app'
  group 'app'
  mode '0755'
end
	    

Nunca claves en ficheros.

Creando una clave secreta

openssl passwd -1 $MS_PASSWORD

Instalando de verdad

package 'git' 
package 'gcc'
package 'make'
package 'sqlite3' do 
  case node[:platform]
  when 'redhat', 'centos', 'fedora'
    package_name 'sqlite-devel'
  when 'ubuntu', 'debian'
    package_name 'libsqlite3-dev'
  end
end
	    

Finalmente, las gemas

chef_gem 'bunny'
chef_gem 'sinatra'
chef_gem 'json'
chef_gem 'httparty'
chef_gem 'sqlite3'
chef_gem 'etcdv3'	    

Y más cosas

Servicios

Plantillas

Usa siempre sistemas de aprovisionamiento.

Infraestructura como código es reproducible

Y testeable

Vagrant + Chef == combinación ganadora