Ghost AcademySecLearn// Seguridad Informática
🌐 unfantasmaenelsistema.com
⚙ IaC · Configuration Management · Ruby · DevOps
Chef

Herramienta de gestion de configuracion (CM) basada en Ruby que trata la infraestructura como codigo (Infrastructure as Code). Guia completa: instalacion del Workstation, creacion de cookbooks, modo standalone y arquitectura cliente-servidor con bootstrapping de nodos.

chef knife chef-client cookbooks recipes bootstrap
IaCDevOps RubyCM NginxUbuntu knife.rbrun_list

Que es Chef

Chef es una poderosa herramienta de gestion de configuracion (Configuration Management, CM) basada en Ruby. Se utiliza para optimizar la tarea de configurar, desplegar y mantener servidores a gran escala, tratando la infraestructura como codigo (Infrastructure as Code, IaC).

📚 Filosofia IaC: En lugar de configurar servidores manualmente, Chef te permite describir el estado deseado de tu infraestructura en codigo (las recetas y cookbooks). Chef se encarga de llevar cada servidor a ese estado de forma automatica y repetible.

La instalacion y el uso inicial de Chef se centran en dos componentes principales:

  • Chef Workstation: La maquina desde donde se gestionan los cambios — contiene todas las herramientas (chef, knife, inspec, cookstyle).
  • Chef Server: El servidor central que almacena cookbooks, nodos, roles y politicas.

Arquitectura Chef

💻
Workstation
chef, knife
cookbooks
→
🏢
Chef Server
cookbooks, nodos
roles, politicas
→
⌨
Nodo 1
chef-client
run_list
→
⌨
Nodo 2..N
chef-client
run_list

El Workstation usa knife para enviar cookbooks al Chef Server. Los nodos ejecutan chef-client periodicamente, descargan sus recetas del server y aplican la configuracion deseada.

Conceptos Clave

IaC
Cookbook
Unidad fundamental de Chef. Coleccion de recetas, atributos, plantillas y archivos que definen la configuracion de un sistema.
Ruby DSL
Recipe (Receta)
Archivo .rb dentro de un cookbook que describe el estado deseado de recursos del sistema (paquetes, servicios, archivos).
knife
Run List
Lista ordenada de recetas y roles que un nodo debe aplicar. Define exactamente que configuracion se aplica a cada servidor.
bootstrap
Node (Nodo)
Cualquier servidor (fisico, VM o cloud) que ejecuta chef-client y esta registrado en el Chef Server.
chef-client
Resource
Bloque de codigo en una receta que representa un elemento del sistema: package, service, file, template, etc.
knife.rb
Knife
Herramienta de linea de comandos del Workstation para interactuar con el Chef Server: subir cookbooks, gestionar nodos, hacer bootstrap.
01
Instalacion de Chef Workstation
Paquete .deb — chef, knife, inspec, cookstyle

El Chef Workstation es el kit de herramientas que contiene todo lo necesario para interactuar con el Chef Server.

  1. Descargar el paquete DEB:
    bash — descargar paquete
    cd /tmp
    wget https://packages.chef.io/files/stable/chef-workstation/25.9.1094/ubuntu/22.04/chef-workstation_25.9.1094-1_amd64.deb
  2. Instalar el paquete con dpkg:
    bash — instalar
    sudo dpkg -i chef-workstation_25.9.1094-1_amd64.deb
  3. Verificar la instalacion:
    bash — verificar version
    chef -v
⚠ URL especifica por distro: La URL del paquete es un patron comun de Chef. Si el enlace falla, busca la URL especifica para Ubuntu 24.04 en la pagina oficial de descargas de Chef Workstation en chef.io.
02
Configuracion del Repositorio
~/chef-repo — estructura de cookbooks, roles y configuracion

El Workstation necesita un lugar para almacenar sus archivos de configuracion (cookbooks, roles, etc.), conocido como el Repositorio de Chef.

bash — crear estructura del repositorio
# Crear el directorio raiz del repositorio
mkdir ~/chef-repo
cd ~/chef-repo

# Crear el directorio de cookbooks
mkdir cookbooks
📁 Los Cookbooks son el corazon de Chef: Son colecciones de recetas que definen las configuraciones. Toda la logica de automatizacion vive dentro de los cookbooks en ~/chef-repo/cookbooks/.
03
Creacion del Primer Cookbook
chef generate cookbook — ejemplo: webserver con Nginx
  1. Generar el cookbook webserver:
    bash — generar estructura del cookbook
    chef generate cookbook cookbooks/webserver

    Crea una estructura de directorios estandar en ~/chef-repo/cookbooks/webserver/

  2. Editar la receta por defecto default.rb:
    bash — abrir receta
    nano cookbooks/webserver/recipes/default.rb
  3. Anadir codigo de receta para instalar Nginx:
    cookbooks/webserver/recipes/default.rb
    # Instalar el paquete Nginx
    package 'nginx' do
      action :install
    end
    
    # Asegurar que el servicio Nginx este activo y habilitado
    service 'nginx' do
      action [:enable, :start]
    end
📚 Ruby DSL declarativo: En lugar de escribir comandos imperativos (apt install nginx), Chef usa un DSL declarativo: describes el estado deseado (package 'nginx' do action :install end) y Chef se encarga de llegar a el, independientemente del estado actual del sistema. Es idempotente — se puede ejecutar multiples veces sin efectos secundarios.
04
Uso en Modo Standalone (Chef Zero)
chef-client -z — pruebas locales sin necesidad de Chef Server

Antes de interactuar con un servidor central, puedes probar el cookbook localmente usando Chef Zero (emulado por chef-client -z), ideal para desarrollo y pruebas.

  1. Ejecutar el cliente Chef en modo local:
    bash — chef-client modo local
    sudo chef-client --local-mode --runlist 'recipe[webserver]'
    • --local-mode / -z: Ejecuta Chef sin servidor (modo Chef Zero)
    • --runlist 'recipe[webserver]': Especifica que receta aplicar
  2. Verificar que Nginx se ha instalado:
    bash — verificar servicio
    systemctl status nginx
    # Salida esperada: Active: active (running)
💡 Salida esperada: Al finalizar, Chef muestra Chef Client finished... 0 resources updated si todo estaba ya en el estado correcto, o el numero de recursos que se han modificado. Esto confirma la ejecucion correcta.
05
Integracion con Chef Server
Produccion — gestion centralizada de multiples nodos

Para usar Chef en un entorno real con multiples nodos, se necesita un Chef Server que centralice la gestion de cookbooks, nodos, roles y politicas.

  • Instalar y configurar el Chef Server — generalmente en una maquina separada.
  • Descargar archivos de acreditacion (Keys): El servidor proporciona un archivo de clave de usuario (.pem) y un archivo knife.rb.
  • Aprovisionar los nodos (Bootstrapping): Usar knife para instalar chef-client en servidores remotos y conectarlos al Chef Server.

5.1 Configuracion del Workstation — knife.rb

El Workstation necesita credenciales (.pem keys) y el archivo knife.rb para comunicarse de forma segura con el Chef Server.

~/chef-repo/knife.rb
current_dir = File.dirname(__FILE__)

log_level        :info
log_location     STDOUT

node_name        'feval'
client_key       "#{current_dir}/feval.pem"

chef_server_url  'https://chef-server.tu-dominio.com/organizations/mi_org'

cookbook_path    ["#{current_dir}/cookbooks"]
DirectivaDescripcion
current_dir = File.dirname(__FILE__)Define el directorio actual del archivo knife.rb como referencia para rutas relativas.
log_level :infoNivel de registro (logging). Opciones: :debug, :info, :warn, :error.
log_location STDOUTDonde enviar los registros — en este caso la consola.
node_name 'feval'Nombre de usuario para autenticarse en el Chef Server.
client_key "#{current_dir}/feval.pem"Ruta a la clave privada (.pem) del usuario para autenticacion segura.
chef_server_url '...'URL del Chef Server incluyendo la organizacion. Debe coincidir con la configuracion del servidor.
cookbook_path [...]Ruta local donde knife buscara los cookbooks para subirlos al servidor.

5.2 Cargar el Cookbook al Servidor

El cookbook creado localmente debe subirse al Chef Server para que los nodos remotos puedan descargarlo y aplicarlo.

bash — subir y verificar cookbook
# Subir el cookbook 'webserver' y todas sus dependencias al Chef Server
knife cookbook upload webserver

# Verificar que el cookbook esta en el servidor
knife cookbook list

5.3 Bootstrapping del Nodo

El bootstrapping es el proceso de instalar chef-client en un servidor remoto (el nodo) y configurarlo para que se conecte automaticamente al Chef Server.

bash — knife bootstrap
sudo knife bootstrap <IP_O_NOMBRE_DEL_NODO>   --ssh-user <USUARIO_SSH>   --sudo   --node-name <NOMBRE_DEL_NODO>   -r 'recipe[webserver]'
ArgumentoDescripcion
<IP_O_NOMBRE_DEL_NODO>Direccion IP o nombre DNS del servidor remoto a aprovisionar.
--ssh-user <USUARIO>Usuario SSH para conectarse al nodo remoto (ej. ubuntu, centos).
--sudoIndica que se usaran privilegios sudo en el nodo remoto durante el bootstrap.
--node-name <NOMBRE>Nombre que tendra el nodo registrado en el Chef Server (ej. web01).
-r 'recipe[webserver]'Run List inicial: Una vez instalado, el nodo ejecuta inmediatamente la receta por defecto del cookbook webserver.

5.4 Verificacion y Gestion de Nodos

Una vez completado el bootstrapping, el nodo ya esta bajo la gestion del Chef Server.

bash — gestion de nodos con knife
# Listar todos los nodos registrados en el Chef Server
knife node list

# Ver propiedades detalladas de un nodo especifico
knife node show <NOMBRE_DEL_NODO>

# Anadir un nuevo cookbook al run_list del nodo
knife node run_list add <NOMBRE_DEL_NODO> 'recipe[firewall]'

# Aplicar cambios en el nodo (ejecutado desde el propio nodo o via SSH)
ssh <USUARIO_SSH>@<IP_O_NOMBRE_DEL_NODO> 'sudo chef-client'
🔄 Ciclo de vida del nodo: El chef-client en cada nodo se ejecuta periodicamente (por defecto cada 30 minutos) o se puede disparar manualmente via SSH. En cada ejecucion, descarga los cookbooks actualizados del Chef Server y aplica cualquier cambio de configuracion — garantizando que el nodo siempre este en el estado deseado.
⚠ Aplicar cambios de forma segura: Normalmente no se ejecuta chef-client directamente desde el Workstation via SSH en produccion. Lo ideal es actualizar el run_list en el Chef Server y dejar que el chef-client del nodo lo aplique en su siguiente ciclo de ejecucion automatica.