Puppet:在同一节点上随机化多个cron作业

4
我在一个使用 Puppet 部署的 LAMP 节点上拥有大量的 Drupal 网站。每个网站都有一个需要每小时运行的 cronjob,目前是在整点运行。为了避免这造成的峰值负载,我想将 cronjob 分散到随机的分钟数,最好不需要手动配置分钟值。该值应在 Puppet 运行之间保持不变。无需考虑其他节点。
下面是我的 cronjob 清单示例:
# Drupal cronjobs
cron { "www1.example.com":
    command     => "nice -n 19 drush -y -r /var/www/sites/example.com/www1/current/public -l www1.example.com elysia-cron",
    user        => 'www-data',
    hour        => '*',
    minute      => '0',
}
cron { "www2.example.com":
    command     => "nice -n 19 drush -y -r /var/www/sites/example.com/www2/current/public -l www2.example.com elysia-cron",
    user        => 'www-data',
    hour        => '*',
    minute      => '0',
}
cron { "www3.example.com":
    command     => "nice -n 19 drush -y -r /var/www/sites/example.com/www3/current/public -l www3.example.com elysia-cron",
    user        => 'www-data',
    hour        => '*',
    minute      => '0',
}

我尝试了 Puppet 的 fqdn_rand() 函数,但这只会在不同节点(由于使用 fqdn)之间进行随机化,导致相同的值出现在同一节点上的每个 cronjob 上。
    minute      => fqdn_rand(60),   # Same value for each cronjob :(

我曾尝试使用cronjob名称来为fqdn_rand()函数提供种子,但使用资源名称作为种子并没有奏效:

    minute      => fqdn_rand(60, $title),     # Same value for each cronjob :(
    minute      => fqdn_rand(60, "${title}"), # Same value for each cronjob :(

我猜测 $title 实际上没有被解析,而是作为字符串 '$title' 传递给了函数。无论如何,这不是我所需要的。
在运行 Puppet 3.7.5 的情况下,我没有找到其他可以帮助我的函数。我该怎么解决这个问题?
1个回答

3

思路不错,但你需要将 cron 资源包装在一个定义类型中。

define my_cron($ensure = 'present', $hour,$user) {
  $minute = fqdn_rand(60, $title)
  cron {
    $title:
      ensure => $ensure,
      user   => $user,
      hour   => $hour,
      minute => $minute,
}

现在$title获取了my_cron(以及cron)资源的实际值。
示例调用:
my_cron {
  '/usr/share/bin/cleanup-job':
    ensure => 'present',
    hour => '2',
}

尽管在my_cron中默认情况下可以跳过ensure

有趣。我没有意识到这一点。我对定义的类型不是很熟悉。您能否为我提供一个示例,说明我如何在上面显示的cronjobs中使用该类型? - Martijn Heemels
如果“hour”和“user”都相同且已定义,则应将@MartijnHeemels用作“my_cron {“www1.example.com”:}”。 - BMW
1
不,你只需要用“my_cron”替换原始的“cron”资源即可。我会添加一个示例。 - Felix Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接