使用 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 没有通用的循环语句,例如 for
或 while
,但您可以通过使用几个 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
。
有没有办法确保调用 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 没有通用的循环语句,例如 for
或 while
,但您可以通过使用几个 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
。