使用标准的命名规范

优质
小牛编辑
135浏览
2023-12-01
There are only two hard problems in computer science: cache invalidation, naming things, and off-by-one errors. — Phil Karlton

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

操作步骤

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

    用跟在模块之后的功能或提供的服务为模块中的类命名,例如:apache::vhostsrails::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::sysadminsuser::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 版本,可以使用添加了版本号的类名,表示由此类负责特定版本的管理, 例如 ruby192ruby186

更多用法

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 语句,一行包含一个模块或类, 因为这样可以更容易地在节点之间复制或移动,而无需每次都要整理逗号和缩进的问题。

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