当我定义(?)资源时为了确保目录结构,是否有可用的循环?
像那样:
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/