执行模拟运行

No alarms and no surprises.

— Radiohead

我讨厌惊喜。有时你的 Puppet 配置清单没有像你预期的那样执行, 或者在你不知情的情况下,或许别人又提交了改变。 不管哪种情况发生,在 Puppet 执行配置清单之前能精确地获知它将要执行些什么是非常必要的。

例如,若更新了一个生产服务的配置文件并重新启动该服务,很可能会导致非计划性的停机时间。 又如,有时人为的手动编辑的配置文件会被 Puppet 同步更新时覆盖。

为了避免这些问题,你可以使用 Puppet 的 模拟运行dry run)模式, 也称 无操作no operation,noop)模式,来避免真正的执行。

操作步骤

使用 --noop 开关运行 Puppet:

# puppet agent --test --noop
info: Connecting to sqlite3 database: /var/lib/puppet/state/
clientconfigs.sqlite3
info: Caching catalog for cookbook.bitfieldconsulting.com
info: Applying configuration version '1296492323'
--- /etc/exim4/exim4.conf   2011-01-17 08:13:34.349716342 -0700
+++ /tmp/puppet-file20110131-20189-127zyug-0 2011-01-31
09:45:27.792843709 -0700
@@ -1,4 +1,5 @@
 #########
+# allow spammers to use our host as a relay
 #########
notice: /Stage[main]/Admin::Exim/File[/etc/exim4/exim4.conf]/content: is
{md5}02798714adc9c7bf82bf18892199971a, should be {md5}6f46256716c0937f3b6
ffd6776ed059b (noop)
info: /Stage[main]/Admin::Exim/File[/etc/exim4/exim4.conf]: Scheduling
refresh of Service[exim4]
notice: /Stage[main]/Admin::Exim/Service[exim4]: Would have triggered
'refresh' from 1 events
notice: Finished catalog run in 0.90 seconds

工作原理

在 noop 模式下,Puppet 会和常规运行模式一样运行,只是不会对客户端产生实际影响。 它会告知最终将会执行什么,你可以和你所预期的进行对比。如果有任何不同,重新检查配置清单 或机器的当前状态。

在前面的例子中,注意 Puppet 警告我们由于配置文件更新,它将会重新启动 exim 服务。 这或许是我们所期待的,也可能不是, 但不管怎样,预先知道这样的警告是有用的。 我制定了一个流程规则, 当在生产服务器上应用任何重要更新之前, 先在 noop 模式下运行 Puppet,验证发生的改变是否与我们预期一致。

更多用法

你也可以使用模拟运行模式作为一个简单的审计工具。 它会告诉你从 Puppet 最近一次应用配置清单之后的任何改变。 一些组织要求所有的配置变更都通过 Puppet 来实现,这是一种对变更实施控制的过程。 使用 Puppet 的模拟运行模式可以检测到未授权的更改,之后决定是否合并应用这些改变到 Puppet 的配置清单,或者撤消改变。

参见本书