Tutorial de marionetas para principiantes: conceptos básicos y DSL

⚡ Resumen inteligente

Puppet es una plataforma de gestión de configuración de código abierto que automatiza el aprovisionamiento, la configuración y el mantenimiento de la consistencia de los servidores. Aplica la infraestructura como código mediante un lenguaje específico de dominio declarativo, reemplazando la administración manual repetitiva en grandes flotas de servidores.

  • 🧩 Gestión de la configuración: Puppet mantiene los servidores, el almacenamiento y las redes en un estado conocido y consistente, y conserva un historial auditable de cada cambio.
  • ???? ️ Agente maestro Architectura: Un maestro Linux compila catálogos y agentes en Linux, Windows, Solariso Mac OS los aplica sobre certificados seguros.
  • 🔄 Modelo de tracción: Los agentes realizan comprobaciones cada 1800 segundos, descargan el código Puppet necesario y corrigen cualquier desviación de configuración en el nodo.
  • 🧠 DSL declarativo: Escrito en Ruby, Puppet utiliza un lenguaje declarativo, por lo que se define el estado final deseado en lugar de utilizar comandos paso a paso.
  • 🧱 Bloques de construcción: Los recursos, las clases, los manifiestos y los módulos estructuran el código reutilizable, con 49 tipos de recursos básicos integrados disponibles por defecto.
  • ⚙️ Ejemplo práctico de NTP: Defina y declare una clase, valídela con puppet parser validate y, a continuación, aplique el manifiesto utilizando puppet apply.

Tutorial de Puppet que explica los conceptos básicos de la gestión de configuración, la arquitectura maestro-agente y el DSL declarativo.

Puppet es una herramienta de gestión de configuración de código abierto que permite definir la infraestructura como código y mantener grandes flotas de servidores en un estado consistente y repetible. Antes de aprender Puppet, comprendamos primero la gestión de configuración.

¿Qué es la gestión de la configuración?

La gestión de la configuración es el proceso de mantener el software y los sistemas informáticos —como servidores, almacenamiento y redes— en un estado conocido, deseado y coherente. Además, proporciona acceso a un registro histórico preciso del estado del sistema para fines de gestión de proyectos y auditoría.

Los administradores de sistemas realizan principalmente tareas repetitivas, como instalar y configurar servidores. Estos profesionales pueden automatizar este trabajo mediante la escritura de scripts.

Sin embargo, esto se convierte en una tarea difícil cuando se trabaja con una infraestructura masiva. Se introdujeron herramientas de gestión de configuración como Puppet para resolver estos problemas.

¿Qué es Marioneta?

Marioneta Puppet es una herramienta de gestión de sistemas para centralizar y automatizar el proceso de gestión de la configuración. También se utiliza como herramienta de despliegue de software.

Se trata de un software de gestión de configuración de código abierto, ampliamente utilizado para la configuración, gestión, implementación y orquestación de servidores, así como de diversas aplicaciones y servicios en toda la infraestructura de una organización.

Puppet está especialmente diseñado para gestionar la configuración de Linux y Windows sistemas. Está escrito en Ruby y utiliza su exclusivo DOmain Sespecífico L(DSL) para describir la configuración del sistema.

¿Cuáles son las versiones de Títeres?

El títere viene en dos versiones:

  • Marioneta de código abiertoSe trata de una versión básica de la herramienta de gestión de configuración Puppet, también conocida como Open Source Puppet. Está disponible directamente en el sitio web de Puppet y se distribuye bajo la licencia Apache 2.0.
  • Puppet Enterprise: Una versión comercial que ofrece funciones como informes de cumplimiento, orquestación, control de acceso basado en roles, una interfaz gráfica de usuario (GUI), una API y herramientas de línea de comandos para la gestión eficaz de los nodos.

¿Qué puede hacer Puppet?

Por ejemplo, supongamos que tiene una infraestructura con unos 100 servidores. Como administrador de sistemas, su función es garantizar que todos estos servidores estén siempre actualizados y funcionando con todas sus funcionalidades.

Administrador del sistema trabajando manualmente en los servidores
Administrador del sistema trabajando manualmente en los servidores

Para ello, puedes usar Puppet, que te permite escribir código sencillo que se puede implementar automáticamente en estos servidores. Esto reduce el esfuerzo humano y hace que el proceso de desarrollo sea rápido y eficaz.

Puppet automatiza la gestión del servidor
Puppet automatiza la gestión del servidor

Puppet realiza las siguientes funciones:

  • Puppet le permite definir configuraciones distintas para cada host.
  • Esta herramienta permite supervisar continuamente los servidores para confirmar que la configuración requerida existe y no ha sido modificada. Si la configuración cambia, Puppet revierte a la configuración predefinida en el host.
  • También proporciona control sobre todos los sistemas configurados, de modo que un cambio centralizado se aplica automáticamente en todas partes.
  • También se utiliza como herramienta de despliegue, porque despliega automáticamente el software en el sistema. Implementa infraestructura como código, porque las políticas y las configuraciones se escriben como código.

Puppet DSL y paradigmas de programación

Antes de aprender el DSL de Puppet, comprendamos los paradigmas de programación. Un paradigma de programación es un estilo que se utiliza en la programación informática.

Cuatro tipos de paradigmas son:

  • Imperativo.
  • Declarativo.
  • Funcional (que se considera un subconjunto del paradigma declarativo).
  • Orientado a objetos.

Nos centraremos en los paradigmas imperativo y declarativo.

Paradigmas imperativos

Este paradigma de programación expresa la lógica de un cálculo (qué hacer) y también describe su flujo de control (cómo hacerlo).

Ejemplo:

Imagina que vas a la oficina. Reservas un taxi y empiezas a darle instrucciones paso a paso al conductor hasta llegar a la oficina. Especificar qué hacer y cómo hacerlo es un estilo imperativo.

Paradigmas declarativos

Este paradigma de programación expresa la lógica de un cálculo (qué hacer) sin describir su flujo de control (cómo hacerlo).

Ejemplo:

Imagina que vas a la oficina. Reservas un Uber y especificas únicamente el destino final (la oficina). Especificar qué hacer, pero no cómo hacerlo, es un estilo declarativo.

Paradigma Qué hacer Cómo hacer
imperativo Sí: Sí:
Declarativo Sí: No

Puppet utiliza un paradigma de programación declarativa

Puppet utiliza un enfoque de programación declarativa.

Ejemplo: Cree un usuario en el sistema.

Se puede hacer utilizando un patrón de programación imperativo con un script de shell. Aquí, especificamos cómo crear el usuario y qué comandos usar en el sistema operativo.

Paradigmas declarativos

Sin embargo, también se puede hacer utilizando un patrón de programación declarativa con solo unas pocas líneas de código Puppet y el lenguaje específico de dominio (DSL) de Puppet, y aun así lograr el mismo resultado.

Paradigmas declarativos

Modelos de implementación de herramientas de gestión de configuración.

Hay dos modelos de implementación para herramientas de gestión de la configuración:

  • Modelo de implementación basado en push: iniciado por un nodo maestro.
  • Modelo de implementación pull-based: iniciado por agentes.

Modelo de implementación basado en push

En este modelo de despliegue, el servidor maestro envía las configuraciones y el software a los agentes individuales. Después de verificar una conexión segura, el maestro ejecuta comandos de forma remota en los agentes. Por ejemplo, Ansible y pila de sal.

Modelo de despliegue basado en la extracción

En este modelo de despliegue, los servidores individuales contactan con un servidor maestro, verifican y establecen una conexión segura, descargan sus configuraciones y software, y luego se configuran en consecuencia, por ejemplo, Puppet y Chef.

¿Cómo funciona Marioneta?

Puppet se basa en un modelo de despliegue pull, donde los nodos del agente se conectan regularmente, después de cada 1800 segundos — con el nodo maestro para ver si es necesario actualizar algo en el agente. Si se requiere una actualización, el agente obtiene el código Puppet necesario del maestro y realiza las acciones requeridas.

Expliquemos esto con un ejemplo de configuración maestro-agente.

El Maestro

Se trata de una máquina con sistema operativo Linux que tiene instalado el software maestro de Puppet. Es responsable de mantener las configuraciones en forma de código Puppet. El nodo maestro solo puede ser Linux.

los agentes

Estas son las máquinas de destino gestionadas por Puppet, en las que está instalado el software agente de Puppet.

El agente se puede configurar en cualquier sistema operativo compatible, como Linux, Windows, Solariso Mac OS.

La comunicación entre el maestro y el agente se establece mediante certificados seguros.

Comunicación del agente titiritero
Comunicación del agente titiritero

Comunicación entre el Maestro y el Agente

Paso 1) Una vez establecida la conexión entre el agente y el servidor maestro, el agente de Puppet envía datos sobre su estado al servidor maestro de Puppet. Estos datos se denominan "Hechos" e incluyen el nombre de host, detalles del kernel, dirección IP, detalles del nombre del archivo, etc.

Comunicación entre el Maestro y el Agente
El agente envía hechos al maestro

Paso 2) El maestro de Puppet utiliza estos datos y compila una lista de la configuración que se aplicará al agente. Esta lista de configuración que se realizará en un agente se conoce como catalogarPodría incluir la instalación, actualización o eliminación de paquetes, la creación de sistemas de archivos, la creación o eliminación de usuarios, el reinicio del servidor, cambios en la configuración de IP, etc.

Comunicación entre el Maestro y el Agente
El Maestro envía un catálogo al Agente

Paso 3) El agente utiliza esta lista de configuración para aplicar cualquier cambio de configuración requerido en el nodo.

Si no hay desviaciones en la configuración, el agente no realiza ningún cambio de configuración y deja el nodo funcionando con la misma configuración.

Comunicación entre el Maestro y el Agente
El agente aplica la configuración

Paso 4) Una vez finalizado el proceso, el nodo informa al servidor maestro de Puppet, indicando que la configuración se ha aplicado y completado correctamente.

Bloques de marionetas

Puppet ofrece la flexibilidad de integrar informes con herramientas de terceros mediante las API de Puppet.

Existen cuatro tipos de bloques de construcción para títeres:

  1. Recursos
  2. Clases
  3. Manifiesto
  4. Módulos

Recursos de marionetas

Los recursos de Puppet son los componentes básicos de Puppet.

Los recursos son los funciones incorporadas que se ejecutan en segundo plano para realizar las operaciones necesarias en Puppet.

Clases de títeres

Una combinación de diferentes recursos puede agruparse en una sola unidad llamada clase.

Manifiesto de marionetas

Un manifiesto es un directorio que contiene archivos DSL de Puppet. Estos archivos tienen la extensión .pp, que significa programa Puppet. El código Puppet consiste en definiciones o declaraciones de clases Puppet.

Módulos de marionetas

Los módulos son conjuntos de archivos y directorios, como manifiestos y definiciones de clases. Son las unidades reutilizables y compartibles de Puppet.

Por ejemplo, la directriz MySQL El módulo se instala y configura MySQL, y Jenkins El módulo gestiona Jenkins.

Módulos de marionetas
Módulos de marionetas

Tipos de recursos de títeres

En general, un sistema se compone de archivos, usuarios, servicios, procesos, paquetes, etc. En Puppet, estos se denominan recursos y son los componentes básicos de Puppet.

Todas las operaciones realizadas sobre los agentes de Puppet se llevan a cabo con la ayuda de los recursos de Puppet.

Los recursos de Puppet son herramientas predefinidas que se utilizan para realizar diversas tareas y operaciones en cualquier plataforma compatible. Podemos usar un único recurso de Puppet para realizar una tarea específica, o bien, podemos usar varios recursos de Puppet en conjunto para realizar implementaciones de configuración de aplicaciones complejas.

Los recursos pueden tener diferentes tipos. Usos de marionetas recursos y tipos de recursos para describir la configuración de un sistema.

Hay tres tipos de tipos de recursos:

  1. Núcleo de títeres o tipos de recursos integrados.
  2. Tipos de recursos definidos por títeres.
  3. Tipos de recursos personalizados de títeres.

Núcleo de títeres o tipos de recursos integrados

Los tipos de recursos básicos o integrados son los tipos de recursos de Puppet predefinidos que se incluyen con el software Puppet. Todos los tipos de recursos básicos o integrados de Puppet son desarrollados y mantenidos por el equipo de Puppet.

Tipos de recursos definidos por títeres

Los tipos de recursos definidos son tipos de recursos ligeros escritos en el lenguaje declarativo de Puppet utilizando una combinación de tipos de recursos existentes.

Tipos de recursos personalizados de títeres

Los tipos de recursos personalizados son tipos de recursos completamente personalizados escritos en Ruby.

Exploremos con más detalle los tipos de recursos de Puppet.

En la terminal, escriba el siguiente comando para mostrar una lista de subcomandos relacionados con Puppet:

Puppet --help

Tipos de recursos personalizados de marionetas

En nuestro caso nos interesa el subcomando “Recurso“, que utilizaremos para encontrar información sobre los tipos de recursos integrados de Puppet.

En la terminal, escriba cualquiera de los siguientes comandos para mostrar una lista de acciones asociado con el subcomando Puppet “Recurso"

Puppet help resource		
Puppet resource --help		

Tipos de recursos personalizados de marionetas

En este caso, tenemos Recurso como el subcomando y –tipos como la acción.

Puppet tiene 49 tipos de recursos básicos incorporados.

En la terminal, escriba el siguiente comando para mostrar una lista de los tipos de recursos integrados de Puppet disponibles:

puppet resource –types

Tipos de recursos personalizados de marionetas

Cada tipo admite una lista de atributos. Estos atributos proporcionan una descripción detallada que utiliza Puppet para gestionar el recurso.

Para conocer todos los atributos asociados a un tipo de recurso de Puppet, utilice el siguiente comando:

puppet describe <resource type name>	

Los parámetros mostrarán todos los atributos disponibles para ese tipo de recurso.

paquete de descripción de marionetas

Tipos de recursos personalizados de marionetas

Es difícil para una persona nueva entender y relacionar muchos archivos de código Puppet no administrados. Aquí es donde necesitamos algo de grupo.ping para integrar las operaciones. El objetivo es resolver un único problema, como todas las operaciones necesarias para configurar SSH en un servidor, un servicio NTP o un servidor web o de base de datos completo desde cero.

¿Qué son las clases de títeres?

Las clases de Puppet son colecciones de recursos de Puppet agrupados como una sola unidad.

Puppet introdujo clases para que la estructura fuera reutilizable y organizada.

Primero, necesitamos definir una clase utilizando la sintaxis de definición de clases. Las clases deben ser únicas y solo pueden declararse una vez con el mismo nombre:

class <class-name> {
<Resource declarations>
}

Ejemplo:

class ntpconfig {
    file {
        "/etc/ntp.conf": 
     ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}

Hasta ahora, solo hemos definido la clase; no la hemos utilizado en ningún otro lugar. Esto significa que el código que hemos escrito nunca se ejecutará a menos que declaremos esta clase en otra parte.

Declaración de clase

Para usar una clase definida en su código, utilice la incluir palabra clave.

class ntpconfig {
    file {
        "/etc/ntp.conf": 
      ensure=> "present", 
      content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}
include ntpconfig

Vamos a entender esto con un ejemplo de la vida real.

Instalación de demostración NTP

Primero, asegúrese de que el paquete NTP no esté ya presente en el servidor. El siguiente comando no devolverá nada si el paquete NTP no está presente en el servidor:

rpm -qa | grep -i ntp

Instalación de demostración NTP

Como podemos ver, el paquete NTP ya está presente en el servidor. Vamos a eliminar el paquete NTP existente:

yum remove ntp

Tras eliminar el paquete, asegúrese de que el archivo ntp.conf ya no exista:

ls -lrt /etc/ntp.conf

Instalación de demostración NTP

Verifique que el servicio ntp no exista ejecutando el siguiente comando:

systemctl status ntp

Instalación de demostración NTP

Cree un nuevo archivo .pp para guardar el código. Desde la línea de comando:

vi demontp.pp

Cambia al modo de inserción pulsando la tecla i del teclado.

Escriba el siguiente código para crear un nuevo archivo:

# Class Definition 
class ntpconfig {
    # Installing NTP Package 
  package {"ntp": 
    ensure=> "present",
    }
    # Configuring NTP configuration file 
  file {"/etc/ntp.conf": 
    ensure=> "present", 
    content=> "server 0.centos.pool.ntp.org iburst\n",
    }
    # Starting NTP services 
  service {"ntpd": 
    ensure=> "running",
    }
}

Una vez que hayas terminado de editar, pulsa Esc.

Para guardar el archivo, presione :wq!

El siguiente paso es check Si el código tiene algún error de sintaxis, ejecute el siguiente comando:

puppet parser validate demontp.pp

Asegúrese de haber cambiado al raíz El usuario podrá completar la prueba sin ningún error, ejecutando el comando:

su root

Prueba es el siguiente paso en el proceso de creación de código. Ejecute el siguiente comando para realizar una prueba de humo:

Puppet applies demontp.pp --noop

El último paso es puedes seguir Ponga en marcha el títere en modo real y verifique el resultado.

puppet apply demontp.pp

Puppet no realizó nada porque la clase de demostración era simplemente se define pero no declaró .

Por lo tanto, hasta que no declares la clase Puppet, el código no se aplicará.

Vamos a declarar la clase de demostración dentro del mismo código usando incluir el nombre de la clase al final del código:

# Class Definition 
class ntpconfig {
    # Installing NTP Package 
  package {"ntp": 
    ensure=> "present",
    }
    # Configuring NTP configuration file 
  file {"/etc/ntp.conf": 
    ensure=> "present", 
    content=> "server 0.centos.pool.ntp.org iburst\n",
    }
    # Starting NTP services 
  service {"ntpd": 
    ensure=> "running",
    }
}

# Class Declaration 
include ntpconfig

Una vez más, check Si el código tiene algún error de sintaxis, ejecute el siguiente comando:

puppet parser validate demontp.pp

Asegúrese de haber cambiado al raíz El usuario podrá completar la prueba sin ningún error, ejecutando el comando:

su root

Pruebas es el siguiente paso en el proceso de creación de código. Ejecute el siguiente comando para realizar una prueba de humo:

Puppet apply demontp.pp --noop

El último paso es puedes seguir Ponga en marcha el títere en modo real y verifique el resultado.

puppet apply demontp.pp

En este caso, el código se aplica porque la clase fue definida y luego declarada.

Instalación de demostración NTP

Asegúrese de que el archivo ntp.conf ya existe:

ls -lrt /etc/ntp.conf

Verifique que el servicio ntp se haya iniciado ejecutando el siguiente comando:

systemctl status ntpd

Instalación de demostración NTP

Preguntas Frecuentes

Puppet está escrito en Ruby. Utiliza su propio lenguaje específico de dominio (DSL) declarativo para que los administradores describan el estado deseado del sistema en lugar de programar cada paso. El DSL de Puppet está inspirado en Ruby, pero no es necesario conocer Ruby para escribir manifiestos.

Puppet utiliza un modelo de extracción declarativo basado en agentes y su propio DSL, por lo que los nodos obtienen los catálogos de un nodo maestro. Ansible No requiere agentes y envía playbooks YAML a través de SSH. Puppet es adecuado para la aplicación de políticas de estado a largo plazo, mientras que Ansible es más sencillo para la orquestación rápida y bajo demanda.

Por defecto, el servidor Puppet (también llamado maestro) escucha en el puerto TCP 8140. Los agentes Puppet se conectan a este puerto mediante HTTPS para enviar datos y descargar sus catálogos compilados. Asegúrese de que el puerto 8140 esté abierto en el cortafuegos entre los agentes y el servidor.

El maestro de Puppet debe ejecutarse en Linux. Los agentes de Puppet se ejecutan en muchas plataformas, incluyendo Linux. Windows, Solarisy Mac OS. Esta compatibilidad con agentes multiplataforma permite que un único administrador de Puppet gestione un conjunto mixto de servidores y estaciones de trabajo desde un lugar centralizado.

Puppet Forge es el repositorio público de módulos Puppet precompilados compartidos por Puppet y la comunidad. En lugar de escribir manifiestos desde cero, puede descargar módulos que instalan y configuran software como MySQL or JenkinsLuego, adáptalos a tu entorno.

Sí. Puppet sigue siendo una herramienta de gestión de configuración e infraestructura como código muy utilizada, ahora mantenida por Perforce. Puppet 8 es la versión principal actual y aún es compatible tanto con la versión de código abierto como con la comercial. Puppet Enterprise para la gestión de grandes flotas de servidores.

Los asistentes de IA pueden generar Puppet DSL a partir de indicaciones en lenguaje natural, explicar manifiestos existentes y señalar errores de sintaxis o lógica antes de ejecutar puppet parser validate. Herramientas como ChatGPT Agiliza la creación de contenido, pero revisa siempre los recursos generados para comprobar que las rutas sean correctas y que exista idempotencia.

Sí. Copiloto de GitHub Completa automáticamente los manifiestos de Puppet, las declaraciones de recursos y las definiciones de clases a partir de un comentario breve o del contexto de un archivo. RevRevise su salida para verificar los tipos de recursos, los nombres de atributos y las dependencias correctas, ya que el código generado puede hacer referencia a módulos o valores predeterminados obsoletos.

Resumir este post con: