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 的文件。

$ touch 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,
}

下一章:Puppet 模板

模板是用一种特殊的语言编写的,可以从数据中生成文本。模板是收集代码、数据和文字文本以生成最终输出的文档。模板的主要目的是通过简单的输入处理文本的复杂部分。我们在 Puppet 中使用模板来处理配置文件的内容。模板语言Pu ...