使用标准的命名规范
There are only two hard problems in computer science: cache invalidation, naming things, and off-by-one errors.
— Phil Karlton
当你维护代码时会发现,选择适当而有意义的信息为你的模块或类命名是有很大帮助的。 尤其是当其他人需要阅读或基于你编写的配置清单工作时,这种命名方法是十分必要的。
操作步骤
模块应该以被管理的软件或服务命名,例如:apache 或 haproxy。
用跟在模块之后的功能或提供的服务为模块中的类命名,例如:apache::vhosts 或 rails::dependencies。
如果在模块中提供了禁用服务的功能,将其命名为 disabled。例如一个禁用 Apache 的类应该命令为 apache::disabled。
如果一个节点需要提供多种服务,请在节点的定义中包含一个类或者每个服务的类名。例如:
node server014 inherits server { include puppet::server include mail::server include repo::gem include repo::apt include zabbix }
管理用户的模块应该命名为 user。
在 user 模块中,声明虚拟用户的类应命名为 user::virtual。
在 user 模块中,一个特定的用户组应该命名为子类,例如 user::sysadmins 或 user::contractors。
当你需要覆盖某些特定节点或服务的类时,继承该类并以节点名作为子类名的前缀。 例如,如果节点 cartman 需要一个特殊的 SSH 配置且要覆盖 ssh 类,可以这样做:
class cartman_ssh inherits ssh { [ override config here ] }
当使用 Puppet 为不同的服务部署配置时,被 Puppet 解析后传出的文件应该以服务开头, 随后跟上指示文件功能的后缀。例如:
Apache init 脚本?—?apache.init
Rails 的日志滚动配置片段?—?rails.logrotate
Nginx 为 mywizzoapp 应用所做的 vhost 配置?—?mywizzoapp.vhost.nginx
独立运行的 MySQL 服务器的配置?—?standalone.mysql
如果你要管理不同的 Ruby 版本,可以使用添加了版本号的类名,表示由此类负责特定版本的管理, 例如 ruby192 或 ruby186。
更多用法
Puppet 社区维护着一套 Puppet 基础设施的最佳实践准则,其中包括对命名的提示: http://projects.puppetlabs.com/projects/1/wiki/Puppet_Best_Practice2 。
一些人更愿意在一个节点中使用逗号分割的列表包含多个类,而不是使用分离的 include 语句。例如:
node server014 inherits server {
include puppet::server,
mail::server,
repo::gem,
repo::apt,
zabbix
}
这是个风格问题,但我更愿意使用分离的 include 语句,一行包含一个模块或类, 因为这样可以更容易地在节点之间复制或移动,而无需每次都要整理逗号和缩进的问题。
我在前面的例子中曾几次提到过继承。如果你不知道这是什么,不要担心:我会在下一章详细解释。