从 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 工具, 我们将在这本书的后续章节中做详细介绍。
参见本书
第 6 章的 有效地分发 cron 任务 一节
第 3 章的 使用嵌入式 Ruby 代码 一节
第 9 章的 使用 MCollective 一节