Marioneta - Clases

Las clases de marionetas se definen como una colección de recursos, que se agrupan para obtener un nodo o máquina de destino en el estado deseado. Estas clases se definen dentro de los archivos de manifiesto de Puppet que se encuentran dentro de los módulos de Puppet. El propósito principal de usar una clase es reducir la repetición del mismo código dentro de cualquier archivo de manifiesto o cualquier otro código de Puppet.

A continuación se muestra un ejemplo de la clase Puppet.

[[email protected] manifests]# cat site.pp  
class f3backup ( 
   $backup_home   = '/backup', 
   $backup_server = 'default', 
   $myname        = $::fqdn, 
   $ensure        = 'directory', 
) { 
   include '::f3backup::common' 
   if ( $myname == '' or $myname == undef ) { 
      fail('myname must not be empty') 
   }  
   @@file { "${backup_home}/f3backup/${myname}": 
      # To support 'absent', though force will be needed 
      ensure => $ensure, 
      owner  => 'backup', 
      group  => 'backup', 
      mode   => '0644', 
      tag    => "f3backup-${backup_server}", 
   }
}

En el ejemplo anterior, tenemos dos clientes donde el usuario necesita existir. Como puede observarse, hemos repetido dos veces el mismo recurso. Una forma de no hacer la misma tarea al combinar los dos nodos.

[[email protected] manifests]# cat site.pp 
node 'Brcleprod001','Brcleprod002' { 
   user { 'vipin': 
      ensure => present, 
      uid    => '101', 
      shell  => '/bin/bash', 
      home   => '/home/homer', 
   } 
}

Combinar nodos de esta manera para realizar la configuración no es una buena práctica. Esto se puede lograr simplemente creando una clase e incluyendo la clase creada en los nodos que se muestra a continuación.

class vipin_g01063908 { 
   user { 'g01063908': 
      ensure => present, 
      uid    => '101', 
      shell  => '/bin/bash', 
      home   => '/home/g01063908', 
   } 
}  
node 'Brcleprod001' { 
   class {vipin_g01063908:} 
}  
node 'Brcleprod002' { 
   class {vipin_g01063908:} 
}

El punto a tener en cuenta es cómo se ve la estructura de clases y cómo agregamos un nuevo recurso usando la palabra clave class. Cada sintaxis de Puppet tiene su propia característica. Por tanto, la sintaxis que uno elige depende de las condiciones.

Clase parametrizada

Como en el ejemplo anterior, hemos visto cómo crear una clase e incluirla en un nodo. Ahora, hay situaciones en las que necesitamos tener diferentes configuraciones en cada nodo, como cuando se necesita tener diferentes usuarios en cada nodo usando la misma clase. Esta característica se proporciona en Puppet usando una clase parametrizada. La configuración de una nueva clase se verá como se muestra en el siguiente ejemplo.

[[email protected] ~]# cat /etc/puppet/manifests/site.pp 
class user_account ($username){ 
   user { $username: 
      ensure => present, 
      uid    => '101', 
      shell  => '/bin/bash', 
      home   => "/home/$username", 
   } 
}  
node 'Brcleprod002' { 
   class { user_account: 
      username => "G01063908", 
   } 
} 
node 'Brcleprod002' { 
   class {user_account: 
      username => "G01063909", 
   } 
}

Cuando aplicamos el manifiesto site.pp anterior en los nodos, el resultado de cada nodo se verá como el siguiente.

Brcleprod001

[[email protected] ~]# puppet agent --test 
Info: Retrieving pluginfacts 
Info: Retrieving plugin 
Info: Caching catalog for puppetagent1.testing.dyndns.org 
Info: Applying configuration version '1419452655' 

Notice: /Stage[main]/User_account/User[homer]/ensure: created 
Notice: Finished catalog run in 0.15 seconds 
[[email protected] ~]# cat /etc/passwd | grep "vipin" 
G01063908:x:101:501::/home/G01063909:/bin/bash

Brcleprod002

[[email protected] ~]# puppet agent --test 
Info: Retrieving pluginfacts 
Info: Retrieving plugin 
Info: Caching catalog for puppetagent2.testing.dyndns.org 
Info: Applying configuration version '1419452725' 

Notice: /Stage[main]/User_account/User[bart]/ensure: created 
Notice: Finished catalog run in 0.19 seconds 
[[email protected] ~]# cat /etc/passwd | grep "varsha" 
G01063909:x:101:501::/home/G01063909:/bin/bash

También se puede establecer el valor predeterminado de un parámetro de clase como se muestra en el siguiente código.

[[email protected] ~]# cat /etc/puppet/manifests/site.pp 
class user_account ($username = ‘g01063908'){ 
   user { $username: 
      ensure => present, 
      uid    => '101', 
      shell  => '/bin/bash', 
      home   => "/home/$username", 
   } 
}  
node 'Brcleprod001' { 
   class {user_account:} 
}  
node 'Brcleprod002' { 
   class {user_account: 
      username => "g01063909", 
   } 
}