木偶 – 模块
木偶 – 模块
在 Puppet 中,模块可以定义为资源、类、文件、定义和模板的集合。Puppet 支持轻松重新分配模块,这对代码的模块化非常有帮助,因为您可以编写指定的通用模块,并且只需很少的简单代码更改就可以多次使用它。例如,这将启用 /etc/puppet 下的默认站点配置,并在 /etc/share/puppet 中使用由 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清单文件。此清单文件是一个默认文件,它首先在任何特定模块中执行,并包含与该特定模块关联的所有类的集合。额外的.pp文件可以直接添加到 manifests 文件夹下。如果我们要添加额外的 .pp 文件,它们应该以类命名。
使用模块实现的关键特性之一是代码共享。一个模块本质上应该是自包含的,这意味着你应该能够从任何地方包含任何模块并将其放到模块路径上,当 Puppet 启动时它会被加载。在模块的帮助下,可以在 Puppet 基础设施编码中获得模块化。
例子
考虑安装固定 auto.homes 映射并从模板生成 auto.master 的 autofs 模块。
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 遵循预定义的结构,其中在定义的结构中包含多个目录和子目录。这些目录包含模块执行某些操作所需的不同类型的文件。一点幕后魔法确保正确的文件与正确的上下文相关联。所有模块搜索都在模块路径中,一个以冒号分隔的目录列表。
对于文件服务器上的文件引用,使用类似的引用,以便对 puppet 的引用://$servername/modules/autofs/auto.homes 解析为模块路径中的文件 autofs/files/auto.homes。
要使模块既可用于命令行客户端又可用于 puppet master,可以使用 from 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 将尝试从模块自动加载类和定义。