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 ...