📜  puppet 类型和提供者

📅  最后修改于: 2021-01-08 05:02:29             🧑  作者: Mango

puppet 类型和提供者

puppet 类型

人偶类型管理各个配置项。 Puppet提供了程序包类型,用户类型和服务类型。并且每种类型都支持提供程序。在Puppet中,有两类类型:

定义的类型:此类型用Puppet的DSL(特定于域的语言)编写。

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中的关键字“ define”一样。

本机类型也称为Ruby类型。与定义的类型不同,Ruby类型依赖于提供程序来处理相应系统。

提供者

提供者在另一个平台或工具上处理配置管理。提供者实施该过程,并且这些过程用于管理资源。

资源具有属性的集合,提供者用于管理该资源。同样,我们可以为单个类型实现多个提供程序。这些提供程序允许将类似的资源应用于不同的OS。

对于任何本机类型,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

人偶类型和提供程序是用Ruby语言编写的。让我们创建一个称为repo的简单Puppet类型,以管理存储库和提供程序,例如SVN和Git。回购类型的第一个元素是类型本身,它们通常位于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, 
}

sure语句将通知Puppet除提供程序中的三种方法外:

  • 创建:此命令用于生成资源
  • 销毁:这用于删除资源,并且
  • 存在:这用于验证资源是否存在

现在,指定这些方法的内容,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参数将告知回购类型,该目录用于下载,克隆或搜索我们的源存储库。上面的脚本指出了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

颠覆提供者:

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的类型回购提供程序。接下来,定义此提供程序将使用的命令:

commands :svncmd => "svn"
commands :svnadmin => "svnadmin"

在Puppet中,这些命令用于评估提供程序是否适合在客户端上使用。如果人偶无法在本地路径中获取这些命令,则该提供程序将被禁用。

现在,我们可以生成资源:

repo { "wp":
    source => "http://core.svn.wordpress.org/trunk/",
    path => "/var/www/wp",
    ensure => present,
}