使用模块
你会对自己编写的 Puppet 代码感到羞愧吗?其他人看你的代码时会有恐惧感吗? 为了使你的 Puppet 配置清单更清晰且易于维护,一件最重要的事情就是将这些配置清单组织成 模块(modules)。
模块是对相关事物进行分组的一种简单方式;例如,一个 webserver 模块可能包含作为一个 Web 服务器所需的一切,包括 Apache 配置文件,虚拟主机配置模板以及部署这些所需的 Puppet 代码。
将配置清单拆分成模块易于代码的重用和共享;也是一种组织配置清单的最合乎逻辑的方式。 在本节中,我们将会创建一个管理 memcached 的模块,memcached 是一个 Web 应用程序常用的内存缓存系统。
操作步骤
在 puppet.conf 中查找你的模块路径,其默认值是 /etc/puppet/modules。 如果你像我前面建议的那样将 Puppet 配置清单纳入了版本控制, 那么就使用你的工作副本中的 modules 目录,之后再由他部署到 /etc/puppet/modules。
# puppet --genconfig |grep modulepath modulepath = /etc/puppet/modules:/usr/share/puppet/modules
在模块路径下创建一个名为 memcached 的子目录:
# cd /etc/puppet/modules # mkdir memcached
在此目录中,创建 manifests 和 files 两个子目录:
# cd memcached # mkdir manifests files
在 manifests 目录下,以如下内容创建 init.pp 文件:
class memcached { package { "memcached": ensure => installed, } file { "/etc/memcached.conf": source => "puppet:///modules/memcached/memcached.conf", } service { "memcached": ensure => running, enable => true, require => [ Package["memcached"], File["/etc/memcached.conf"] ], } }
切换到 files 目录,以如下内容创建 memcached.conf 文件:
-m 64 -p 11211 -u nobody -l 127.0.0.1
为了使用你的新模块,你的节点定义中添加如下的代码:
node cookbook { include memcached }
运行 Puppet 检测新配置:
# puppet agent --test info: Retrieving plugin info: Caching catalog for cookbook.bitfieldconsulting.com info: Applying configuration version '1300361964' notice: /Stage[main]/Memcached/Package[memcached]/ensure: ensure changed 'purged' to 'present' ... info: /Stage[main]/Memcached/File[/etc/memcached.conf]: Filebucketed /etc/memcached.conf to puppet with sum a977521922a151 c959ac953712840803 notice: /Stage[main]/Memcached/File[/etc/memcached.conf]/content: content changed '{md5}a977521922a151c959ac953712840803' to '{md5} f5c0bb01a24a5b3b86926c7b067ea6ba' notice: Finished catalog run in 20.68 seconds
检查新配置的服务是否正在运行:
# service memcached status * memcached is running
工作原理
模块有特定的目录结构。并非所有子目录都要存在,但如果存在就该以如下的布局方式组织:
MODULEPATH/
`-- MODULE_NAME
|-- files/
|-- templates/
|-- manifests/
|-- ...
`-- README
在 memcached.pp 文件中定义了 memcached 类, 它可以被 Puppet 自动导入。现在将其包含到节点中:
include memcached
在 memcached 类中,引用了 memcached.conf 文件:
file { "/etc/memcached.conf":
source => "puppet:///modules/memcached/memcached.conf",
}
正如我们在 配置 Puppet 的文件服务器 一节讲到的, 上面代码中的 source 参数告诉 Puppet 在如下的路径寻找文件:
MODULEPATH/
memcached/
files/
memcached.conf
更多用法
学习喜欢模块的组织方式,使用模块将使你的 Puppet 管理生活便得更轻松。模块并不复杂。 然而,实践和经验会帮助你判断何时应该将事物划分并组织成模块,以及如何更好的安排你的模块结构。 如下所述的一些技巧会对你有所帮助。
模板
模板作为模块的一部分,如果你需要使用它,那么其放在 MODULE_NAME/templates 目录,参考如下的用法:
file { "/etc/memcached.conf":
content => template("memcached/memcached.conf"),
}
Puppet 会在如下目录搜索模板文件:
MODULEPATH/
memcached/
templates/
memcached.conf
Fact、函数、类型和提供者
模板中也可以包含自定义 fact、自定义函数、自定义资源类型和自定义提供者。 关于这些内容的详细信息请参阅 外部工具和 Puppet 的生态系统 一章的内容。
puppet-module
你也可以使用 puppet-module 工具为一个新模块创建目录布局,而不是使用手工方式。 请参考第 9 章的 使用公共模块 一节获得更详细的信息。
第三方模块
你可以下载由其他人开发的模块,并在你的配置清单中使用这些模块, 就像这些模块是你自己写的一样。 请参考第 9 章的 使用公共模块 一节获得更详细的信息。
模块的组织方法
有关如何组织模块的更多信息,参见 Puppet Labs 站点:http://docs.puppetlabs.com/guides/modules.html 。
参见本书
第 1 章的 配置 Puppet 的文件服务器 一节
第 9 章的 创建 Facter 的自定义 fact 一节
第 9 章的 使用公共模块 一节
第 9 章的 创建自定义的资源类型 一节
第 9 章的 创建自定义的提供者 一节