如何在Puppet中迭代数组

如何在Puppet中迭代数组,puppet,Puppet,我想迭代存储为Facter事实的数组,并为数组的每个元素创建一个新的系统用户和一个目录,最后对AWS进行API调用 事实示例:my_env=>[shared1,shared2,shared3] 如何在Puppet中迭代数组?这可能有效,具体取决于您正在执行的操作 #假设事实my_env=>[shared1,shared2,shared3] 定义我的资源{ 文件“{”/var/tmp/$name”: 确保=>目录, 模式=>'0600', } 用户{$name: 确保=>存在, } } 我的资源{

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

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


如何在Puppet中迭代数组?

这可能有效,具体取决于您正在执行的操作

#假设事实my_env=>[shared1,shared2,shared3]
定义我的资源{
文件“{”/var/tmp/$name”:
确保=>目录,
模式=>'0600',
}
用户{$name:
确保=>存在,
}
}
我的资源{$my_env:}
如果您的需求很简单,它就会工作,如果不简单,Puppet会让这很难做到。傀儡开发人员对迭代有着非理性的偏见,因为他们对声明性语言的工作方式存在误解

如果这种资源不适合您,那么您可以更好地了解要从阵列中设置哪些资源属性

编辑:


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

布鲁斯的答案可能是目前最好的,但有一个正在进行的puppetlabs的armatures过程,以便将来可能实现。

从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

这些新功能可以通过以下方式启用:

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

希望对您有所帮助

puppet中有一个“create_resources()”函数。从最新的Puppet(6.4.2)开始,在迭代ITME列表时,这将非常有帮助,并且由于Puppet 4,通过以下几种方式支持对数组的迭代:

$my_arr=['foo','bar','baz']
每个功能:

$my|u arr.each |$v|{
通知($v)
}
每个函数的可选语法:

每个($my|arr)|$v |{
通知($v)
}
获取索引:

将第二个参数传递给每个

$my|u arr.each |$i,$v |{
注意(“索引:$i,值:$v”)
}
与Ruby的比较:

请注意,此语法受Ruby启发,但略有不同,并排显示这两种语法非常有用,以避免混淆。Ruby将允许:

my_arr.each do|v|
公告(五)
结束
或:

my_arr.each{v|
公告(五)
}
其他迭代函数:

请注意,Puppet提供了许多其他迭代函数:

  • -多次重复代码块,每次使用一组值提供不同的参数

  • -使用集合中的值组作为参数,多次重复代码块

  • -使用代码块通过删除不匹配的元素来转换数据结构

  • -使用代码块转换数据结构中的每个值

  • -通过组合来自提供的数据结构的值,使用代码块创建新值或数据结构

  • -对代码块求值一次,将其隔离在自己的局部范围内。它不迭代,但与迭代函数有一系列相似之处

傀儡3及更早版本:

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

定义我的类型{
通知(姓名)
}
my_type{$my_arr:}

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

这可能会有所帮助:谢谢,我看到了,但正如文档中所说的,我的更改甚至可能在将来被放弃。我将等待下一个稳定版本在生产服务器上上线。现在它的答案仍然是最好的。这是标准的,因为puppet 4.0.0以及其他迭代函数映射、减少、过滤、反转和其他几个。这个例子使用什么版本的puppet?它应该与任何2.x或3.x版本的puppet一起工作。为了清楚起见,我已经添加了一条注释,以防您认为“my_env=>[]”位是代码的一部分,而不是代码的一部分(只是对原始问题的引用)。啊,好吧,我误解了这个问题。我只想将一个参数数组传递给define,这样我就可以从一个数组中提供各种vhost。@brianG,因为值的使用方式不同。它用于创建特定命名的文件。Puppet中的标题是符号名称,可以使依赖项和收集器更容易(或更直观)使用。这是一个具体的用法,名称更合适。更改puppet资源的标题不会改变对系统所做的实际更改,在创建定义的类型时,您应该记住这一点。这是puppet 4.0.0之前的迭代方式-请参阅下面Chris Rut对modern puppet的回答。如果您使用的是puppet Enterprise,该功能可能不可用,但情况可能会发生变化。这是Puppet讲师在那周告诉我们的关于parser=OSS和Enterprise之间未来的差异的内容