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

问题描述 投票:35回答:4

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

像那样:

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

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

有任何想法吗?

deployment automation puppet
4个回答
40
投票

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

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

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

您还可以通过使用;结束每个资源来声明具有不同参数的相同类型的许多资源,这比重复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;
}

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

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

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

你可以define a new resource type多次重用一部分参数:

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,它具有你可以要求的所有循环功能:http://www.puppetlabs.com/blog/ruby-dsl/(但我从未使用它)。在Puppet 3.2中,他们引入了一些experimental loops,但是这些功能可能会在以后的版本中发生变化或消失。


25
投票

从版本3.2开始,有lambdas

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

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

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

4
投票

从Puppet 4(以及Puppet 3的后期版本的“未来解析器”)开始,Puppet DSL的形式和功能类似于Ruby数组和哈希的一些方法:

  • each - 为数组或散列的每个元素计算一个代码块(正式地,一个lambda)
  • filter - 将lambda应用于数组或散列的每个元素,并返回lambda评估为true的数组或散列
  • map - 将lambda应用于数组或散列的每个元素,并返回结果数组
  • reduce - 将lambda应用于数组或散列的每个元素以构建单个结果,它返回

沿着C或Java的行没有索引的for循环,但是你可以将array sectioning与上面的任何函数结合起来,以实现对数据结构子集的迭代。沿着C或Java while循环没有无限次迭代。

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


2
投票

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

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

类和节点也可以以类似的方式定义。但请注意,此功能是自版本3以来的deprecated

© www.soinside.com 2019 - 2024. All rights reserved.