木偶 - 模块


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

模块配置

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

  • 模块的搜索路径是使用puppetmasterdmasterd中以冒号分隔的目录列表进行配置的,这是 Puppet 主配置文件的后面部分,带有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 

每当创建模块时,它都会在清单目录内指定的修复位置包含init.pp清单文件。该清单文件是默认文件,它在任何特定模块中首先执行,并包含与该特定模块关联的所有类的集合。可以直接在清单文件夹下添加其他.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。

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

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