傀儡有迭代器和循环吗?

当我定义(?)资源,例如确保目录结构时,是否有可用的循环?

像那样:

for X in [app1,app2] do: file { '/opt/app/' + X: ensure => directory, owner => 'root', group => 'root', mode => '0644', } 

我有几十个目录,我真的很厌烦在puppet中声明它。这将需要15 bash的bash。

有任何想法吗?

在傀儡语言中,没有任何循环。

但是,您可以使用数组而不是简单的string作为标题,并使用相同的参数同时声明几个资源:

 $b = '/opt/app' file { [ "$b/app1", "$b/app2" ]: ensure => directory, owner => 'root', group => 'root', mode => 0644, } 

你也可以用不同的参数声明许多相同types的资源, ,这比重复file{ s和s }要紧凑一些:

 file { [ "$b/app1", "$b/app2" ]: ensure => directory, owner => 'root', group => 'root', mode => 0755; [ "$b/app1/secret", "$b/app2/secret" ]: ensure => directory, owner => 'root', group => 'root', mode => 0700; } 

在文件的特定情况下,您可以设置源并使用recursion:

 file { "/opt/app": source => "puppet:///appsmodule/appsdir", recurse => true; } 

(这将需要有一个傀儡目录结构的来源作为来源)

您可以定义一个新的资源types来重复使用param的一部分:

 define foo { file { "/tmp/app/${title}": ensure => directory, owner => 'root', mode => 0755; "/tmp/otherapp/${title}": ensure => link, target => "/tmp/app/${title}", require => File["/tmp/app/${title}"] } } foo { ["app1", "app2", "app3", "app4"]: } 

从Puppet 2.6开始,有一个可用的Ruby DSL,它可以提供所有需要的循环function: http : //www.puppetlabs.com/blog/ruby-dsl/ (但我从来没有使用过)。 在Puppet 3.2中,他们介绍了一些实验循环 ,但是这些function可能会在以后的版本中改变或消失。

从3.2版开始,就有lambdaexpression式

您必须在puppet.conf中设置parser = future

 $a = [1,2,3] each($a) |$value| { notice $value } 

声明多个定义types的另一个选项是create_resources 。 传递哈希散列:

 create_resources(file, { '/tmp/test1' => { ensure => directory, owner => 'root', group => 'root', mode => '0644', }, '/tmp/test2' => { ensure => directory, owner => 'www-data', group => 'www-data', mode => '0755', }, }) 

从Puppet 4(以及Puppet 3的后期版本的“未来parsing器”)开始,Puppet DSL在forms和function上具有类似于Ruby数组和哈希方法的迭代函数:

  • 每个 – 为数组或散列的每个元素评估一组代码(forms上,lambda)
  • filter – 将lambda应用于数组或散列的每个元素,并返回lambda评估为true的那些数组或散列
  • map – 将lambda应用于数组或散列的每个元素,并返回结果数组
  • reduce – 将一个lambda应用于数组或散列的每个元素以构build一个返回的单个结果

没有沿C或Java的循环索引,但可以将数组切片与上面的任何函数结合起来,以实现对数据结构的子集的迭代。 沿着C或Java while循环的行没有不确定的迭代。

当然,您仍然可以使用其他答案中描述的以资源为中心的方法,有时候其中的一种确实是最好的方法。 然而,你不能再使用Ruby DSL了; 它完全从Puppet 4中删除。在迭代函数中,定义自定义函数的能力,数据中心方法的提升,以及所有Puppet的历史标准function,Ruby DSL似乎没有太多漏洞。

是。 “Ruby DSL”可以提供帮助,只需在清单中使用文件扩展名“.rb”而不是“.pp”,你可以像这样定义puppet“type”:

 define 'myapps::structure', :applist do @applist.each do |app| file( @name+'/'+app, :ensure => directory, :owner => 'root', :group => 'root', :mode => '0644') end end 

类和节点也可以用类似的方式定义。 但请注意,自从发行版本3以来,此function已被弃用