如何在Puppet中迭代数组

时间:2012-10-18 15:23:16

标签: puppet configuration-management

我想迭代一个存储为Facter事实的数组,并为数组的每个元素创建一个新的系统用户和一个目录,最后对AWS进行API调用。

事实的例子:my_env => [shared1,shared2,shared3]

我的问题是如何在木偶中迭代一个数组?

我已经尝试过Ruby DSL,但还没有成功让它工作......谢谢!

6 个答案:

答案 0 :(得分:70)

这可能有效,取决于你在做什么

// Assuming fact my_env => [ shared1, shared2, shared3 ]

define myResource {
  file { "/var/tmp/$name":
    ensure => directory,
    mode   => 0600,
  }
  user { $name:
    ensure => present,
  }
}
myResource { $my_env: }

如果您的要求很简单,它会起作用,如果没有,Puppet很难做到这一点。基于对声明性语言如何工作的误解,Puppet开发人员对迭代有不合理的偏见。

如果此类资源不适合您,或许您可以更好地了解您尝试从阵列中设置哪些资源属性?

修改

随着Puppet 4,这个可悲的缺陷终于被修复了。目前的事态记录here。正如文档所述,您将在许多旧代码中找到上述解决方案的示例。

答案 1 :(得分:20)

从puppet 3.2开始,可以使用“future”解析器,如下所示:

$my_env = [ 'shared1', 'shared2', 'shared3', ]
each($my_env) |$value| {
  file { "/var/tmp/$value":
    ensure => directory,
    mode => 0600,
  }
  user { $value:
    ensure -> present,
  }
}

另请参阅:http://docs.puppetlabs.com/puppet/3/reference/lang_experimental_3_2.html#background-the-puppet-future-parser

答案 2 :(得分:3)

本月早些时候发布的Puppet 3.7有新的DSL,其中一个功能是迭代,请检查以下网址https://docs.puppetlabs.com/puppet/latest/reference/experiments_lambdas.html#enabling-lambdas-and-iteration

可以使用以下命令启用这些新功能:

在puppet.conf文件中设置parser = future 或添加命令行开关--parser = future

希望有所帮助

答案 3 :(得分:1)

itsbruce的答案可能是目前最好的答案,但是有一个iteration proposal正在通过puppetlabs的电枢程序,以便将来可能实施。

答案 4 :(得分:0)

puppet中有一个“create_resources()”函数。迭代itmes列表时,这将非常有用

答案 5 :(得分:0)

自最新的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-对代码块进行一次评估,将其隔离在自己的本地范围内。它不会进行迭代,但是与迭代函数有相似之处。

人偶3及更早版本:

如果您仍然使用Puppet 3继承了旧代码,则接受的答案仍然正确:

define my_type {
  notice($name)
}

my_type { $my_arr: }

但是请注意,这在现代人偶中通常被认为是不好的风格。