Puppet 类型和提供者基础教程文档

收录于 2023-04-20 00:10:05 · بالعربية · English · Español · हिंदीName · 日本語 · Русский язык · 中文繁體

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