使用模块
你会对自己编写的 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 章的 创建自定义的提供者 一节