在遍历人偶清单中的每个块时使用计数器
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
我有一个名为 $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