### 从 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](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 的配置清单。 虽然这还需要一些额外的编辑工作,但是比你从头开始编写配置清单要快得多。
- Puppet 2.7 Cookbook 中文版
- 中文翻译版
- 译者序
- 项目缘起
- 翻译方法
- 社区链接
- 社区建议
- 贡献者
- 原书版权页
- 关于作者
- 前言
- 本书内容
- 阅读前提
- 适用读者
- 格式约定
- 读者反馈
- 客户支持
- 下载案例代码
- 勘误表
- Puppet 基础设施
- 使用版本控制
- 使用提交钩子
- 使用 Rake 部署变更
- 配置 Puppet 的文件服务器
- 从 cron 运行 Puppet
- 使用自动签名
- 预签名证书
- 从 Puppet 的 filebucket 检索文件
- 使用 Passenger 扩展 Puppet 的部署规模
- 创建去中心化的分布式 Puppet 架构
- 监控、报告和排错
- 生成报告
- 通过 Email 发送包含特定标签的日志信息
- 创建图形化报告
- 自动生成 HTML 文档
- 绘制依赖关系图
- 测试你的 Puppet 配置清单
- 执行模拟运行
- 检测编译错误
- 理解 Puppet 的错误信息
- 显示命令的输出结果
- 输出调试信息
- 检查配置设置
- 使用标签
- 使用运行阶段
- 使用不同的环境
- Puppet 语言及其写作风格
- 使用 Puppet 社区规范
- 使用模块
- 使用标准的命名规范
- 使用嵌入式 Ruby 代码
- 使用纯 Ruby 代码书写配置清单
- 遍历多个项目
- 书写强大的条件语句
- 在 if 语句中使用正则表达式
- 使用选择器和 case 语句
- 检测字符串中是否包含指定的值
- 使用正则表达式替换
- 书写更优质的配置清单
- 使用资源的数组
- 使用 define 资源
- 指定资源的依赖关系
- 使用节点继承
- 使用类的继承和重载
- 给类传递参数
- 书写可重用的跨平台配置清单
- 获得系统的环境信息
- 导入动态信息
- 从 CSV 文件导入数据
- 给 Shell 命令传递参数
- 使用文件和软件包
- 为配置文件添加配置行
- 使用 Augeas 自动修改配置文件
- 使用配置片段构建配置文件
- 使用 ERB 模板
- 在模板中遍历数组
- 从第三方仓库安装软件包
- 配置 APT 软件仓库
- 配置 GEM 仓库
- 从源码包自动构建软件
- 比较软件包的版本
- 用户和虚拟资源
- 使用虚拟资源
- 使用虚拟资源管理用户
- 管理用户基于密钥的 SSH 访问
- 管理用户的自定义文件
- 有效地分发 cron 任务
- 当文件更新时运行命令
- 使用主机资源
- 为文件资源指定多个源
- 使用文件资源递归地分发整个目录树
- 清理过期的旧文件
- 使用日程表资源
- 资源的审计
- 临时禁用资源
- 管理时区
- 应用程序
- 管理 Apache 服务
- 创建 Apache 虚拟主机
- 创建 Nginx 虚拟主机
- 创建 MySQL 数据库及用户
- 管理 Drupal 站点
- 管理 Rails 应用程序
- 服务器和云基础设施
- 部署 Nagios 监控服务器
- 使用 Heartbeat 构建高可用服务
- 管理 NFS 服务和文件共享
- 使用 HAProxy 为多个 web 服务器实现负载均衡
- 使用 iptables 管理防火墙
- 管理 Amazon 的 EC2 实例
- 使用 Vagrant 管理虚拟机
- 外部工具和 Puppet 生态环境
- 创建 Facter 的自定义 fact
- 在运行 Puppet 之前和之后执行命令
- 从 Shell 会话生成 Puppet 配置清单
- 从运行的系统上生成 Puppet 配置清单
- 使用 Puppet Dashboard
- 使用 Foreman
- 使用 MCollective
- 使用公共模块
- 使用外部节点分类器
- 创建自定义的资源类型
- 创建自定义的提供者