通过puppet清单中的每个块迭代时使用计数器

时间:2018-02-07 13:31:30

标签: puppet

我有一个名为$ 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有关,但我不知道如何解决这个困境

2 个答案:

答案 0 :(得分:1)

我使用$ 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}",
     }
  }

答案 1 :(得分:1)

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

我想补充一点,这里的问题是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的变量因此不变“#34; ;他们是不变的。

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

$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