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

像那样:

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

我有几十个目录,用木偶声明它真的很累。这将花费15 LOC bash。

有任何想法吗?

最佳答案

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

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

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

您还可以通过用;结束每个资源来声明许多具有不同参数的相同类型的资源,这比重复file以及{}更为紧凑:
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,但是这些功能可能会在以后的版本中更改或消失。

关于deployment - puppet 中有迭代器和循环吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6399922/

10-13 05:37