在遍历人偶清单中的每个块时使用计数器

Using a counter while iterate via each block in puppet manifest

我有一个名为 $applist 的数组。这些值用于生成这样的 cron 条目

$minute = 0
$applist.each |$application| {

    $minute = $minute + 2
    # notify{"Setting clear_logs for ${application}":}
    # generate clear log entries
    cron {"clear-logs_${application}":
        command => "mk-job clear-logs_${application} /root/scripts/clear_logs.py -l 60 -d ${application}/logs -v -n >/dev/null 2>&1",
        user    => root,
        hour    => "3",
        minute  => "${minute}",
    }
}

在我的迭代步骤中,分钟没有增加 2。我很确定它与 lamdas 有关,但我不知道如何解决这个难题

我像这样使用 $index 解决了它

 $minute = 0
 $applist.each |$index, $application| {

     $cron_minute = $minute + $index * 10
     # notify{"Setting clear_logs for ${application}":}
     # generate clear log entries
     cron {"clear-logs_${application}":
         command => "mk-job clear-logs_${application} /root/scripts/clear_logs.py -l 60 -d ${application}/logs -v -n >/dev/null 2>&1",
         user    => root,
         hour    => "3",
         minute  => "${cron_minute}",
     }
  }

这是一个很好的问题,上面是正确的解决方案。

我要补充一点,这里的问题是无法重新分配 Puppet 中的变量:ref

通常,如果您有如下代码 -

$c = 0
$c = $c + 1

您将收到评估错误:

Error: Evaluation Error: Cannot reassign variable '$c' (file: /tmp/foo.pp, line: 2, column: 4) on node alexs-macbook-pro.local

人们经常注意到 Puppet 的变量因此不是 "variable";它们是不可变的。

更令人困惑的是,这种行为在迭代器块内发生了变化。考虑此代码更类似于问题中的示例:

$c = 0
[1, 2, 3].each |$x| {
  $c = $c + 1
  notice($c)
}

现在代码可以正常编译,但是 Puppet 仍然无法重新分配变量 $c:

$ puppet apply /tmp/foo.pp
Notice: Scope(Class[main]): 1
Notice: Scope(Class[main]): 1
Notice: Scope(Class[main]): 1

这里最好的做法是如 OP 对他们问题的回答所示,并使用每个索引(类似于 Ruby 的 each_with_index,但语法略有不同): ref.

考虑:

$c = 0
[1, 2, 3].each |$i, $x| {
  notice("Index is $i, x is $x")
}

现在我们得到:

Notice: Scope(Class[main]): Index is 0, x is 1
Notice: Scope(Class[main]): Index is 1, x is 2
Notice: Scope(Class[main]): Index is 2, x is 3