使用 fqdn_rand 并从池中删除号码

Using fqdn_rand and remove numbers from a pool

有没有办法确保调用 fqdn_rand 时使用的号码池永远不会在单个人偶 运行 中选择相同的号码?

我有一个 cronjob,我不想在同一天 运行 我的 5 个工作中的任何一个。我一直在使用 fqdn_rand 在随机日期生成作业,但发现某些服务器将在同一天生成 运行 的作业。在我看来,如果从可能选择的数字中删除这些数字,我将永远不会得到相同的结果。

Is there anyway I can ensure that the pool of numbers used when calling fqdn_rand will never pick the same number in a single puppet run?

您无法确保对 fqdn_rand() 的多次调用都会 return 不同的值。但是,您可以使用fqdn_rand()执行多个项目的select离子而不重复。有几种方法可以做到这一点,但我建议将它与 reduce() 函数结合使用,以对要从中 select 的选项列表执行(部分)洗牌。

问题中不清楚您是否要 select 从星期几、一个月中的几天或其他日期开始,但为了简单起见,我假设您是 select在一周中的几天之间,以数字 1 到 7 的形式:

  $day_numbers = [ 1, 2, 3, 4, 5, 6, 7 ]

虽然 Puppet 没有通用的循环语句,例如 forwhile,但您可以通过使用几个 iteration functions 之一来迭代(以及其他方式)来处理一个可迭代对象价值。例如:

  $selected = [ 0, 1, 2, 3, 4 ].reduce($day_numbers) |$numbers, $i| {
    $selection = fqdn_rand($day_numbers.length - $i - 1, $i)
    [ 
      $numbers[0, $i],                # The already selected numbers
      $numbers[$selection + $i, -1],  # The tail starting at the next selection
      $numbers[$i, $selection]        # The slice between the previous two
    ].flatten
  }[0, 5]

执行 lambda 五次,将 0 到 4 的连续值与变量 $i 相关联。在初始迭代中,$day_numbers$numbers 相关联。在每个后续迭代中,lambda 先前迭代的 return 值与 $numbers.

相关联

在 lambda 的每次迭代中,$i 个元素在之前的迭代中 select 占据 $numbers 的前 $i 个位置。 fqdn_rand() 函数用于计算其他元素之一的索引,然后旋转尾部以使 selected 元素就位。

最终,包含结果的前五个元素(即所有 selected 值)的数组被分配给 $selected