在Puppet中,模块可以定义为资源,类,文件,定义和模板的集合. Puppet支持轻松重新分发模块,这对代码的模块化很有帮助,因为可以编写指定的通用模块,并且只需很少的简单代码更改就可以多次使用它.例如,这将启用/etc/puppet下的默认站点配置,Puppet在/etc/share/puppet中提供模块.
模块配置
在任何Puppet模块中,我们有两个分区,它们有助于定义代码结构和控制命名.
模块的搜索路径使用 puppetmasterd 或 masterd 中的以冒号分隔的目录列表进行配置,Puppet的主配置文件的后面部分使用模块路径参数.
[puppetmasterd] ... modulepath =/var/lib/puppet/modules:/data/puppet/modules
文件服务器中文件服务器模块的访问控制设置. 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遵循预定义的结构,其中它包含定义结构中的多个目录和子目录.这些目录包含模块执行某些操作所需的不同类型的文件.一点点幕后魔术确保正确的文件与正确的上下文相关联.所有模块搜索都在模块路径中,这是一个以冒号分隔的目录列表.
对于文件服务器上的文件引用,使用类似的引用,以便引用puppet://$ servername/modules/autofs/auto.homes解析为模块路径中的autofs/files/auto.homes文件.
使模块可用于命令行客户端和木偶大师,可以使用from puppet:///路径的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将尝试从模块中自动加载类和定义.