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应用于数组或哈希的每个元素,以建立一个结果,并返回该结果
for
循环,但是您可以与上面的任何函数组合,以在数据结构的子集上实现迭代。在C或Javawhile
循环中没有不确定的迭代
当然,您仍然可以使用其他答案中描述的以资源为中心的方法,有时其中一种方法确实是最好的可用方法。但是,您不能再使用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',
},
})