### 从 Puppet 的 filebucket 检索文件
> A Freudian slip is when you say one thing, but mean your mother.
>
> — Anon
我们每个人都会犯错误,这就是为什么通常铅笔上会配有橡皮擦的原因。 每当 Puppet 客户端在改变一个文件时,就会将改变前的版本做个备份。 如果在 Puppet 客户端上对一个已经存在的文件做修改,不管多小的改变, 我们都可以看到这一过程:
```
# puppet agent --test
info: Caching catalog for cookbook
info: Applying configuration version '1293459139'
--- /etc/sudoers 2010-12-27 07:12:20.421896753 -0700
+++ /tmp/puppet-file20101227-1927-13hjvy6-0 2010-12-27 07:13:21.645702932
-0700
@@ -12,7 +12,7 @@
# User alias specification
-User_Alias SYSOPS = john
+User_Alias SYSOPS = john,bob
info: FileBucket adding /etc/sudoers as {md5}
c07d0aa2d43d58ea7b5c5307f532a0b1
info: /Stage[main]/Admin::Sudoers/File[/etc/sudoers]: Filebucketed /etc/
sudoers to puppet with sum c07d0aa2d43d58ea7b5c5307f532a0b1
notice: /Stage[main]/Admin::Sudoers/File[/etc/sudoers]/content: content
changed '{md5}c07d0aa2d43d58ea7b5c5307f532a0b1' to '{md5}0d218c16bd31206e
312c885884fa947d'
notice: Finished catalog run in 0.45 seconds
```
我们感兴趣的是下面这行:
```
info: /Stage[main]/Admin::Sudoers/File[/etc/sudoers]: Filebucketed /etc/
sudoers to puppet with sum c07d0aa2d43d58ea7b5c5307f532a0b1
```
Puppet 会根据文件内容创建一个 MD5 哈希,并使用它来创建一个 **filebucket** 路径, **filebucket** 的值是基于哈希的前几个字符的。 filebucket 用来保存 Puppet 替换下来的任何文件副本,它存放的默认位置是 /var/lib/puppet/clientbucket:
```
# ls /var/lib/puppet/clientbucket/c/0/7/d/0/a/a/2/
c07d0aa2d43d58ea7b5c5307f532a0b1
contents paths
```
正如你看到的,ls 命令列出了文件名。 你在 bucket 的存放位置会看到两个文件: contents 和 paths 。 contens 文件的内容即为原始文件,paths 文件的内容即为原始文件的路径。
如果你知道文件内容的哈希值(像你看到的上面的例子),可以很容易地找到该文件; 如果你不知道,那么通过对整个 filebucket 创建一个索引文件的表将会非常有用。
#### 操作步骤
1. 使用如下命令创建索引文件:
```
# find /var/lib/puppet/clientbucket -name paths -execdir cat {}\; \
-execdir pwd \; -execdir date -r {} +"%F %T" \; -exec echo \; \
> bucket.txt
```
2. 在索引文件中查找你要寻找的文件:
```
# cat bucket.txt
/etc/sudoers
/var/lib/puppet/clientbucket/c/0/7/d/0/a/a/2/
c07d0aa2d43d58ea7b5c5307f532a0b1
2010-12-27 07:13:21
/etc/sudoers
/var/lib/puppet/clientbucket/1/0/9/0/e/2/8/a/1090e28a70ebaae872c2e
c78894f49eb
2010-12-27 07:12:20
```
3. 一旦你要恢复一个已知 bucket 路径的文件,只要复制该文件到原始文件名即可:
```
# cp /var/lib/puppet/clientbucket/1/0/9/0/e/2/8/a/1090e28a70ebaae8
72c2ec78894f49eb/contents /etc/sudoers
```
#### 工作原理
上面的 find 命令会创建一份完整的 filebucket 文件列表清单, 显示原始文件的名称,bucket 的路径,以及修改日期 (在上例中你学习到了如何恢复文件到以前版本), 一旦你知道 bucket 的路径,那么就可以复制文件到正确的位置。
#### 更多用法
你可以让 Puppet 在原始目录下创建备份文件,而不是在 filebucket。 为了做到这一点,只需要在配置清单中指定 backup 参数的值:
```
file { "/etc/sudoers":
mode => "440",
source => "puppet:///modules/admin/sudoers",
backup => ".bak",
}
```
现在,如果 Puppet 替换了旧文件,就会在原始路径下面创建一个扩展名为 .bak 的备份文件。 若希望 Puppet 对所有的文件执行这样的默认备份策略,可以在配置清单中使用如下代码:
```
File {
backup => ".bak",
}
```
要完全禁用备份,使用下面的代码:
```
backup => false,
```
- 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
- 使用公共模块
- 使用外部节点分类器
- 创建自定义的资源类型
- 创建自定义的提供者