Fantoche - Aulas

As classes de fantoches são definidas como uma coleção de recursos, que são agrupados para obter um nó ou máquina de destino em um estado desejado. Essas classes são definidas dentro dos arquivos de manifesto do Puppet, localizados dentro dos módulos do Puppet. O principal objetivo de usar uma classe é reduzir a mesma repetição de código dentro de qualquer arquivo de manifesto ou qualquer outro código Puppet.

A seguir está um exemplo da 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}", 
   }
}

No exemplo acima, temos dois clientes onde o usuário precisa existir. Como pode ser notado, repetimos o mesmo recurso duas vezes. Uma maneira de não fazer a mesma tarefa ao combinar os dois nós.

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

Mesclar nós dessa maneira para executar a configuração não é uma boa prática. Isso pode ser feito simplesmente criando uma classe e incluindo a classe criada em nós que é mostrado a seguir.

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

O ponto a ser notado é como a estrutura da classe se parece e como adicionamos um novo recurso usando a palavra-chave class. Cada sintaxe no Puppet tem seu próprio recurso. Portanto, a sintaxe escolhida depende das condições.

Classe Parametrizada

Como no exemplo acima, vimos como criar uma classe e incluí-la em um nó. Agora, existem situações em que precisamos ter diferentes configurações em cada nó, como quando é necessário ter diferentes usuários em cada nó usando a mesma classe. Este recurso é fornecido no Puppet usando classe parametrizada. A configuração de uma nova classe será semelhante à mostrada no exemplo a seguir.

[[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 aplicamos o manifesto site.pp acima nos nós, a saída de cada nó será semelhante à seguinte.

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

Também é possível definir o valor padrão de um parâmetro de classe, conforme mostrado no código a seguir.

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