Классы марионеток определяются как набор ресурсов, которые сгруппированы для того, чтобы получить целевой узел или компьютер в желаемом состоянии. Эти классы определены внутри файлов манифеста Puppet, которые находятся внутри модулей Puppet. Основная цель использования класса — уменьшить количество повторений кода внутри любого файла манифеста или любого другого кода Puppet.
Ниже приведен пример класса Puppet.
[root@puppetmaster 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}", } }
В приведенном выше примере у нас есть два клиента, где пользователь должен существовать. Как можно заметить, мы повторили один и тот же ресурс дважды. Один из способов не выполнять одну и ту же задачу при объединении двух узлов.
[root@puppetmaster manifests]# cat site.pp node 'Brcleprod001','Brcleprod002' { user { 'vipin': ensure => present, uid => '101', shell => '/bin/bash', home => '/home/homer', } }
Объединение узлов таким способом для выполнения настройки не является хорошей практикой. Это может быть просто достигнуто путем создания класса и включения созданного класса в узлы, как показано ниже.
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:} }
Следует обратить внимание на то, как выглядит структура класса и как мы добавили новый ресурс с помощью ключевого слова class. Каждый синтаксис в Puppet имеет свою особенность. Следовательно, выбранный синтаксис зависит от условий.
Параметризованный класс
Как и в приведенном выше примере, мы увидели, как создать класс и включить его в узел. Теперь есть ситуации, когда нам нужно иметь разные конфигурации на каждом узле, например, когда нужно, чтобы на каждом узле были разные пользователи, использующие один и тот же класс. Эта функция предоставляется в Puppet с использованием параметризованного класса. Конфигурация для нового класса будет выглядеть так, как показано в следующем примере.
[root@puppetmaster ~]# 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", } }
Когда мы применяем вышеуказанный манифест site.pp к узлам, выходные данные для каждого узла будут выглядеть следующим образом.
Brcleprod001
[root@puppetagent1 ~]# 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 [root@brcleprod001 ~]# cat /etc/passwd | grep "vipin" G01063908:x:101:501::/home/G01063909:/bin/bash
Brcleprod002
[root@Brcleprod002 ~]# 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 [root@puppetagent2 ~]# cat /etc/passwd | grep "varsha" G01063909:x:101:501::/home/G01063909:/bin/bash
Можно также установить значение по умолчанию для параметра класса, как показано в следующем коде.