2011-06-19 16 views
35

Kiedy definiuję (?) Zasób, np. aby zapewnić strukturę dir, czy są dostępne jakieś pętle?Czy istnieją Iteratory i pętle w lalce?

tak:

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

mam dziesiątki katalogów i jestem naprawdę zmęczony z deklarowania go w lalek .. zajęłoby 15 LOC bash.

Wszelkie pomysły?

Odpowiedz

40

W języku lalkarskim nie ma żadnych pętli.

Ale można użyć tablicę zamiast prostego łańcucha o tytuł i zadeklarować kilka zasobów jednocześnie z tych samych params:

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

Można również zadeklarować wiele zasobów tego samego typu z różnymi params kończąc każdy zasób z ;, który jest nieco bardziej zwarty niż powtarzając file i { S i } 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; 
} 

w konkretnym przypadku Pliki można ustawić źródło i użyć rekurencji:

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

(które wymagałoby o źródło tej struktury katalogów dla lalek użyć jako źródła)

Można define a new resource type do ponownego użycia części param wielokrotnie:

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

Począwszy Puppet 2.6, jest dostępny Ruby DSL, które posiada wszystkie funkcje pętli można zapytać: http://www.puppetlabs.com/blog/ruby-dsl/ (nigdy nie używałem go, jednak). W Puppet 3.2, wprowadzono niektóre experimental loops, jednak te funkcje mogą się zmienić lub odejść w późniejszych wydaniach.

+1

Dzięki! jak to działa: plik {[X, Y]: zapewnić = link, cel => [X1 + X, Y1 + Y]}? – user425720

+1

Można użyć definicji. Dodano przykład do mojej odpowiedzi – freiheit

+0

aah, idealnie. Dzięki! – user425720

2

Tak. „Ruby DSL” może pomóc, wystarczy użyć rozszerzenie „.rb” zamiast „.PP” w oczywisty i można zdefiniować lalkowy «typ» tak:

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

Klasy i węzły mogą również zostać zdefiniowane w podobny droga. Zauważ jednak, że ta funkcja jest deprecated od wydania 3

25

Począwszy od wersji 3.2 istnieje lambdas

Musisz ustawić parser = future w puppet.conf.

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

Inną opcją dla deklarowania wielu zdefiniowane typy jest create_resources.Przekazać ją hash mieszań:

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

Rozwiązanie każdego() jest jedynym rzeczywistym rozwiązaniem tego problemu, który do tej pory widziałem. – markus

+0

@markus, Uzgodniono jednak, że mam rację, nie jestem pewien, czy był on dostępny, kiedy pytanie to zostało pierwotnie zadane w 2011 roku. Mając nadzieję, że to bańki do góry na to pytanie, więc ludzie nie tracą czasu, teraz że _lambdas_ są dostępne. – quickshiftin

+4

Jeśli używasz 'kukła aplikuj' upewnij się, aby włączyć przyszły analizator składni' lalek zastosuj --parser = future' – quickshiftin

4

Od Lalek 4 (i „Future parser” późnych wersjach Lalek 3) Lalki DSL posiada funkcje iteracji podobne w formie i funkcji, aby niektóre z metod Ruby macierze i skróty:

  • each - przetwarza blok kodu (formalnie lambda) dla każdego elementu macierzy lub mieszania
  • filter - zastosowanie lambda do każdego elementu macierzy lub mieszania i zwraca tablica lub hash tych, dla których lambda została oceniona jako prawdziwa
  • map - zastosowanie lambda do każdego elementu macierzy lub mieszania i zwraca tablicę wyników
  • reduce - zastosowanie lambda do każdego elementu macierzy lub mieszania, aby tworzyć pojedynczy wynik, który powraca

nie ma indeksowane for pętli wzdłuż linii C na lub Java, ale można połączyć array sectioning z dowolnej funkcji w celu osiągnięcia powyższych iteracji nad podzbioru struktury danych. Nie ma nieskończonej iteracji na linii pętli C lub Java while.

Oczywiście nadal można stosować podejście oparte na zasobach opisane w innych odpowiedziach, a czasami jedno z nich jest rzeczywiście najlepszym dostępnym podejściem. Nie możesz już jednak używać Ruby DSL; jest całkowicie usunięty z Puppet 4. Wśród funkcji iteracyjnych, możliwość definiowania funkcji niestandardowych, wznoszenie się zorientowanych na dane podejście do korzyści i wszystkie historyczne funkcje standardowe Puppet, Ruby DSL wydaje się nie tęsknić.