Puppet - Classi

Le classi Puppet sono definite come una raccolta di risorse, che vengono raggruppate insieme per ottenere un nodo o una macchina di destinazione in uno stato desiderato. Queste classi sono definite all'interno dei file manifest di Puppet che si trovano all'interno dei moduli di Puppet. Lo scopo principale dell'utilizzo di una classe è ridurre la stessa ripetizione di codice all'interno di qualsiasi file manifest o qualsiasi altro codice Puppet.

Di seguito è riportato un esempio della classe 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}", 
   }
}

Nell'esempio sopra, abbiamo due client in cui l'utente deve esistere. Come si può notare abbiamo ripetuto due volte la stessa risorsa. Un modo per non fare lo stesso compito combinando i due nodi.

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

Unire i nodi in questo modo per eseguire la configurazione non è una buona pratica. Ciò può essere ottenuto semplicemente creando una classe e includendo la classe creata nei nodi che viene mostrato come segue.

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:} 
}

Il punto da notare è come appare la struttura della classe e come abbiamo aggiunto una nuova risorsa utilizzando la parola chiave class. Ogni sintassi in Puppet ha la sua caratteristica. Quindi, la sintassi che si sceglie dipende dalle condizioni.

Classe parametrizzata

Come nell'esempio precedente, abbiamo visto come creare una classe e includerla in un nodo. Ora ci sono situazioni in cui è necessario disporre di configurazioni diverse su ciascun nodo, ad esempio quando è necessario disporre di utenti diversi su ciascun nodo utilizzando la stessa classe. Questa funzionalità è fornita in Puppet utilizzando la classe parametrizzata. La configurazione per una nuova classe apparirà come mostrato nell'esempio seguente.

[[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", 
   } 
}

Quando applichiamo il manifesto site.pp sopra ai nodi, l'output per ciascun nodo sarà simile al seguente.

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

È anche possibile impostare il valore predefinito di un parametro di classe come mostrato nel codice seguente.

[[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", 
   } 
}