Chef es una plataforma de gestión de configuración en la que describes el estado de tus servidores con recetas escritas en un DSL de Ruby, agrupadas en cookbooks. Tiene tres piezas: Chef Infra Server, que guarda cookbooks y datos de los nodos; Chef Workstation, donde escribes el código y usas knife; y Chef Infra Client, que corre en cada nodo y aplica su configuración. En este tutorial montarás las tres piezas en Ubuntu, crearás un cookbook que instala Nginx y lo aplicarás a un nodo con knife bootstrap.
NotaChef es un producto de Progress. Los paquetes oficiales exigen aceptar su licencia y, según la versión y el uso, pueden requerir una clave de licencia. Si necesitas una distribución totalmente libre, Cinc (cinc.sh) compila el mismo código fuente sin la marca Chef; los conceptos y la mayoría de comandos de esta guía son iguales, cambiando el prefijo (
cinc-server-ctl,cinc-client).
Requisitos previos
Necesitas tres máquinas, por ejemplo VPS de CubePath:
- Chef Infra Server: Ubuntu LTS de 64 bits soportada por la versión de Chef Infra Server que descargues (consulta su matriz de plataformas), con al menos 4 vCPU y 8 GB de RAM. Chef Server incluye PostgreSQL, OpenSearch y nginx, y no funciona bien con menos memoria.
- Workstation: tu equipo con Ubuntu u otra máquina Ubuntu 24.04 desde la que administrarás el resto.
- Nodo: un servidor Ubuntu 24.04 limpio al que la workstation pueda acceder por SSH con clave y un usuario con
sudo. - El puerto TCP 443 del servidor accesible desde la workstation y el nodo.
Valores de ejemplo:
| Rol | FQDN | IP |
|---|---|---|
| Chef Infra Server | chef.example.com | server_ip |
| Workstation | - | workstation_ip |
| Nodo | web01 | node_ip |
Paso 1: Preparar el nombre del servidor
Chef Server genera su certificado TLS y sus URLs a partir del FQDN, así que debe estar fijado antes de instalar. En el servidor:
sudo hostnamectl set-hostname chef.example.com
Si no tienes un registro DNS para ese nombre, añádelo a /etc/hosts en el servidor, la workstation y el nodo:
sudo nano /etc/hosts
server_ip chef.example.com
Comprueba que resuelve desde cada máquina:
getent hosts chef.example.com
Paso 2: Instalar Chef Infra Server
Descarga el paquete .deb de Chef Infra Server para tu versión de Ubuntu desde la página de descargas oficial de Chef y cópialo al servidor. Instálalo con apt para que resuelva cualquier dependencia:
sudo apt install ./chef-server-core_*.deb
El paquete solo copia los archivos. reconfigure configura y arranca todos los servicios internos; la primera vez tarda varios minutos:
sudo chef-server-ctl reconfigure --chef-license=accept
Comprueba que todos los servicios están en marcha:
sudo chef-server-ctl status
run: bookshelf: (pid 2345) 120s; run: log: (pid 2301) 125s
run: nginx: (pid 2410) 118s; run: log: (pid 2398) 120s
run: oc_bifrost: (pid 2201) 130s; run: log: (pid 2190) 131s
run: opscode-erchef: (pid 2460) 115s; run: log: (pid 2450) 116s
run: postgresql: (pid 2101) 140s; run: log: (pid 2099) 141s
...
Permite HTTPS desde la workstation y el nodo:
sudo ufw allow from workstation_ip to any port 443 proto tcp
sudo ufw allow from node_ip to any port 443 proto tcp
Paso 3: Crear el usuario administrador y la organización
Todo en Chef Server pertenece a una organización. Crea primero tu usuario. Con --prompt-for-password la contraseña se pide de forma interactiva y no queda en el historial de la shell. La clave privada del usuario se guarda en el archivo indicado con --filename:
sudo mkdir -p /root/chef-keys
sudo chef-server-ctl user-create your_user Nombre Apellido [email protected] --prompt-for-password --filename /root/chef-keys/your_user.pem
Crea la organización y asocia a ella tu usuario como administrador:
sudo chef-server-ctl org-create miorg "Mi Organizacion" --association_user your_user --filename /root/chef-keys/miorg-validator.pem
Comprueba que existen:
sudo chef-server-ctl user-list
sudo chef-server-ctl org-list
pivotal
your_user
miorg
Solo necesitarás llevar a la workstation la clave del usuario, your_user.pem. Cópiala por un canal seguro (por ejemplo con scp desde la workstation) y no la dejes en directorios compartidos.
Paso 4: Instalar y configurar Chef Workstation
En la workstation, descarga el paquete .deb de Chef Workstation para Ubuntu desde la misma página de descargas e instálalo:
sudo apt install ./chef-workstation_*.deb
Comprueba la instalación. La primera ejecución te pide aceptar la licencia:
chef -v
Chef Workstation version: ...
Chef Infra Client version: ...
Chef InSpec version: ...
Para llevar tu clave privada a la workstation, primero cópiala en el servidor a tu directorio personal con permisos solo para tu usuario (/root/chef-keys solo lo puede leer root):
sudo install -m 600 -o your_user -g your_user /root/chef-keys/your_user.pem ~/your_user.pem
Después, en la workstation, crea el directorio de configuración de knife, descarga la clave y bórrala del directorio personal del servidor:
mkdir -p ~/.chef
scp your_user@server_ip:your_user.pem ~/.chef/
chmod 600 ~/.chef/your_user.pem
ssh your_user@server_ip rm your_user.pem
Crea el archivo de credenciales de knife:
nano ~/.chef/credentials
[default]
client_name = "your_user"
client_key = "/home/your_user/.chef/your_user.pem"
chef_server_url = "https://chef.example.com/organizations/miorg"
Chef Server usa un certificado autofirmado. Descárgalo para que knife confíe en él y verifica la conexión:
knife ssl fetch
knife ssl check
Connecting to host chef.example.com:443
Successfully verified certificates from `chef.example.com'
Por último, prueba una llamada a la API:
knife client list
miorg-validator
Paso 5: Crear un cookbook
Crea un repositorio de trabajo y genera un cookbook llamado miweb:
mkdir -p ~/chef-repo/cookbooks
cd ~/chef-repo/cookbooks
chef generate cookbook miweb
El generador crea, entre otros, metadata.rb (nombre, versión y dependencias), recipes/default.rb y la estructura de tests. Define un atributo con el nombre del sitio, que podrás sobrescribir por nodo o por rol:
mkdir -p ~/chef-repo/cookbooks/miweb/attributes
nano ~/chef-repo/cookbooks/miweb/attributes/default.rb
default['miweb']['site_name'] = 'Mi web gestionada con Chef'
Escribe la receta. Cada bloque es un recurso que describe un estado deseado; Chef los aplica en orden y solo actúa si el estado real es distinto:
nano ~/chef-repo/cookbooks/miweb/recipes/default.rb
package 'nginx'
template '/var/www/html/index.html' do
source 'index.html.erb'
owner 'root'
group 'root'
mode '0644'
variables(site_name: node['miweb']['site_name'])
end
service 'nginx' do
action [:enable, :start]
end
Crea la plantilla ERB que usa la receta:
mkdir -p ~/chef-repo/cookbooks/miweb/templates
nano ~/chef-repo/cookbooks/miweb/templates/index.html.erb
<h1><%= @site_name %></h1>
<p>Servidor: <%= node['fqdn'] %></p>
Sube el cookbook al servidor y comprueba que está disponible:
cd ~/chef-repo
knife cookbook upload miweb --cookbook-path cookbooks
knife cookbook list
Uploading miweb [0.1.0]
Uploaded 1 cookbook.
miweb 0.1.0
Paso 6: Registrar el nodo con knife bootstrap
knife bootstrap se conecta por SSH al nodo, instala Chef Infra Client, lo registra en el servidor con su propia clave y ejecuta la primera convergencia con la lista de recetas (run list) que indiques:
knife bootstrap node_ip \
--connection-user your_user \
--ssh-identity-file ~/.ssh/id_ed25519 \
--sudo \
--node-name web01 \
--run-list 'recipe[miweb]' \
--chef-license accept
Al final de la salida verás el resumen de la ejecución en el nodo:
[node_ip] Chef Infra Client finished, 3/3 resources updated in 25 seconds
Notael bootstrap descarga Chef Infra Client desde los servidores de Chef. Si tu versión o licencia no lo permite, instala antes el paquete de Chef Infra Client (o Cinc Client) en el nodo;
knife bootstrapdetecta que ya está instalado y no lo vuelve a descargar.
Paso 7: Verificar el resultado
Desde la workstation, comprueba que el nodo está registrado con su run list:
knife node show web01
Node Name: web01
Environment: _default
FQDN: web01
IP: node_ip
Run List: recipe[miweb]
Recipes: miweb, miweb::default
Platform: ubuntu 24.04
Y que Nginx sirve la página generada:
curl -s http://node_ip
<h1>Mi web gestionada con Chef</h1>
<p>Servidor: web01</p>
El nombre que aparece es el hostname real del nodo.
Para aplicar cambios futuros, modifica el cookbook, sube la versión en metadata.rb, vuelve a ejecutar knife cookbook upload y lanza Chef Infra Client en el nodo:
ssh your_user@node_ip sudo chef-client
Si no hay cambios pendientes, la ejecución termina con 0/3 resources updated: la receta es idempotente.
Solución de problemas
chef-server-ctl reconfigurefalla o los servicios se reinician continuamente: suele ser falta de memoria. Revisasudo chef-server-ctl taily la RAM disponible.SSL Validation failure connecting to host: no has ejecutadoknife ssl fetcho el nombre dechef_server_urlno coincide con el FQDN del certificado.401 Unauthorizeden knife:client_nameoclient_keyen~/.chef/credentialsno corresponden al usuario creado en el servidor.- El bootstrap falla al registrar el nodo: el nodo no resuelve
chef.example.como no llega al puerto 443. Comprueba/etc/hostsen el nodo y el firewall del servidor. Node web01 existsal repetir un bootstrap: borra el nodo y su cliente antes conknife node delete web01 -yyknife client delete web01 -y.
Conclusión
Tienes un Chef Infra Server con una organización, una workstation configurada con knife y un nodo gestionado por un cookbook propio. Como siguientes pasos, guarda ~/chef-repo en Git, prueba los cookbooks con Test Kitchen antes de subirlos, agrupa run lists en roles y programa ejecuciones periódicas de Chef Infra Client en los nodos.
