2011-06-19 57 views
35

Khi tôi xác định (?) Một tài nguyên, ví dụ: để đảm bảo cấu trúc thư mục, có bất kỳ vòng lặp nào có sẵn không?có vòng lặp và vòng lặp trong con rối không?

Giống như rằng:

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

Tôi có hàng chục thư mục và tôi thực sự mệt mỏi với việc kê khai nó trong con rối .. Nó sẽ mất 15 LỘC của bash.

Bất kỳ ý tưởng nào?

Trả lời

40

Trong ngôn ngữ con rối, không có vòng lặp nào.

Nhưng bạn có thể sử dụng một mảng thay vì một chuỗi đơn giản cho danh hiệu và tuyên bố nhiều nguồn lực cùng một lúc với params cùng:

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

Bạn cũng có thể tuyên bố nhiều tài nguyên cùng loại với nhau params bởi kết thúc mỗi tài nguyên với một ;, đó là nhỏ gọn hơn một chút so với lặp lại những file{ s và } 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; 
} 

trong trường hợp cụ thể của file, bạn có thể thiết lập một nguồn và sử dụng đệ quy:

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

(mà sẽ đòi hỏi phải có một nguồn mà cấu trúc thư mục cho con rối để sử dụng như là nguồn)

Bạn có thể define a new resource type để tái sử dụng một phần param nhiều lần:

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

Bắt đầu với rối 2.6, có một DSL của Ruby có sẵn mà có tất cả các chức năng vòng lặp bạn có thể yêu cầu: http://www.puppetlabs.com/blog/ruby-dsl/ (tôi chưa bao giờ sử dụng nó, tuy nhiên). Trong Puppet 3.2, họ đã giới thiệu một số experimental loops, tuy nhiên những tính năng đó có thể thay đổi hoặc biến mất trong các bản phát hành sau này.

+1

Cảm ơn! làm thế nào để có được điều này làm việc: tập tin {[X, Y]: đảm bảo = liên kết, mục tiêu => [X1 + X, Y1 + Y]}? – user425720

+1

Bạn có thể sử dụng một định nghĩa. Đã thêm một ví dụ vào câu trả lời của tôi – freiheit

+0

aah, hoàn hảo. Cảm ơn! – user425720

2

Có. "Ruby DSL" có thể giúp đỡ, chỉ cần sử dụng phần mở rộng tập tin "rb" thay vì "pp" trong biểu hiện và bạn có thể xác định con rối 'loại' như thế này:

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

Lớp học và các nút cũng có thể được xác định trong tương tự đường. Tuy nhiên lưu ý rằng tính năng này là deprecated kể từ khi phát hành 3

25

Tính đến phiên bản 3.2 có lambdas

Bạn phải thiết lập parser = future trong puppet.conf.

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

Một tùy chọn khác cho tuyên bố nhiều định nghĩa loạicreate_resources.Vượt qua nó một băm băm:

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

Mỗi() giải pháp là giải pháp thực sự duy nhất cho vấn đề này tôi đã nhìn thấy cho đến nay. – markus

+0

@markus, Đồng ý, tuy nhiên, để công bằng, tôi không chắc chắn nó có sẵn khi câu hỏi này ban đầu được hỏi lại vào năm 2011. Hy vọng điều này bong bóng lên đến đỉnh của câu hỏi này mặc dù để mọi người không lãng phí thời gian, bây giờ _lambdas_ có sẵn. – quickshiftin

+4

Nếu bạn đang sử dụng 'áp dụng con rối', hãy đảm bảo cho phép trình phân tích cú pháp tương lai 'con rối áp dụng --parser = future' – quickshiftin

4

Tính đến Múa rối 4 (và "phân tích cú pháp tương lai" của phiên bản cuối của Múa rối 3) Múa rối DSL có chức năng lặp lại tương tự ở hình thức và chức năng để một số phương pháp của Ruby mảng và băm:

  • each - đánh giá một khối mã (chính thức, một lambda) cho mỗi phần tử của một mảng hoặc băm
  • filter - áp dụng một lambda để mỗi phần tử của một mảng hoặc băm và trả về một mảng hoặc hàm băm của các giá trị lambda được đánh giá là true
  • map - áp dụng lambda cho từng phần tử của mảng hoặc băm và trả về một mảng kết quả
  • reduce - áp dụng lambda cho mỗi phần tử của mảng hoặc băm để tạo ra một kết quả.

không có được lập chỉ mục for vòng dọc theo dòng của C hay Java, nhưng bạn có thể kết hợp với bất kỳ array sectioning các chức năng trên để đạt được lặp đi lặp lại trên một tập hợp con của một cấu trúc dữ liệu. Không có sự lặp lại không xác định dọc theo các dòng của vòng lặp C hoặc Java while.

Tất nhiên, bạn vẫn có thể sử dụng các cách tiếp cận tập trung vào tài nguyên được mô tả trong các câu trả lời khác và đôi khi một trong số đó thực sự là phương pháp tốt nhất có sẵn. Tuy nhiên, bạn không thể sử dụng Ruby DSL nữa; Nó được gỡ bỏ hoàn toàn từ Puppet 4. Trong số các chức năng lặp lại, khả năng xác định các chức năng tùy chỉnh, sự thăng tiến của các phương pháp tập trung vào dữ liệu, và tất cả các tính năng tiêu chuẩn lịch sử của Puppet, Ruby DSL dường như không bị mất nhiều.

Các vấn đề liên quan