¿Cómo utilizar los módulos Puppet para la automatización de la infraestructura de TI?



Un tutorial práctico de marionetas que habla sobre la escritura de un módulo de marionetas y el uso de un manifiesto para automatizar y mantener la infraestructura de TI de una organización.

Anteriormente, los administradores de sistemas utilizaban scripts de shell para ejecutar sus servidores, y este método no tenía escalabilidad. Es una tarea abrumadora modificar constantemente los scripts para cientos o miles de servidores en constante cambio y sus configuraciones de sistema.

En este artículo sobre módulos y manifiestos de marionetas veamos cómo podemos usar módulos de marionetas para automatizar la configuración del servidor, la instalación del programa y la administración del sistema.





Este blog cubrirá los siguientes temas:

Introducción a la programación de marionetas

Marioneta es una de las herramientas DevOps más utilizadas para la gestión de la configuración. Se usa para provocar consistencia en la Infraestructura. Puppet puede definir la infraestructura como código, administrar varios servidores y hacer cumplir la configuración del sistema, lo que ayuda a automatizar el proceso de administración de la infraestructura.



La marioneta tienesu propio idioma de configuración, Títeres DSL . Al igual que con otros programas de DevOps, Puppet automatiza los cambios, eliminando los cambios manuales basados ​​en secuencias de comandos. Sin embargo, Puppet no es simplemente otro lenguaje de shell, ni es un lenguaje de programación puro, como PHP. En cambio, Puppet usaa enfoque declarativo basado en modelos a la automatización de TI. Esto permite a Puppet definir la infraestructura como código y hacer cumplir la configuración del sistema con programas.

Antes de continuar con la demostración, veamos algunos aspectos básicos de la programación de títeres.

ordenar algoritmos c ++

Términos clave en la programación de marionetas

Manifiestos

Un programa de marionetas se llama manifiesto y tiene un nombre de archivo con .páginas extensión. El manifiesto principal predeterminado de Puppet es /etc/puppet/manifests/site.pp . (Esto defineconfiguraciones globales del sistema, como la configuración LDAP, los servidores DNS u otras configuraciones que se aplican a cada nodo).



Clases

Dentro de estos manifiestos hay bloques de código llamados clases otros módulos pueden llamar. Las clases configuran partes de funcionalidad grandes o medianas, como todos los paquetes, archivos de configuración y servicios necesarios para ejecutar una aplicación. Las clases facilitan la reutilización del código de Puppet y mejoran la legibilidad.

Recursos

El código de marionetas se compone principalmente de declaraciones de recursos. UN recurso describe un elemento específico sobre el estado deseado del sistema. Por ejemplo, puede incluir que debería existir un archivo específico o debería instalarse un paquete.

Módulos de marionetas

Excepto por el principalsite.ppmanifiesto,almacena manifiestosen módulos .

Todo nuestro código de Puppet está organizado en módulos que son los bloques de construcción básicos de Puppet que podemos reutilizar y compartir. Cada módulo gestiona una tarea específica en la infraestructura, como instalar y configurar un software.

Los módulos contienen clases de Puppet, tipos definidos, tareas, planes de tareas, capacidades, tipos de recursos y complementos, por ejemplo, tipos personalizados o hechos. Instalar módulos en Puppetruta del módulo. Puppet carga todo el contenido de cada módulo en la ruta del módulo, haciendo que este código esté disponible para su uso.

Módulos - Programación de marionetas - EdurekaPuppetlabs tiene módulos predefinidos que podemos usar instantáneamente descargándolos desde PuppetForge . También puede crear un módulo de marionetas personalizado para satisfacer sus necesidades.

Flujo de trabajo del programa de marionetas

Usaremos el lenguaje declarativo de Puppet para describir el estado deseado del sistema en archivos llamados manifiestos. Los manifiestos describen cómo debe configurar su red y los recursos del sistema operativo, como archivos, paquetes y servicios.

Puppet compila manifiestos en catálogos y aplica cada catálogo a su nodo correspondiente para asegurar que la configuración de tel nodo es correctoen toda su infraestructura.

Demostración: Automatización de la instalación de Apache y MySQL

Este artículo sobre los módulos de marionetas es práctico y muestra dos formas de usar un módulo de marionetas y también le enseñará cómo automatizar la instalación de un servidor configurado con estos dos módulos.

Para empezar, asegúrese de tener una infraestructura de Puppet preparada que incluya un servidor puppet master y 2 agentes puppet.

  • Puppet Master: Ubuntu 18.04
  • Agente 1: Ubuntu 18.04
  • Agente 2:CentOS7

A continuación, se muestra un resumen de lo que lograremos en esta práctica:


Así que comencemos con la práctica:

Creando un módulo desde cero

En este módulo de marionetas, nos ocuparemos de tareas como descargar el paquete Apache, configurar archivos y configurar hosts virtuales.

  • Desde Puppet Master, navegue hasta el directorio del módulo de Puppet y cree el directorio Apache:
    cd / etc / puppet / modules sudo mkdir apache
  • Desde el interior del directorio de apache, cree subdirectorios: manifiestos, plantillas, archivos y ejemplos.
    cd apache sudo mkdir {manifiestos, plantillas, archivos, ejemplos}
  • Navega al directorio de manifiestos:
    cd manifiestos
  • A partir de aquí, separaremos el módulo en clases según los objetivos de esa sección de código.

init.pp -> para descargar el paquete Apache

params.pp -> para definir cualquier variable y parámetro

config.pp -> para administrar cualquier archivo de configuración para el servicio Apache.

vhosts.pp -> para definir los hosts virtuales.

Este módulo también hará uso de Hiera (un sistema integrado de búsqueda de datos de configuración de valores-clave, que se utiliza para separar los datos de los datos del código Puppet, para almacenar variables para cada nodo.

Paso 1: descarga del paquete Apache

Crear clase init.pp

Ahora crearemos uninit.pparchivo en el directorio de manifiestos para contener el paquete de apache.
Como tenemos 2 sistemas operativos diferentes (ubuntu y CentOS7) que usan diferentes nombres de paquetes para Apache, tendremos que usar una variable$ apachename.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

class apache {paquete {'apache': nombre => $ apachename, asegurar => presente,}}

paquete recurso permite la gestión de un paquete. Se utiliza para agregar, eliminar o asegurarse de que haya un paquete.

En la mayoría de los casos, nombre del recursoapache, arriba) debe ser el nombre del paquete que se administra. Debido a las diferentes convenciones de nomenclatura,llamamos al nombre real del paquetesobre con el nombre referencia. Entonces nombre , requiere la variable aún no definida$ apachename.

asegurar referencia asegura que el paquete espresente.

Crear archivo params.pp

losparams.pparchivo definirá las variables necesarias. Si bien podríamos definir estas variables dentro delinit.pparchivo, ya que será necesario utilizar más variables fuera del tipo de recurso en sí, utilizando unparams.pparchivo permite definir variables enSideclaraciones y se utiliza en varias clases.

Crear unparams.pparchivo y el siguiente código.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp

class apache :: params {if $ :: osfamily == 'RedHat' {$ apachename = 'httpd'} elsif $ :: osfamily == 'Debian' {$ apachename = 'apache2'} else {fail ('esto no es una distribución compatible. ')}}

Fuera del original init.ppclase, cada nombre de clase necesita ramificarse deapache. Llamamos a esta clase como apache :: params . El nombre después de los dos puntos dobles debe compartir un nombre con el archivo. UnSiLa declaración se utiliza para definir los parámetros, extrayendo de la información proporcionada por Factor , Puppet tiene la instalación de facter como parte de su propia instalación. Aquí, Facter desplegará la familia de sistemas operativos (osfamily), para discernir si essombrero rojooBasado en Debian.

Con los parámetros finalmente definidos, necesitamos llamar al params.pp archivo y los parámetros eninit.pp. Para hacer esto, necesitamos agregar los parámetros después del nombre de la clase, pero antes del corchete de apertura( {).

Entonces elinit.ppque creamos anteriormente debería verse así:

clase apache ($ apachename = $ :: apache :: params :: apachename,) hereda :: apache :: params {paquete {'apache': nombre => $ apachename, asegurar => presente,}}

La cadena de valor $ :: apache :: params :: valor le dice a Puppet que extraiga los valores del apache módulos, params class, seguida del nombre del parámetro. El fragmento hereda :: apache :: params permite parainit.ppheredar estos valores.

Paso 2: administrar archivos de configuración

El archivo de configuración de Apache será diferente dependiendo de si está trabajando en un sistema basado en Red Hat o Debian.

Puede encontrar los siguientes archivos de dependencia al final de esta demostración:httpd.conf(Sombrero rojo),apache2.conf(Debian).

  • Copia el contenido de httpd.conf yapache2.confen archivos separados y guárdelos en el archivos directorioa / etc / puppetlabs / code / environment / production / modules / apache / files .
  • Edite ambos archivos para inhabilitar mantener viva. Deberá agregar la línea KeepAlive Off en elhttpd.confarchivo. Si no desea cambiar esta configuración, debemos agregar un comentario en la parte superior de cadaarchivo:
    /etc/puppetlabs/code/environments/production/modules/apache/files/httpd.conf
#Este archivo es administrado por títeres

Agregue estos archivos alinit.pp, por lo que Puppet sabrá la ubicación de estos archivos tanto en el servidor maestro como en los nodos del agente. Para hacer esto, usamos el archivo recurso.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

archivo {'archivo-configuración': ruta => $ conffile, asegurar => archivo, fuente => $ confsource,}

Dado que tenemos los archivos de configuración en dos ubicaciones diferentes, le damos al recurso el nombre genérico archivo de configuración con el archivo camino definido como un parámetro con elcaminoatributo.

asegurar asegura que sea un archivo.

fuente proporciona la ubicación en el Puppet master de los archivos creados anteriormente.

Abre elparams.pparchivo.

Definimos el $ conffile y $ confsourcevariables dentro delSideclaración:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp

es un vs tiene un java
if $ :: osfamily == 'RedHat' {... $ conffile = '/etc/httpd/conf/httpd.conf' $ confsource = 'puppet: ///modules/apache/httpd.conf'} elsif $: : osfamily == 'Debian' {... $ conffile = '/etc/apache2/apache2.conf' $ confsource = 'puppet: ///modules/apache/apache2.conf'} else {...

Necesitamos agregar los parámetros al comienzo de laapachedeclaración de clase en elinit.pparchivo, similar al ejemplo anterior.

Cuando cambia el archivo de configuración, Apache debe reiniciarse. Para automatizar esto, podemos utilizar el recurso de servicioen combinación con el notificar atributo, que llamará al recurso para que se ejecute cada vez que se cambie el archivo de configuración:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

file {'archivo de configuración': ruta => $ conffile, asegurar => archivo, fuente => $ confsource, notificar => Servicio ['apache-service'],} servicio {'apache-service': nombre => $ apachename, hasrestart => true,}

Servicio El recurso utiliza el parámetro ya creado que definió el nombre de Apache en los sistemas Red Hat y Debian.
hasrestart El atributo se utiliza para activar un reinicio del servicio definido.

Paso 3: Cree los archivos de host virtual

Dependiendo de la distribución de su sistema, los archivos del host virtual se administrarán de manera diferente. Debido a esto, encajaremos el código para hosts virtuales en unSideclaración, similar a la utilizada en elparams.ppclase pero que contiene recursos reales de Puppet.

  • Desde dentro delapache / manifiestos /directorio, crea y abre unvhosts.pparchivo. Agregue el esqueleto delSideclaración:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {} elsif $ :: osfamily == 'Debian' {} else {}}

La ubicación del archivo de host virtual en nuestro servidor CentOS 7 es/etc/httpd/conf.d/vhost.conf . Necesita crear el archivo como una plantilla en Puppet master. Haga lo mismo para el archivo de hosts virtuales de Ubuntu, que se encuentra en/etc/apache2/sites-available/example.com.conf, reemplazandoexample.comcon el FQDN del servidor.

  • Navega al plantillas archivo dentro del apache módulo y luego cree dos archivos para sus hosts virtuales:

Para sistemas Red Hat:
/etc/puppetlabs/code/environments/production/modules/apache/templates/vhosts-rh.conf.erb

ServerAdmin ServerName ServerAlias ​​www. DocumentRoot / var / www // public_html / ErrorLog /var/www//logs/error.log CustomLog /var/www//logs/access.log combinado

Para sistemas Debian:
/etc/puppet/modules/apache/templates/vhosts-deb.conf.erb

ServerAdmin ServerName ServerAlias ​​www. DocumentRoot / var / www / html // public_html / ErrorLog /var/www/html//logs/error.log CustomLog /var/www/html//logs/access.log combinadoRequerir todo concedido

Usamos solo dos variables en estos archivos: adminemail y nombre del servidor . Los definiremos nodo por nodo, dentro delsite.pparchivo.

  • Volver a lavhosts.pparchivo. Ahora se puede hacer referencia a las plantillas creadas en el código:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {archivo {'/etc/httpd/conf.d/vhost.conf': asegurar => archivo, contenido => plantilla ('apache / vhosts-rh .conf.erb '),}} elsif $ :: osfamily ==' Debian '{archivo {' /etc/apache2/sites-available/$servername.conf ': asegurar => archivo, contenido => plantilla (' apache /vhosts-deb.conf.erb '),}} else {fail (' Esta no es una distribución compatible ')}}

Ambas familias de distribución llaman alarchivorecurso y asume el título de la ubicación del host virtual en la distribución respectiva. Para Debian, esto una vez más significa hacer referencia al$ servernamevalor. loscontenidoatributo llama a las respectivas plantillas.

  • Ambos archivos de host virtual hacen referencia a dos directorios. No están en los sistemas de forma predeterminada. Podemos crearlos mediante el uso dearchivorecurso, cada uno dentro delSideclaración. El completovhosts.confel archivo debe parecerse a:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {archivo {'/etc/httpd/conf.d/vhost.conf': asegurar => archivo, contenido => plantilla ('apache / vhosts-rh .conf.erb '),} archivo {[' / var / www / $ nombre de servidor ',' / var / www / $ nombre de servidor / public_html ',' / var / www / $ nombre de servidor / log ',]: asegurar => directorio,}} elsif $ :: osfamily == 'Debian' {archivo {'/etc/apache2/sites-available/$servername.conf': asegurar => archivo, contenido => plantilla ('apache / vhosts-deb. conf.erb '),} archivo {[' / var / www / $ servername ',' / var / www / $ servername / public_html ',' / var / www / $ servername / logs ',]: asegurar => directorio ,}} else {fail ('Esta no es una distribución compatible')}}

Paso 4: prueba el módulo

  • Navega alapache / manifiestos /directorio, ejecute el analizador de marionetas en todos los archivos para garantizar que la codificación de Puppet no tenga errores:

sudo / opt / puppetlabs / bin / puppet parser validate init.pp params.pp vhosts.pp

¿Cuáles son los componentes de la plataforma Java?

Debería volver vacío, sin problemas.

  • Navega al ejemplos directorio dentro delapachemódulo. Crear uninit.pparchivo e incluir las clases creadas. Reemplazar los valores de$ servernamey$ adminemailcontigo mismo:

/etc/puppetlabs/code/environments/production/modules/apache/examples/init.pp

serveremail = 'webmaster@example.com' $ servername = 'puppet.example.com' incluir apache incluir apache :: vhosts
  • Pruebe el módulo ejecutando títere aplicar con el –Noop etiqueta:
    sudo / opt / puppetlabs / bin / puppet apply --noop init.pp

No debería devolver ningún error y mostrar que activará actualizaciones de eventos. Para instalar y configurar apache en Puppet master, vuelva a ejecutar sin–Noop, si así lo desea.

  • Vuelva al directorio principal de Puppet y luego almanifiestacarpetanoel presente en el módulo Apache).

cd / etc / puppetlabs / code / environment / production / manifiestos

Crear unsite.pparchivo,e incluir el módulo de Apache para cada nodo de agente. También ingrese las variables para eladminemail y nombre del servidorparámetros. Tusite.ppdebe parecerse a lo siguiente:

/etc/puppetlabs/code/environments/production/manifests/site.pp

nodo 'puppet-agent-ubuntu.example.com' {$ adminemail = 'webmaster@example.com' $ servername = 'puppet.example.com' incluye apache incluye apache :: vhosts} nodo 'puppet-agent-centos.example .com '{$ adminemail =' webmaster@example.com '$ servername =' puppet.example.com 'incluye apache incluye apache :: vhosts}

De forma predeterminada, el servicio de agente Puppet en sus nodos administrados verificará automáticamente con el maestro una vez cada 30 minutos y aplicará cualquier configuración nueva del maestro. También puede invocar manualmente el proceso del agente Puppet entre ejecuciones automáticas del agente. Para ejecutar manualmente el nuevo módulo en los nodos de su agente, inicie sesión en los nodos y ejecute:

sudo / opt / puppetlabs / bin / puppet agent -t

Ahora que hemos aprendido a crear un módulo desde cero, aprendamos a utilizar un módulo preexistente de la forja de marionetas de puppetlabs.

Utilice un módulo de PuppetForge

Fragua de marionetas ya tiene muchos módulos para que funcione el servidor. Podemos configurarlos tan extensamente como un módulo que creó y podemos ahorrar tiempo ya que no necesitamos crear el módulo desde cero.

Asegúrese de estar en el / etc / puppetlabs / code / environment / production / modules directorio e instalar el Módulo MySQL de Puppet Forge por PuppetLabs. Esto también instalará los módulos de requisitos previos.

cd / etc / puppetlabs / código / entornos / producción / módulos

sudo / opt / puppetlabs / bin / puppet module instalar puppetlabs-mysql

Utilice Hiera para crear bases de datos

Antes de crear los archivos de configuración para el módulo MySQL, tenga en cuenta que es posible que no desee utilizar los mismos valores en todos los nodos del agente. Para proporcionar a Puppet los datos correctos por nodo, usamos Hiera. Utilizará una contraseña de root diferente por nodo, creando así diferentes bases de datos MySQL.

  • Navegar a/ etc / puppety crea el archivo de configuración de Hierahiera.yamlen generalmarionetadirectorio. Utilizará los valores predeterminados de Hiera:

/etc/puppetlabs/code/environments/production/hiera.yaml

--- versión: 5 jerarquía: - nombre: ruta común: common.yaml por defecto: data_hash: yaml_data datadir: data
  • Crea el archivocommon.yaml. Definirá el valor predeterminado raíz contraseña para MySQL:

/etc/puppetlabs/code/environments/production/common.yaml

mysql :: server :: root_password: 'contraseña'

Usamos elcommon.yamlarchivocuando una variable no está definida en otro lugar. Esto significa que todos los servidores compartirán la misma contraseña raíz de MySQL. Estas contraseñas también se pueden codificar para aumentar la seguridad.

  • Para utilizar los valores predeterminados del módulo MySQL, puede agregar un incluir ':: mysql :: servidor' línea a lasite.pparchivo. Sin embargo, en este ejemplo, anulará algunos de los valores predeterminados del módulo para crear una base de datos para cada uno de sus nodos.

Edite elsite.pparchivo con los siguientes valores:

nodo 'Puppetagent-ubuntu.example.com' {$ adminemail = 'webmaster@example.com' $ servername = 'hostname.example.com' include apache include apache :: vhosts include mysql :: server mysql :: db {'mydb_ $ {fqdn} ': usuario =>' myuser ', contraseña =>' mypass ', dbname =>' mydb ', host => $ :: fqdn, grant => [' SELECT ',' UPDATE '], tag = > $ dominio,}} nodo 'Puppetagent-centos.example.com' {$ adminemail = 'webmaster@example.com' $ servername = 'hostname.example.com' include apache include apache :: vhosts include mysql :: server mysql :: db {'mydb _ $ {fqdn}': usuario => 'myuser', contraseña => 'mypass', dbname => 'mydb', host => $ :: fqdn, grant => ['SELECT', ' ACTUALIZAR '], etiqueta => $ dominio,}}

Automatizar la instalación de los módulos Puppet de puppet master a puppet agent

  • Puede ejecutar estas actualizaciones manualmente en cada nodo mediante SSH en cada nodo y emitiendo el siguiente comando:

sudo / opt / puppetlabs / bin / puppet agent -t

  • De lo contrario, el servicio del agente Puppet en sus nodos administrados verificará automáticamente con el maestro una vez cada 30 minutos y aplicará las nuevas configuraciones del maestro.

Catálogo aplicado correctamente en el agente de Ubuntu

Catálogo aplicado con éxito en el agente CentOS

Por tanto, toda la instalación se automatizado en los nodos del agente simplemente aplicando el catálogo.Los archivos de código y las dependencias que se utilizan para esta demostración se pueden encontrar Aquí .

Espero que esta demostración le haya ayudado a tener una idea clara de los módulos y manifiestos de marionetas y su uso para automatizar la infraestructura de TI.En este caso, su trabajo se vuelve tan fácil, solo especifique las configuraciones en Puppet Master y los agentes Puppet evaluarán automáticamente el manifiesto principal y aplicarán el módulo que especifica la configuración de Apache y MySQL. Si tiene alguna consulta, no dude en publicarla en .

Si encontraste esto Tutorial de marionetas pertinente, revisar la por Edureka, una empresa de aprendizaje en línea de confianza con una red de más de 250.000 alumnos satisfechos repartidos por todo el mundo. El curso de formación de certificación de Edureka DevOps ayuda a los alumnos a adquirir experiencia en diversos procesos y herramientas de DevOps, como Puppet, Jenkins, Nagios y GIT, para automatizar varios pasos en SDLC.