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).
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
cookbooks
roles, politicas
run_list
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
.rb dentro de un cookbook que describe el estado deseado de recursos del sistema (paquetes, servicios, archivos).chef-client y esta registrado en el Chef Server.package, service, file, template, etc.El Chef Workstation es el kit de herramientas que contiene todo lo necesario para interactuar con el Chef Server.
- 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
- Instalar el paquete con dpkg:
bash — instalar
sudo dpkg -i chef-workstation_25.9.1094-1_amd64.deb
- Verificar la instalacion:
bash — verificar version
chef -v
chef.io.El Workstation necesita un lugar para almacenar sus archivos de configuracion (cookbooks, roles, etc.), conocido como el Repositorio de Chef.
# Crear el directorio raiz del repositorio mkdir ~/chef-repo cd ~/chef-repo # Crear el directorio de cookbooks mkdir cookbooks
~/chef-repo/cookbooks/.- Generar el cookbook
webserver:bash — generar estructura del cookbookchef generate cookbook cookbooks/webserver
Crea una estructura de directorios estandar en
~/chef-repo/cookbooks/webserver/ - Editar la receta por defecto
default.rb:bash — abrir recetanano cookbooks/webserver/recipes/default.rb
- 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
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.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.
- 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
- Verificar que Nginx se ha instalado:
bash — verificar servicio
systemctl status nginx # Salida esperada: Active: active (running)
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.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
knifepara 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.
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"]
| Directiva | Descripcion |
|---|---|
| current_dir = File.dirname(__FILE__) | Define el directorio actual del archivo knife.rb como referencia para rutas relativas. |
| log_level :info | Nivel de registro (logging). Opciones: :debug, :info, :warn, :error. |
| log_location STDOUT | Donde 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.
# 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.
sudo knife bootstrap <IP_O_NOMBRE_DEL_NODO> --ssh-user <USUARIO_SSH> --sudo --node-name <NOMBRE_DEL_NODO> -r 'recipe[webserver]'
| Argumento | Descripcion |
|---|---|
| <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). |
| --sudo | Indica 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.
# 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'
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.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.