GNU/Linux >> Tutoriales Linux >  >> Linux

Comprender los recursos, manifiestos, módulos y clases de Puppet con ejemplos

En este tutorial, explicaré los recursos, manifiestos, módulos y clases de Puppet con ejemplos. Además, asumo que ya tiene instalados los nodos maestro/agente de Puppet y listos para usar. Para usar Puppet, debe comprender cómo maneja los recursos Puppet y cómo se crean el manifiesto y los módulos.

Requisitos previos:

Como dije anteriormente, debe tener instalados y configurados los nodos Puppet Master y Agent.

Lenguaje específico de dominio declarativo (DSL) de Puppet

  • Puppet tiene su propio lenguaje específico de dominio declarativo que define ESTADOS de un sistema.
  • El código de marionetas está escrito en un archivo llamado MANIFESTS y guardado con extensión .pp (por ejemplo, sitio.pp es un archivo de manifiesto principal)
  • El código de marioneta contiene RECURSOS que afectan elementos del sistema (como archivo, paquete, servicio, usuario, host, interfaz, exec, etc.). Los recursos son la unidad fundamental de las configuraciones del sistema y cada recurso describe un aspecto del sistema.
  • Los recursos se agrupan en CLASES ( bloque con nombre de códigos Puppet) que se almacenan (organizan) en MÓDULOS y no se usan hasta que se invocan.
  • Puppet Master crea un CATALOGO (generado en base al código y los datos de Puppet) y los clientes los aplican.

Veamos los términos de Puppet en detalle.

Recursos

Un recurso describe algo sobre el estado del sistema. Por ejemplo, si existe un determinado usuario o archivo, si un servicio debe estar ejecutándose o habilitado, o si debe instalarse un paquete.

Formato del recurso:

resource_type { 'name_of_the_resource':
  argument  => value,
  other_arg => value,
}

Ejemplo 1:

file { 'test':
 path => '/tmp/test',
 content => 'An example content',
 }

Ejemplo 2:

package { 'ntp':
 ensure => present,
}

Ejemplo 3:

service { 'ntpd':
 ensure => running,
 enable => true,
}

Aquí hay un comando para enumerar los tipos de recursos en Puppet:

# /opt/puppetlabs/puppet/bin/puppet resource --types
augeas
computer
cron
exec
file
filebucket
group
host
interface
k5login
macauthorization
mailalias
maillist
mcx
mount
nagios_command
nagios_contact
nagios_contactgroup
nagios_host
nagios_hostdependency
nagios_hostescalation
nagios_hostextinfo
nagios_hostgroup
nagios_service
nagios_servicedependency
nagios_serviceescalation
nagios_serviceextinfo
nagios_servicegroup
nagios_timeperiod
notify
package
resources
router
schedule
scheduled_task
selboolean
selmodule
service
ssh_authorized_key
sshkey
stage
tidy
user
vlan
whit
yumrepo
zfs
zone
zpool

Manifiestos

Como se dijo anteriormente, el código de Puppet está escrito en un archivo de Manifiesto con extensión .pp . El archivo de manifiesto principal predeterminado se encuentra en:

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

Se pueden crear más archivos de manifiesto en /etc/puppetlabs/code/environments/production/manifests/

Clases

Las clases contienen bloques de código que se pueden invocar desde cualquier parte del código. Las clases proporcionan la facilidad de reutilización de código. Si conoce lenguajes de programación como Java o C++, entonces definir la clase en Puppet es lo mismo.

class class_name {
 ::::::::::Puppet code goes here:::::::::
 }

Ahora, la clase anterior se puede incluir en un código Puppet como se muestra a continuación:

include class_name

Módulos

Los módulos ayudan a organizar un conjunto de manifiestos. Se puede agregar un módulo en /etc/puppetlabs/code/environments/production/modules. Un gran código de Puppet puede distribuirse en múltiples manifiestos y organizarse mediante módulos (en la parte inferior de esta publicación, aprenderá cómo instalar, configurar e iniciar el servicio Apache, donde cada una de estas tareas se divide en diferentes clases).

Bueno, intente crear un manifiesto para realizar una operación simple.

Mi primer manifiesto en Puppet

Ejemplo 1:Creación de un archivo nuevo (en site.pp)

Paso 1: Inicie sesión en Puppet Server (Master Node) como usuario privilegiado.

Paso 2: Vaya a /etc/puppetlabs/code/environments/production/manifests

Paso 3: Editar sitio.pp – archivo de manifiesto principal. Si no encuentra uno, créelo.

# vim site.pp

Paso 4: Escribamos el código de Puppet para crear un archivo en /tmp/ en el nodo del agente Puppet. El código es el siguiente,

file { "/tmp/myFile":
 ensure => "present",
 owner => "root",
 group => "root",
 mode => "644",
 content => "This is my first manifest to create a file in temp directory",
 }

En el código anterior, hemos utilizado archivo tipo de recurso, con argumentos como garantizar , propietario , grupo , modo y contenido . El archivo se creará en /tmp .

Paso 5 :Ahora el archivo de manifiesto está listo. Pase al nodo Puppet Agent y ejecute el siguiente comando.

[Agent]# /opt/puppetlabs/puppet/bin/puppet agent -t
 Info: Using configured environment 'production'
 Info: Retrieving pluginfacts
 Info: Retrieving plugin
 Info: Caching catalog for puppetagent.test.in
 Info: Applying configuration version '1471021726'
 Notice: /Stage[main]/Main/File[/tmp/myFile]/ensure: defined content as '{md5}8eadb0a0feef0bc667702434f816d8e8'
 Notice: Applied catalog in 0.09 seconds

El resultado anterior dice que se ha aplicado el catálogo.

Nota :Los agentes de Puppet se pondrán en contacto automáticamente con el servidor de Puppet para recibir un catálogo para configurarse ellos mismos. Pero si no desea esperar la sincronización automática, puede ejecutar el comando anterior.

Paso 6 :compruebe si el archivo se ha creado con los contenidos necesarios.

# ls /tmp/myFile
/tmp/myFile
# more /tmp/myFile
This is my first manifest to create a file in temp directory

Creando tu primer Módulo

Creemos un módulo que instalará el servidor web Apache en los nodos del agente.

Paso 1 :Cambia el directorio a la carpeta de módulos.

# cd /etc/puppetlabs/code/environments/production/modules

Paso 2 :Vamos a crear un módulo llamado httpd . Para hacer eso, usaremos PuppetForge lo que requiere que se siga una convención de nomenclatura. Por ejemplo,

organizationName-moduleName

Como estamos instalando el servidor web Apache, el paquete a instalar es httpd y mi convención de nomenclatura será la que se muestra a continuación:

mypuppetorg-httpd

Paso 3 :Ejecute el siguiente comando

# /opt/puppetlabs/puppet/bin/puppet module generate mypuppetorg-httpd
We need to create a metadata.json file for this module.  Please answer the
following questions; if the question is not applicable to this module, feel free
to leave it blank.

Puppet uses Semantic Versioning (semver.org) to version modules.
What version is this module?  [0.1.0]
-->

Who wrote this module?  [mypuppetorg]
-->

What license does this module code fall under?  [Apache-2.0]
-->

How would you describe this module in a single sentence?
--> Installs Apache web server and configures it

Where is this module's source code repository?
-->

Where can others go to learn more about this module?
-->

Where can others go to file issues about this module?
-->

----------------------------------------
{
"name": "mypuppetorg-httpd",
"version": "0.1.0",
"author": "mypuppetorg",
"summary": "Installs Apache web server and configures it",
"license": "Apache-2.0",
"source": "",
"project_page": null,
"issues_url": null,
"dependencies": [
{"name":"puppetlabs-stdlib","version_requirement":">= 1.0.0"}
],
"data_provider": null
}
----------------------------------------

About to generate this metadata; continue? [n/Y]
--> Y

Notice: Generating module at /etc/puppetlabs/code/environments/production/modules/httpd...
Notice: Populating templates...
Finished; module generated in httpd.
httpd/Gemfile
httpd/Rakefile
httpd/examples
httpd/examples/init.pp
httpd/manifests
httpd/manifests/init.pp
httpd/spec
httpd/spec/classes
httpd/spec/classes/init_spec.rb
httpd/spec/spec_helper.rb
httpd/README.md
httpd/metadata.json

Paso 4 :Se creará un módulo. Por ejemplo, httpd y su estructura es la siguiente:

# ls httpd/
 examples  Gemfile  manifests  metadata.json  Rakefile  README.md  spec

Paso 5 :Personaliza el módulo

El paso 4 creará una estructura de directorio de módulos y un archivo de manifiesto principal (para el módulo) llamado init.pp . Simplemente abriremos el archivo para ver cómo se ve y al final del archivo, encontrará un httpd vacío. clase.

class httpd {

}

Paso 6 :Vamos a crear una clase separada para instalar (install.pp), configurar (configure.pp) e iniciar (start.pp) el servicio Apache.

Creando una subclase para instalar Apache: Crearemos un nuevo archivo de manifiesto llamado install.pp (nombre de módulo de clase::instalar)

# pwd
/etc/puppetlabs/code/environments/production/modules/httpd
# vim manifests/install.pp

Copie y pegue el siguiente código:

# == Class: httpd::install
class httpd::install inherits httpd {
package { 'httpd':
ensure => installed,
}
}

Aquí, la subclase 'instalar ‘ heredará la clase principal httpd . Además, busque la sintaxis paquete , lo que significa el tipo de marioneta y garantizar atributo asegura que dicho paquete está instalado.

Creación de una subclase para configurar httpd (configure.pp – class modulename::configure)

# pwd
/etc/puppetlabs/code/environments/production/modules/httpd
# vim manifests/configure.pp

Copie y pegue el siguiente código para asegurarse de que httpd.conf el archivo está debidamente protegido.

class httpd::configure inherits httpd{
        file { '/etc/httpd/conf/httpd.conf':
                ensure => file,
                owner => 'root',
                group => 'root',
                mode => '0644',
        }
}

Creando una subclase para iniciar httpd servicio (start.pp – class modulename::start):

# pwd
/etc/puppetlabs/code/environments/production/modules/httpd
#  vim manifests/start.pp

Copie y pegue el siguiente código:

class httpd::start inherits httpd{
 service { 'httpd':
 ensure     => running,
 enable     => true,
 hasstatus  => true,
 hasrestart => true,
 require => Package['httpd'],
 }
 }

Ahora, tienes las subclases creadas.

  • instalar.pp – para instalar httpd paquete
  • configure.pp – para configurar los permisos adecuados para httpd.conf archivo
  • inicio.pp – para habilitar e iniciar el httpd servicio.

Paso 7: Ahora deberíamos dejar que la clase principal httpd saber acerca de las subclases (instalar , configurar y empezar ). Para hacerlo, simplemente abra la clase principal del módulo e incluya las subclases.

# vim manifests/init.pp

La declaración de inclusión es la siguiente:

class httpd {
include httpd::install
include httpd::configure
include httpd::start
}

Paso 8: Ya hemos terminado con las clases. Pero debe decirle a Puppet en qué nodos se debe implementar el catálogo. Así es como puedes hacerlo.

Vaya al archivo de manifiesto principal (en /etc/puppetlabs/code/environments/production/manifests )

# vim site.pp

Copie y pegue el siguiente código. Aquí httpd es la clase principal creada para administrar el servidor web Apache.

node default {
include httpd
}

¡Eso es todo! Puede esperar hasta que los nodos de Puppet Agent descarguen el catálogo automáticamente o puede activarlo manualmente. Vaya al nodo Puppet Agent y ejecute el siguiente comando.

Paso 9:

[Agent]# /opt/puppetlabs/puppet/bin/puppet agent -t
 Info: Using configured environment 'production'
 Info: Retrieving pluginfacts
 Info: Retrieving plugin
 Info: Caching catalog for puppetagent.test.in
 Info: Applying configuration version '1472036234'
 Notice: /Stage[main]/Httpd::Install/Package[httpd]/ensure: created
 Notice: /Stage[main]/Httpd::Configure/File[/etc/httpd/conf/httpd.conf]/mode: mode changed '0600' to '0644'
 Notice: /Stage[main]/Httpd::Start/Service[httpd]/ensure: ensure changed 'stopped' to 'running'
 Info: /Stage[main]/Httpd::Start/Service[httpd]: Unscheduling refresh on Service[httpd]
 Notice: Applied catalog in 5.88 seconds

Dado que este es su primer módulo, es posible que desee verificar si el paquete está instalado y si el servicio se inició correctamente.

[Agent]# rpm -qa|grep httpd
httpd-tools-2.4.6-40.el7.centos.4.x86_64
httpd-2.4.6-40.el7.centos.4.x86_64
[Agent]# service httpd status
Redirecting to /bin/systemctl status  httpd.service
httpd.service - The Apache HTTP Server
 Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
 Active: active (running) since Wed 2016-08-24 17:29:29 IST; 6min ago

Conclusión

¡Eso es todo! Ahora ya sabe cómo escribir sus propios módulos de Puppet para instalar, configurar y habilitar el servicio. Sin embargo, este tutorial es solo un punto de partida para hacer maravillas con Puppet. ¡Felices marionetas!


Linux
  1. Cómo usar los comandos 'cat' y 'tac' con ejemplos en Linux

  2. Cómo comprimir archivos y directorios en Linux (con ejemplos)

  3. Comandos de cabeza y cola en Linux explicados con ejemplos

  4. Tutorial de comandos de expansión y desexpansión con ejemplos

  5. Guía para principiantes de FTP y SFTP con 10 ejemplos

Explicación de Soft Link y Hard Link en Linux con ejemplos

Secuencias de comandos de Bash:ciclo while y till explicado con ejemplos

50 comandos de corte de Linux simples y útiles en Unix con ejemplos

Permisos y propiedad de archivos de Linux explicados con ejemplos

Entendiendo Crontab en Linux con ejemplos

Introducción a los archivos de configuración de Puppet con ejemplos en Linux