开发手册 欢迎您!
软件开发者资料库

Puppet - 类

Puppet Classes - 从简单和简单的步骤学习Puppet,从基本到高级概念,包括概述,架构,安装,配置,环境配置,主机,代理设置,SSL签名证书设置,安装和配置r10K,验证Puppet设置,编码样式,清单文件,模块,文件服务器,Facter和事实,资源,资源抽象层,模板,类,功能,自定义函数,环境,类型和提供程序,RESTful API,实时项目。

Puppet类被定义为资源集合,这些资源组合在一起以使目标节点或机器处于所需状态.这些类在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

还可以设置默认值类参数的值,如下面的代码所示.

[root@puppetmaster ~]# 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",    } }