我想遍历一个存储为 Facter 事实的数组,并为数组的每个元素创建一个新的系统用户和一个目录,最后对 AWS 进行 API 调用。
事实示例:my_env => [shared1,shared2,shared3]
如何遍历 Puppet 中的数组?
我想遍历一个存储为 Facter 事实的数组,并为数组的每个元素创建一个新的系统用户和一个目录,最后对 AWS 进行 API 调用。
事实示例:my_env => [shared1,shared2,shared3]
如何遍历 Puppet 中的数组?
这可能有效,具体取决于您在做什么
# Assuming fact my_env => [ shared1, shared2, shared3 ]
define my_resource {
file { "/var/tmp/$name":
ensure => directory,
mode => '0600',
}
user { $name:
ensure => present,
}
}
my_resource { $my_env: }
如果您的要求很简单,它将起作用,如果不是,Puppet 使这很难做到。基于对声明式语言如何工作的误解,Puppet 开发人员对迭代有非理性的偏见。
如果这种资源不适合您,也许您可以更好地了解您尝试从数组中设置哪些资源属性?
编辑:
在 Puppet 4 中,这个可悲的缺陷终于得到了修复。此处记录了当前的事态。正如文档所说,您会在许多旧代码中找到上述解决方案的示例。
从 puppet 3.2 开始,这可以使用“未来”解析器,如下所示:
$my_env = [ 'shared1', 'shared2', 'shared3', ]
each($my_env) |$value| {
file { "/var/tmp/$value":
ensure => directory,
mode => 0600,
}
user { $value:
ensure -> present,
}
}
本月初发布的 Puppet 3.7 具有新的 DSL,其中一个功能是迭代,请查看以下 URL https://docs.puppetlabs.com/puppet/latest/reference/experiments_lambdas.html#enabling-lambdas-and-iteration
这些新功能可以通过以下方式启用:
在 puppet.conf 文件中设置 parser = future 或添加命令行开关 --parser=future
希望有帮助
从最新的 Puppet (6.4.2) 开始,从 Puppet 4 开始,数组的迭代通过以下几种方式得到支持:
$my_arr = ['foo', 'bar', 'baz']
每个功能:
$my_arr.each |$v| {
notice($v)
}
每个函数的替代语法:
each($my_arr) |$v| {
notice($v)
}
获取索引:
将第二个参数传递给each
:
$my_arr.each |$i, $v| {
notice("Index: $i, value: $v")
}
与 Ruby 的比较:
请注意,此语法受 Ruby 启发,但略有不同,将两者并排显示以避免混淆很有用。Ruby 将允许:
my_arr.each do |v|
notice(v)
end
或者:
my_arr.each { |v|
notice(v)
}
其他迭代函数:
请注意,Puppet 提供了许多其他迭代函数:
each
- 多次重复一段代码,每次使用一组值提供不同的参数。
slice
- 使用集合中的值组作为参数,多次重复一段代码。
filter
- 使用代码块通过删除不匹配的元素来转换数据结构。
map
- 使用代码块来转换数据结构中的每个值。
reduce
- 使用代码块通过组合来自提供的数据结构的值来创建新值或数据结构。
with
- 评估一次代码块,将其隔离在自己的本地范围内。它不迭代,但与迭代函数具有家族相似性。
Puppet 3 及更早版本:
如果您继承了仍在使用 Puppet 3 的旧代码,则接受的答案仍然正确:
define my_type {
notice($name)
}
my_type { $my_arr: }
但是请注意,这在现代 Puppet 中通常被认为是不好的风格。
itsbruce 的答案可能是目前最好的,但是有一个迭代提案正在通过 puppetlabs 的骨架流程,以便将来可能实施。
puppet 中有一个“create_resources()”函数。在迭代项目列表时这将非常有帮助