2013-05-07 33 views
6

Đây là một ví dụ về công thức làm việc lặp qua một loạt các tên trang web và tạo chúng trong IIS bằng hàm createIisWebsite().Làm thế nào để bạn mô đun hóa một công thức đầu bếp?

def createIisWebsite(websiteName) 
    iis_site websiteName do 
    protocol :http 
    port 80 
    path "#{node['iis']['docroot']}/#{websiteName}" 
    host_header "#{websiteName}.test.kermit.a-aws.co.uk" 
    action [:add,:start] 
    end 
end 
Trong giải pháp thực tế của chúng tôi, dữ liệu này được lưu trữ ở nơi khác và được truy cập qua API web.
websiteNames = ["website-2", "website-3", "website-4"] 

for websiteName in websiteNames do 
    createIisWebsite websiteName 
end 

Bây giờ tôi muốn có thể gọi hàm createIisWebsite() từ nhiều công thức trong Cookbook này.

Tôi đã thử ném nó vào mô-đun trợ giúp (thư viện). Ở đó tôi không thể có được tham chiếu đến iis_site để làm việc.

Tôi đã thử di chuyển hàm sang default.rb và sau đó thực hiện include_recipe ":: mặc định". Điều đó dường như không hoạt động.

tôi nhận được một "Không thể tìm thấy một nguồn lực cho createIisWebsite trên cửa sổ phiên bản 6.2.9200"

Lý do tôi đang dùng phương pháp này là vì tôi muốn có một công thức có chứa danh sách các trang web mỗi cụm máy chủ web . Tôi có cảm giác tôi không dùng con đường thực hành tốt nhất.

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

+0

Ohai! Bạn đã bao giờ tìm ra một cách giải quyết cho vấn đề này chưa? Có bất kỳ câu trả lời nào giúp ích không? Xin đừng quên đánh dấu một cái là đúng :) – sethvargo

Trả lời

5

Vấn đề là chức năng đang được xác định bên trong công thức và chỉ có thể được sử dụng trong công thức đó. Phương thức include_recipe đảm bảo rằng một công thức đã cho được nạp, nhưng nó không nhập bất cứ thứ gì vào công thức làm việc bao gồm.

Vì chức năng của bạn đang được sử dụng để khai báo tài nguyên đầu bếp với một số thông số được tính toán, điều gần nhất để xem xét là Definition (Chef Docs). Các định nghĩa trông giống như Tài nguyên, có một tên và một tập hợp các tham số tùy chọn, nhưng thực sự là các macro đơn giản được mở rộng vào công thức khi nó được biên dịch.

Trong thư mục sách dạy nấu ăn của bạn, tạo definitions/my_iis_website.rb chứa một cái gì đó như:

define :my_iis_website do 
    iis_site websiteName do 
     protocol :http 
     port 80 
     path "#{node['iis']['docroot']}/#{websiteName}" 
     host_header "#{websiteName}.test.kermit.a-aws.co.uk" 
     action [:add,:start] 
    end 
end 

Sau đó, thay thế các vòng lặp trong công thức của bạn với:

for websiteName in websiteNames do 
    my_iis_website websiteName 
end 

Nếu công thức nấu ăn của bạn cho mỗi cụm máy chủ sẽ được giống hệt nhau nhưng đối với danh sách các trang web, bạn có thể cân nhắc lưu trữ dữ liệu này trong attributes hoặc data bags thay thế. Điều này giúp bạn tránh lặp lại chính mình trong công thức nấu ăn của bạn, và cũng sẽ cho phép bạn thêm các trang web mà không cần cập nhật sách dạy nấu ăn của bạn.

+4

Tất nhiên bạn cũng có thể kiểm tra và tạo một LWRP. Đã có một cuộc thảo luận về việc loại bỏ các định nghĩa từ đầu bếp trên danh sách gửi thư đầu bếp. –

+0

Các phân đoạn khác nhau của cộng đồng Chef có ý kiến ​​khác nhau về việc sử dụng Chef. Mặc dù giá trị của Định nghĩa (và Vai trò) đã được tranh luận trong danh sách gửi thư nhiều lần, tôi cũng không biết bất kỳ kế hoạch nào để xóa. Nếu bạn biết nếu không, hãy cho tôi biết! – zts

+0

Cảm ơn, sẽ cung cấp cho một shot này. Để có được những điều làm việc tôi chỉ để lại chức năng trong công thức. Và có, danh sách trang web ở một nơi khác có sẵn qua API web thay vì túi dữ liệu như các hệ thống khác cần truy cập và API web đầu bếp không có lib khách hàng .Net và auth dường như được đặt riêng. – Janaka