Puppet 类型和提供者
 
 
Puppet 类型和提供者
 
Puppet 类型
 
 Puppet 类型管理各个配置项。 Puppet 提供了一个包类型、一个用户类型、一个服务类型。并且每种类型都支持提供者。在 Puppet 中,有两类类型: 
 
 Defined Types: 这种类型是用 Puppet 的 DSL(Domain Specific Language)编写的。
 
 
  
  define custom_user (
   $ensure = present,
   $home
) {
   # ..omitting resources, composing custom_user.
} 
   
  
 这里,custom_user 是资源,$ensure、$home 是属性。可以使用这个定义的类型而不必担心实现资源: 
 
 
  
  custom_user { 'ftp':
  ensure => present,
  home   => '/var/lib/ftp',
} 
   
  
 原生类型: 原生类型是用 Ruby 语言编写的。借助原生类型,我们可以确定资源接口,就像与类型 API 集成的 Puppet DSL 中的关键字"定义"一样。
 
 原生类型也称为 Ruby 类型。与定义的类型不同,Ruby 类型依赖于用于处理相应系统的过程的提供者。
 
提供者
 
 提供者处理另一个平台或工具上的配置管理。提供者实现该过程,这些过程用于管理资源。
 
 资源具有一组属性,提供者用于管理该资源。此外,我们可以为单一类型实现多个提供者。这些提供程序允许将类似的资源应用于不同的操作系统。
 
 对于任何原生类型,Puppet 提供了几种不同的提供程序。例如,Puppet 的用户类型有八个提供程序,它们采用跨各种 Linux 和 Windows 平台的支持。
 
 包类型有不同的提供程序,例如 DMG、yum、aptitude 和 RPM。您可以通过以下命令查看系统中包类型的提供程序列表: 
 
 
  
  $ ls ~/src/puppet/lib/puppet/provider/package/
aix.rb    blastwave.rb  macports.rb    pkg.rb       rpm.rb          yum.rb
appdmg.rb dpkg.rb       msi.rb         pkgdmg.rb    rug.rb          yumhelper.py
apple.rb  fink.rb       nim.rb         pkgutil.rb   sun.rb          zypper.rb
apt.rb    freebsd.rb    openbsd.rb     portage.rb   sunfreeware.rb
aptitude.rb gem.rb      pacman.rb      ports.rb     up2date.rb
aptrpm.rb hpux.rb pip.r portupgrade.rb urpmi.rb
 
   
  
 Puppet 类型和提供程序是用 Ruby 语言编写的。让我们创建一个名为 repo 的简单 Puppet 类型,用于管理存储库和提供程序,例如 SVN 和 Git。 repo 类型的第一个元素是类型本身,它们通常位于 lib/puppet/type 或由模块分发。首先,创建一个名为 repo.rb 的文件。
 
 
 并将以下内容复制到文件中: 
 
 
  
  Puppet::Type.newtype(:repo) do
    @doc = "Manage repos"
    ensurable
    newparam(:source) do
        desc "The repo source"
        validate do |value|
            if value =~ /^git/
                resource[:provider] = :git
            else
                resource[:provider] = :svn
            end
        end
        isnamevar
    end
    newparam(:path) do
        desc "Destination path"
        validate do |value|
            unless value =~ /^\/[a-z0-9]+/
                raise ArgumentError , "%s is not a valid file path" % value
            end
        end
    end
end 
   
  
 在上面的代码中,我们创建了一个块,即 Puppet::Type.newtype(:repo)do,它创建了一个新类型,我们称之为 repo。我们已经提到了 @doc, 这是该类型的文档部分。我们还定义了可确保语句,用于创建基本的"确保"属性。Puppet类型使用此"确保"属性来获取配置项的状态。
 
 示例: 
 
 
  
  service { "sshd": 
   ensure => present, 
} 
   
  
 ensure 语句通知 Puppet 排除提供程序中的三个方法: 
 
Create: 该命令用于生成资源 
Destroy: 用于删除资源,以及 
Exist: 用于验证资源是否存在 
 现在,指定这些方法的内容,Puppet 围绕它们构建支持系统。
 
 现在,定义一个名为 source 的新参数: 
 
 
  
  newparam(:source) do 
   desc "The repo source" 
   validate do |value| 
      if value =~ /^git/ 
         resource[:provider] = :git 
      else 
         resource[:provider] = :svn 
      end 
   end 
   isnamevar 
end 
   
  
  source 参数将通知存储库类型在哪里下载、克隆或搜索我们的源存储库。上面的脚本声明如果源参数以 git 开头,则使用 Git 提供程序,如果不是默认值,则使用 Subversion 提供程序。
 
 再定义一个名为 path 的参数: 
 
 
  
  newparam(:path) do 
   desc "Destination path" 
   validate do |value| 
      unless value =~ /^\/[a-z0-9]+/ 
         raise ArgumentError , "%s is not a valid file path" % value 
      end 
   
  
 Subversion 提供程序: 
 
 
  
  require 'fileutils'
Puppet::Type.type(:repo).provide(:svn) do
    desc "SVN Support"
    commands :svncmd => "svn"
    commands :svnadmin => "svnadmin"
    def create
        svncmd "checkout", resource[:name], resource[:path]
    end
    def destroy
        FileUtils.rm_rf resource[:path]
    end
    def exists?
        File.directory? resource[:path]
    end
end 
   
  
 接下来,将提供者定义为一个块: 
 
 
  
  Puppet::Type.type(:repo).provide(:svn) do
 
   
  
 代码块通知Puppet这是一个名为svn的类型repo提供者。接下来,定义此提供程序将使用的命令: 
 
 
  
  commands :svncmd => "svn"
commands :svnadmin => "svnadmin"
 
   
  
 在 Puppet 中,这些命令用于评估提供程序是否适合在客户端上使用。如果 Puppet 无法在本地路径中获取这些命令,则提供程序将被禁用。
 
 现在,我们可以生成一个资源: 
 
 
  
  repo { "wp":
    source => "http://core.svn.wordpress.org/trunk/",
    path => "/var/www/wp",
    ensure => present,
}