使用标准的命名规范

There are only two hard problems in computer science: cache invalidation, naming things, and off-by-one errors.

— Phil Karlton

当你维护代码时会发现,选择适当而有意义的信息为你的模块或类命名是有很大帮助的。 尤其是当其他人需要阅读或基于你编写的配置清单工作时,这种命名方法是十分必要的。

操作步骤

  1. 模块应该以被管理的软件或服务命名,例如:apache 或 haproxy。

    用跟在模块之后的功能或提供的服务为模块中的类命名,例如:apache::vhosts 或 rails::dependencies。

    如果在模块中提供了禁用服务的功能,将其命名为 disabled。例如一个禁用 Apache 的类应该命令为 apache::disabled。

  2. 如果一个节点需要提供多种服务,请在节点的定义中包含一个类或者每个服务的类名。例如:

    node server014 inherits server {
        include puppet::server
        include mail::server
        include repo::gem
        include repo::apt
        include zabbix
    }
    
  3. 管理用户的模块应该命名为 user。

    1. 在 user 模块中,声明虚拟用户的类应命名为 user::virtual。

    2. 在 user 模块中,一个特定的用户组应该命名为子类,例如 user::sysadmins 或 user::contractors。

  4. 当你需要覆盖某些特定节点或服务的类时,继承该类并以节点名作为子类名的前缀。 例如,如果节点 cartman 需要一个特殊的 SSH 配置且要覆盖 ssh 类,可以这样做:

    class cartman_ssh inherits ssh {
        [ override config here ]
    }
    
  5. 当使用 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 语句,一行包含一个模块或类, 因为这样可以更容易地在节点之间复制或移动,而无需每次都要整理逗号和缩进的问题。

我在前面的例子中曾几次提到过继承。如果你不知道这是什么,不要担心:我会在下一章详细解释。