从 cron 运行 Puppet

你的 Puppet 工作在休眠状态吗? 默认情况下,当你在客户端上运行 Puppet agent 时, 它会以守护进程(后台进程)的方式执行,每隔30分钟唤醒一次并检查配置清单是否有更新并应用这些变更 (也可以在 puppet.conf 中将 splay 选项的值设为 true 来指定一个随机的时间间隔)。 如果想要更灵活的控制 Puppet 的运行,你可以安排 cron 任务来替代守护进程的触发执行方式。

例如,如果你有很多的 Puppet 客户端,可能需要刻意地错开 Puppet 的运行时间以减轻 Puppetmaster 的负载压力。一个简单的方法是:将客户端主机名的哈希(散列)值作为 cron 任务的分钟或小时的时间参数。

操作步骤

使用 Puppet 的 inline_template 函数,它允许你执行 Ruby 代码:

cron { "run-puppet":
    command => "/usr/sbin/puppet agent --test",
    minute  => inline_template("<%= hostname.hash.abs % 60 %>"),
}
service { "puppet":
    ensure => stopped,
    enable => false,
}

工作原理

因为每个主机名会生成一个唯一的哈希值,所以每个客户端将会在一小时的不同分钟数运行 Puppet。 这种散列技术对于使 cron 任务随机运行是相当有用的,因为分散了运行时间,改善了互相干扰, 从而减轻了 Puppetmaster 的负载压力。

更多用法

你可能会发现,随着时间的推移以守护进程方式运行的 Puppet 会占用更多的内存, 或者偶尔 Puppet 与 Puppetmaster 的通信处于停滞状态(stuck state)。 以 cron 方式运行 Puppet 会解决这些问题。

参考 Puppet Labs 的 Wiki 页面 http://projects.puppetlabs.com/projects/puppet/wiki/Cron_Patterns 获得更多信息。

触发 Puppet 的运行还有其他方式,包括 MCollective 工具, 我们将在这本书的后续章节中做详细介绍。

参见本书