Deployment puppet中有迭代器和循环吗?

Deployment puppet中有迭代器和循环吗?,deployment,automation,puppet,Deployment,Automation,Puppet,当我定义(?)资源时,例如为了确保目录结构,是否有可用的循环 就像这样: for X in [app1,app2] do: file { '/opt/app/' + X: ensure => directory, owner => 'root', group => 'root', mode => '0644', } 我有几十个目录,我真的厌倦了在puppet中声明它。。这将需要15 LOC的ba

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

就像这样:

  for X in [app1,app2] do:
    file { '/opt/app/' + X:
      ensure => directory,
      owner  => 'root',
      group  => 'root',
      mode   => '0644',
    }
我有几十个目录,我真的厌倦了在puppet中声明它。。这将需要15 LOC的bash


有什么想法吗

旧版本的puppet语言不支持循环

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

$b = '/opt/app'
file { [ "$b/app1", "$b/app2" ]:
  ensure => directory,
  owner  => 'root',
  group  => 'root',
  mode   => 0644,
}
您还可以通过在每个资源末尾加一个
,用不同的参数声明相同类型的多个资源
,它比重复
文件
{
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;
}
在文件的特定情况下,可以设置源并使用递归:

file { "/opt/app":
  source => "puppet:///appsmodule/appsdir",
  recurse => true;
}
(这将需要具有该目录结构的源,以便puppet用作源)

您可以多次重复使用部分参数:

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可用,它具有您可能要求的所有循环功能:(然而,我从未使用过它)。在Puppet 3.2中,他们引入了一些功能,但是这些功能可能会在以后的版本中更改或消失。

是的。“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.2版的3版开始的

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

声明多个已定义类型的另一个选项是。向其传递散列:

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最新版本的“未来解析器”),Puppet DSL的迭代函数在形式和功能上与Ruby数组和哈希的某些方法类似:

  • -为数组或散列的每个元素计算代码块(正式称为lambda)
  • -将lambda应用于数组或哈希的每个元素,并返回lambda计算为true的数组或哈希
  • -将lambda应用于数组或哈希的每个元素,并返回结果数组
  • -将lambda应用于数组或哈希的每个元素,以建立一个结果,并返回该结果
在C语言或Java语言中没有索引的
for
循环,但是您可以与上面的任何函数组合,以在数据结构的子集上实现迭代。在C或Java
while
循环中没有不确定的迭代


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

谢谢!如何使其工作:文件{[X,Y]:sure=link,target=>[X1+X,Y1+Y]}?您可以使用define。在我的回答中添加了一个例子注:最近(2013年春季/夏季),循环和迭代器被添加到语言中。each()解决方案是我迄今为止看到的唯一解决这个问题的真正解决方案。@markus同意,但公平地说,我不确定在2011年最初提出这个问题时它是否可用。现在lambda已经可用了,希望这一点能够达到问题的顶部,这样人们就不会浪费时间。如果您正在使用
puppet-apply
请确保启用未来解析器
puppet-apply--parser=future
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',
    },  
})