Puppet - 模块



在 Puppet 中,模块可以定义为资源、类、文件、定义和模板的集合。Puppet 支持轻松地重新分发模块,这在代码模块化方面非常有用,因为人们可以编写指定的通用模块,并通过很少的简单代码更改多次使用它。例如,这将在 /etc/puppet 下启用默认站点配置,并使用 Puppet 自身提供的模块位于 /etc/share/puppet 中。

模块配置

在任何 Puppet 模块中,我们都有两个分区,它们有助于定义代码结构和控制命名。

  • 模块的搜索路径使用 Puppet 主配置文件的 puppetmasterdmasterd 中的冒号分隔的目录列表进行配置,使用 modulepath 参数。

[puppetmasterd] 
... 
modulepath = /var/lib/puppet/modules:/data/puppet/modules 

    可以通过设置 PUPPETLAB 环境变量在运行时添加搜索路径,该变量也必须是冒号分隔的变量列表。

  • 文件服务器模块在 fileserver.conf 中的访问控制设置,该模块的路径配置始终被忽略,并且指定路径将产生警告。

模块源

Puppet 支持不同的模块存储位置。任何模块都可以存储在任何特定机器的不同文件系统中。但是,存储模块的所有路径都必须在称为 modulepath 的配置变量中指定,该变量通常是一个路径变量,Puppet 在其中扫描所有模块目录并在启动时加载它们。

可以配置一个合理的默认路径,如下所示:-

/etc/puppet/modules:/usr/share/puppet:/var/lib/modules. 

或者,可以将 /etc/puppet 目录建立为一个特殊的匿名模块,始终首先搜索该模块。

模块命名

Puppet 遵循特定模块的相同命名标准,其中模块名称必须是普通单词,匹配 [-\\w+](字母、单词、数字、下划线和破折号),并且不包含命名空间分隔符:或 /。虽然在模块层次结构方面可能允许,但对于新模块,它不能嵌套。

模块内部组织

当用户在 Puppet 中创建新模块时,它遵循相同的结构,并包含清单、分布式文件、插件和模板,这些文件和模板按以下代码所示的特定目录结构排列。

MODULE_PATH/ 
   downcased_module_name/ 
      files/ 
      manifests/ 
         init.pp 
      lib/ 
         puppet/ 
            parser/ 
               functions 
            provider/ 
            type/ 
         facter/ 
      templates/ 
      README 

每当创建模块时,它都会在 manifests 目录内的指定固定位置包含 init.pp 清单文件。此清单文件是第一个在任何特定模块中执行的默认文件,并且包含与该特定模块关联的所有类的集合。其他 .pp 文件可以直接添加到 manifests 文件夹下。如果添加其他 .pp 文件,则应以类命名。

使用模块实现的关键特性之一是代码共享。从本质上讲,模块应该是自包含的,这意味着应该能够从任何地方包含任何模块并将其放到模块路径上,在 Puppet 启动时加载该模块。借助模块,人们可以在 Puppet 基础设施编码中获得模块化。

Module

示例

考虑一个 autofs 模块,它安装固定的 auto.homes 映射并从模板生成 auto.master。

class autofs { 
   package { autofs: ensure => latest } 
   service { autofs: ensure => running } 
   
   file { "/etc/auto.homes": 
      source => "puppet://$servername/modules/autofs/auto.homes" 
   } 
   file { "/etc/auto.master": 
      content => template("autofs/auto.master.erb") 
   } 
}

文件系统将包含以下文件。

MODULE_PATH/ 
autofs/ 
manifests/ 
init.pp 
files/ 
auto.homes 
templates/ 
auto.master.erb 

模块查找

Puppet 遵循预定义的结构,其中包含定义结构中的多个目录和子目录。这些目录包含模块执行某些操作所需的不同类型的文件。一些幕后操作确保将正确文件与正确的上下文关联。所有模块搜索都在 modulepath 内进行,modulepath 是冒号分隔的目录列表。

对于文件服务器上的文件引用,使用类似的引用,以便对 puppet: //$servername/modules/autofs/auto.homes 的引用解析为模块路径中的 autofs/files/auto.homes 文件。

要使模块可用于命令行客户端和 puppet master,可以使用来自 puppet:///path 的 URL,即没有显式服务器名称的 URL。此类 URL 由 Puppetpuppetd 处理方式略有不同。Puppet 在本地文件系统中搜索无服务器 URL。

模板文件的搜索方式类似于清单和文件:提及模板(“autofs/auto.master.erb”)将使 puppetmaster 首先在 $templatedir/autofs/auto.master.erb 中查找文件,然后在模块路径上的 autofs/templates/auto.master.erb 中查找。使用 Puppet 版本的所有内容都可以在 Puppet 下使用。这称为模块自动加载。Puppet 将尝试从模块自动加载类和定义。

广告