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.

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.

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 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.
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.
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 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.

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.
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.

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:
- Recursos
- Clases
- Manifiesto
- 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.

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:
- Núcleo de títeres o tipos de recursos integrados.
- Tipos de recursos definidos por títeres.
- 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
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
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
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
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
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
Verifique que el servicio ntp no exista ejecutando el siguiente comando:
systemctl status 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.
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











