傀儡中有迭代器和循环吗?

use*_*720 35 deployment automation puppet

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

像那样:

  for X in [app1,app2] do:
    file { '/opt/app/' + X:
      ensure => directory,
      owner  => 'root',
      group  => 'root',
      mode   => '0644',
    }
Run Code Online (Sandbox Code Playgroud)

我有几十个目录,我真的厌倦了在木偶中宣布它...它需要15 LOC的bash.

有任何想法吗?

fre*_*eit 40

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

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

$b = '/opt/app'
file { [ "$b/app1", "$b/app2" ]:
  ensure => directory,
  owner  => 'root',
  group  => 'root',
  mode   => 0644,
}
Run Code Online (Sandbox Code Playgroud)

您还可以通过终止与每个资源申报同一类型的不同则params的很多资源;,这比重复更紧凑一点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;
}
Run Code Online (Sandbox Code Playgroud)

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

file { "/opt/app":
  source => "puppet:///appsmodule/appsdir",
  recurse => true;
}
Run Code Online (Sandbox Code Playgroud)

(这需要具有该目录结构的源,以便将puppet用作源)

您可以定义新的资源类型以多次重用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"]: } 
Run Code Online (Sandbox Code Playgroud)

从Puppet 2.6开始,有一个可用的Ruby DSL,它具有你可以要求的所有循环功能:http://www.puppetlabs.com/blog/ruby-dsl/(但我从未使用它).在Puppet 3.2中,他们引入了一些实验循环,但是这些功能可能会在以后的版本中发生变化或消失.

  • 注意:最近(2013年春/夏),循环和迭代器已添加到该语言中. (2认同)

qui*_*tin 25

从版本3.2开始,有lambdas

你必须parser = futurepuppet.conf中设置.

$a = [1,2,3]
each($a) |$value| { notice $value }
Run Code Online (Sandbox Code Playgroud)

声明多个已定义类型的另一个选项是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',
    },  
})
Run Code Online (Sandbox Code Playgroud)

  • 每个()解决方案是迄今为止我见过的唯一真正的解决方案. (5认同)
  • 如果你正在使用`puppet apply`,请确保启用未来的解析器`puppet apply --parser = future` (4认同)