Puppet - 模块
在 Puppet 中,模块可以定义为资源、类、文件、定义和模板的集合。Puppet 支持轻松重新分配模块,这对代码模块化非常有帮助,因为人们可以编写指定的通用模块,并且只需进行很少的代码更改即可多次使用它。例如,这将启用 /etc/puppet 下的默认站点配置,其中 Puppet 提供的模块位于 /etc/share/puppet 中。
模块配置
在任何 Puppet 模块中,我们都有两个分区,它们有助于定义代码结构和控制名称。
模块的搜索路径是使用 puppetmasterd 或 masterd 中以冒号分隔的目录列表配置的,Puppet 主配置文件的后面部分使用 modulepath 参数。
[puppetmasterd] ... modulepath = /var/lib/puppet/modules:/data/puppet/modules
fileserver.conf 中文件服务器模块的访问控制设置,该模块的路径配置始终被忽略,指定路径将产生警告。
可以在运行时通过设置 PUPPETLAB 环境变量来添加搜索路径,该变量也必须是以冒号分隔的变量列表。
模块源
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 清单文件。此清单文件是默认文件,它首先在任何特定模块中执行,并包含与该特定模块相关的所有类的集合。可以在 manifests 文件夹下直接添加其他 .pp 文件。如果我们要添加其他 .pp 文件,则应以类命名。
使用模块实现的关键功能之一是代码共享。模块本质上应该是自包含的,这意味着应该能够从任何地方包含任何模块并将其放到模块路径上,该路径在 Puppet 启动时加载。借助模块,人们可以在 Puppet 基础架构编码中获得模块化。

示例
考虑一个 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(一个冒号分隔的目录列表)内进行。
对于文件服务器上的文件引用,使用类似的引用,以便对 puppet://$servername/modules/autofs/auto.homes 的引用解析为模块路径中的文件 autofs/files/auto.homes。
要使模块可同时用于命令行客户端和 puppet master,可以使用 puppet:///path 的 URL。即没有明确服务器名称的 URL。Puppet 和 puppetd 对此类 URL 的处理略有不同。 Puppet 在本地文件系统中搜索无服务器 URL。
模板文件的搜索方式与清单和文件类似:提及模板("autofs/auto.master.erb")将使 puppetmaster 首先在 $templatedir/autofs/auto.master.erb 中查找文件,然后在模块路径上查找 autofs/templates/auto.master.erb。使用 Puppet 下的所有内容的 Puppet 版本,可以使用。这称为模块自动加载。Puppet 将尝试从模块中自动加载类和定义。