2011-06-19 39 views
35

當我定義(?)資源時,例如爲了確保目錄結構,有沒有可用的循環?有傀儡的迭代器和循環嗎?

就像是:

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

我有幾十目錄的,我在木偶宣佈它真的累了..這將需要15 LOC的bash。

任何想法?

回答

40

在傀儡語中,沒有沒有循環。

但是你可以在同一時間使用一個數組,而不是一個簡單的字符串爲標題,並宣佈了很多資源,以相同的PARAMS:

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

您也可以聲明同一類型不同的許多資源

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{ S和} S比緊湊一個位結束的每個資源PARAMS文件,你可以設置一個源和使用遞歸:

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

(這將需要具有目錄結構的源傀儡作爲源使用)

可以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"]: } 

木偶2.6開始,有一個Ruby DSL提供具有所有功能循環,你可以問:http://www.puppetlabs.com/blog/ruby-dsl/(我從來沒有使用過它,不過)。在Puppet 3.2中,他們引入了一些experimental loops,但是這些功能可能會在更高版本中更改或消失。

+1

謝謝!如何得到這個工作:file {[X,Y]:ensure = link,target => [X1 + X,Y1 + Y]}? – user425720

+1

你可以使用一個定義。給我的回答添加了一個例子 – freiheit

+0

啊,完美。謝謝! – user425720

2

是的。 「紅寶石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 

類和節點還可以在類似的定義辦法。但是請注意,此功能deprecated自發布3

25

隨着3.2版本有lambdas

您必須設置parser = futurepuppet.conf

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

用於聲明多個定義類型是​​另一種選擇。它傳遞哈希散列:

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', 
    }, 
}) 
+5

each()解決方案是迄今爲止我看到的唯一真正的解決方案。 – markus

+0

@markus,但是,同意,但是,公平起見,我不確定這個問題最初是在2011年問過的時候是否可用。希望這個問題能夠浮出水面,但現在人們不會浪費時間,現在_lambdas_可用。 – quickshiftin

+4

如果您使用'puppet apply',請確保啓用將來的解析器'puppet apply --parser = future' – quickshiftin

4

由於木偶4(和木偶3的後期版本的「未來分析器」)的木偶DSL在形式和功能相似的一些紅寶石的方法迭代函數數組和哈希:

  • each - 測定爲一個數組或哈希
  • filter的各要素的代碼塊(正式地說,一個拉姆達) - 施加拉姆達到陣列或散列的每個元素,並返回一個數組或哈希值爲真的
  • map - 施加拉姆達到陣列或散列的每個元素,並返回結果
  • reduce的陣列 - 的λ應用於陣列或散列的每個元素,以建立一個單一的結果,將其返回

有沿C'S或Java的的線沒有索引for循環,但是你可以用任何的上述功能組合array sectioning在數據結構的一個子集來實​​現迭代。沿C或Java循環的行不存在無限循環。

當然,您仍然可以使用其他答案中描述的以資源爲中心的方法,有時候其中一種方法確實是最好的方法。然而,你不能再使用Ruby DSL了;它完全從Puppet 4中刪除。在迭代函數中,定義自定義函數的能力,以數據爲中心的方法被提升爲有利,以及所有Puppet的歷史標準功能,Ruby DSL似乎沒有太多漏洞。