从 Shell 会话生成 Puppet 配置清单

I object to being called a chess genius, because I consider myself to be an all around genius who just happens to play chess, which is rather different.

— Bobby Fischer

并非所有人都是天才。如果你确切地知道安装一个应用程序或服务都需要做些什么的话, 你马上就可以创建 Puppet 的配置清单。尽管如此,你通常还是需要首先做些小小的试验, 比如找到你要安装的软件包、需要编辑哪些配置文件等等。 你可以使用 script 命令记录你的 Shell 会话,然后根据会话文件的记录内容开发 Puppet 的配置清单,这是个不错的方法。

但如果有一个工具能通过读取你的会话文件生成 Puppet 配置清单的话是不是更精彩呢? 为了实现此功能,cft (读音为 'sift')应运而生。 一旦你激活它,cft 监视你的 Shell 会话并记住你安装的任何软件包、任何服务的配置、 任何你创建或编辑的文件,等等。 当会话记录结束,cft 会生成一个重现你刚刚所做的所有改变的完整的 Puppet 配置清单。

准备工作

  1. 当前完整的 cft 支持仅能用于 Red Hat/CentOS 发行版;针对 Debian/Ubuntu 发行版的完整的支持正在开发中,估计不久之后即可完成。 如果你正在使用 Red Hat/CentOS,只要安装 cft 即可:

    # yum install cft
    
  2. 对于 Debian/Ubuntu 系统,请参考如下安装说明,网址为: http://fmtyewtk.blogspot.com/2011/01/porting-cft-to-debian.html

操作步骤

  1. 在本例中我们将使用 cft 监视 NTP 安装的软件包并生成实现相同功能的配置清单。

    # cft begin ntp
    # apt-get install ntp
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    Suggested packages:
      ntp-doc
    The following NEW packages will be installed:
      ntp
    0 upgraded, 1 newly installed, 0 to remove and 385 not upgraded.
    
    Need to get 517kB of archives.
    After this operation, 1,323kB of additional disk space will be used.
    Get:1 http://us.archive.ubuntu.com/ubuntu/ lucid/main ntp
    1:4.2.4p8+dfsg-1ubuntu2 [517kB]
    Fetched 517kB in 5s (101kB/s)
    Selecting previously deselected package ntp.
    (Reading database ... 135278 files and directories currently
    installed.)
    Unpacking ntp (from .../ntp_1%3a4.2.4p8+dfsg-1ubuntu2_i386.deb)
    ...
    Processing triggers for man-db ...
    Processing triggers for ureadahead ...
    ureadahead will be reprofiled on next reboot
    Setting up ntp (1:4.2.4p8+dfsg-1ubuntu2) ...
     * Starting NTP server ntpd
    
    # vi /etc/ntp.conf
    # service ntp restart
     * Stopping NTP server ntpd
    [ OK ]
     * Starting NTP server ntpd
    
    # cft finish ntp
    # cft manifest ntp
    
    class ntp {
        package { 'ntp':
            ensure => '1:4.2.4p8+dfsg-1ubuntu2'
        }
    
        service { 'ntp':
            enable => 'true',
            ensure => 'running'
        }
    
        file { '/etc/ntp.conf':
            group  => 'root',
            owner  => 'root',
            mode   => '0644',
            source => '/tmp/cft/ntp/after/etc/ntp.conf'
        }
    }
    

工作原理

首先告诉 cft 开始记录系统的改变,并将其会话存储在 ntp 中?—?cft begin ntp 。

然后,当你安装 ntp 软件包时,cft 会记录这个事实。 软件包安装了服务的启动脚本,配置了在机器启动时启动服务,cft 同时也记录了这些。 最后,cft 注意到你编辑了 /etc/ntp.conf 文件,并保存了一份修改后的拷贝以备后用。

当你运行 cft finish ntp 命令,这会停止记录变化。 现在你可以使用 cft manifest ntp 命令生成与你的控制台会话等效的 Puppet 配置清单。

正如你看到的,生成的配置清单包括了 package 声明(由命令 apt-get install ntp 触发):

package { 'ntp':
    ensure => '1:4.2.4p8+dfsg-1ubuntu2'
}

同时包括了再现包安装脚本作用的 service 声明,启动服务并设置开机启动:

service { 'ntp':
    enable => 'true',
    ensure => 'running'
}

这个声明是由于你手动配置了如下命令所生成的:

# service ntp start
# update-rc.d ntp defaults

配置清单的最后一部分封装了 ntp.conf 文件的改变。 cft 只知道你对这个文件做了改变,但不知道你具体做了哪些改变, 所以 cft 将修改后的整个文件做为一个拷贝,并使其可以通过 Puppet 分发这个文件:

file { '/etc/ntp.conf':
    group  => 'root',
    owner  => 'root',
    mode   => '0644',
    source => '/tmp/cft/ntp/after/etc/ntp.conf'
}

当你将此配置清单放入 Puppet,还需要从原始路径(/tmp/cft/ntp/after/etc/ntp.conf) 复制 ntp.conf 文件到你的模块树的适当位置,并根据这个位置修改 source 参数的值。

更多用法

cft 是快速生成 Puppet 配置清单原型的一个强大工具。 你可以找一台构建配置清单的主机,尽可能使用 cft 记录你的安装和配置过程, 并使用它对整个会话进行编码生成 Puppet 的配置清单。 虽然这还需要一些额外的编辑工作,但是比你从头开始编写配置清单要快得多。