Skip to content

Instantly share code, notes, and snippets.

@danielpardorus
Created June 30, 2017 09:00
Show Gist options
  • Save danielpardorus/1f11b7a33f62405f404fa1737bd8a014 to your computer and use it in GitHub Desktop.
Save danielpardorus/1f11b7a33f62405f404fa1737bd8a014 to your computer and use it in GitHub Desktop.

Chef Essentials

Nota:
Resources Chef
Documentación chef
IP modo texto

Jerarquía CookBook

├───.chef
├───chef-essentials-repo
│   └───.chef
├───cookbooks
│   ├───**apache**
│   │   ├───attributes
│   │   ├───recipes
│   │   ├───spec
│   │   │   └───unit
│   │   │       └───recipes
│   │   ├───templates
│   │   │   └───default
│   │   └───test
│   │       └───recipes
│   ├───**haproxy**
│   │   ├───.delivery
│   │   │   └───build_cookbook
│   │   │       ├───data_bags
│   │   │       │   └───keys
│   │   │       ├───recipes
│   │   │       ├───secrets
│   │   │       └───test
│   │   │           └───fixtures
│   │   │               └───cookbooks
│   │   │                   └───test
│   │   │                       └───recipes
│   │   ├───recipes
│   │   ├───spec
│   │   │   └───unit
│   │   │       └───recipes
│   │   ├───templates
│   │   │   └───default
│   │   └───test
│   │       └───recipes
│   └───**workstation**
│       ├───list
│       │   ├───attributes
│       │   ├───files
│       │   │   └───default
│       │   ├───libraries
│       │   ├───providers
│       │   ├───recipes
│       │   ├───resources
│       │   └───templates
│       │       └───default
│       ├───recipes
│       ├───spec
│       │   └───unit
│       │       └───recipes
│       ├───templates
│       └───test
│           └───recipes
├───cookbooks.orig
│   └───starter
│       ├───attributes
│       ├───files
│       │   └───default
│       ├───recipes
│       └───templates
│           └───default
└───roles

Creación de recetas dentro de un recetario ($ CHEF):

  • Generar Recetario: $ chef generate cookbook cookbooks/apache
  • Generar Receta: $ chef generate recipe cookbooks/apache server
  • Incluir Receta en receta por defecto: $ include_recipe 'workstation::setup'
  • Generar Template: $ chef generate template cookbooks/apache index.html Imagen Versionado
  • Modificar metadata.rb
  • Modificar (si es necesario README.md)

<%=
<h2>ipaddress: <%= node['ipaddress'] %></h2>

Testing Cookbooks ($ Kitchen):

  • .kitchen.yml para configuraciones.

1. $ kitchen list
2. $ kitchen create
3. $ kitchen converge
= $ kitchen verify (hace un create y un converge pero solo la primera vez)
4. $ kitchen destroy
=$ kitchen test (hace los tres pasos y elimina el contenedor docker si pasa los tests) Diagrama

Aplicación de recetas ($ chef-client):

  • En local:
    $ sudo chef-client --local-mode -r "recipe[workstation]"
  • En Remoto ($ knife) (uso normal) :
    $ knife bootstrap chef@<ip> --sudo -y -N node3 -r "recipe[haproxy]"
    $ knife bootstrap chef@<ip> --sudo -y -N node1 -r "role[web]"
    $ knife ssh "*:*" -x chef -P <password> "sudo chef-client"
    $ knife ssh "role:web" -x chef -P <password> "sudo chef-client"
    $ knife search node "*:*" [-a atributo]

Chef Server ($ knife):

  1. Crear cuenta
  2. Descargar claves y poner en directorio raíz cookbooks
  3. Prepara receta para subir (directorio cookbook/receta) :
    $ berk install
  4. Se sube la receta:
    $ berk upload
  5. $ knife cookbook list
  6. $ knife node list
  7. $ knife node show node1
    Facilitando las cosas con roles :

Nota:
Se pueden descargar recetas desde el supermarket:
$ knife cookbook site download chef-client
Hay que generar .berkfile y metadata.

Configuraciónes:

Atributos:

(se pueden definir dependencias de paquetes en este fichero).

  1. $chef generate attribute cookbooks/apache default
  2. Añadir variables en el fichero:
    • default['apache']['port'] = 8080
  3. Acceso a las variables:
    • <%= node['apache']['port'] %>

##### Roles:
  1. Se crea el archivo en la carpeta roles.
  2. Se crea un rol.
  3. Se sube al servidor:
    $ knife role from file web.rb loadbalancer.rb
  4. Se asigna el rol:
    $ knife node run_list set node1 "role[web]"
  5. Listamos a ver si está subido:
    $ knife role list
    $ knife role show <nombre>
  6. <Si se inicia la maquina por 1ª vez> Se hace bootstrap:
    $ knife bootstrap chef@<ip> --sudo -y -N node3 -r "role[loadbalancer]"
    $ knife bootstrap chef@54.157.100.252 --sudo -y -N node4 -r "role[web]" -E acceptance --bootstrap-version 12.5.1
  7. Se aplica el rol <web..> a todos los nodos que lo tienen asignados con:
    $ knife ssh "role:web" -x chef -P Cod3Can! "sudo chef-client"

Nota!
pandora
snort
literate program
molly-guard
ohai
sudo lokkit -s http
pastebinit -i ../../stats -b sprunge.us
ohai
Comprobar que esta bien un empaquetado: tar tzf chef-client-8.1.2.tar.gz

Environments:
  1. Se crea la carpeta environments y el archivo en la carpeta environments.
  2. Se crea un entorno.
  3. Se sube al servidor:
    $ knife environment from file production.rb
  4. Se asigna el entorno:
    $ knife environment set node1 production
  5. Listamos a ver si está subido:
    $ knife environmentlist
    $ knife environment show <nombre>
  6. Se aplica el rol <web..> a todos los nodos que lo tienen asignados con:
    $ knife ssh "*:*" -x chef -P Cod3Can! "sudo chef-client"
  7. modificar en el balanceador que balancee solo en el rol web y en el entorno de producción (default.rb de haproxy)

Ejemplos configuración:

Wrapping cookbook de terceros
  1. Crear un nuevo cookbook
  2. Integrarlo en otro recetario
Blucle for indexado en Ruby:
<array>.each_with_index do |web,n|
	<%= web['cloud']['public_ipv4'] %>
end
Ejemplo archivo roles\web.rb:
name 'web'
description 'Web Server'
run_list 'recipe[chef-client]','recipe[apache]'
default_attributes({
  "apache" => {
        "port" => 8181
      }
})
Ejemplo archivo environments\produccion.rb:

Lo normal es tener un entorno de producción y otro de pruebas. En el entorno de producción iria la versión anterior a la actual.

name "production"
description "For Prods!"
cookbook "apache", "= 0.1.0"
override_attributes({
  "pci" => {
    "in_scope" => true
  }
})

Default Attribute Precedence:

Precedence

Semantic Versions:

Semantic Versions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment