2013-06-02 40 views
10

Tôi đang cố tạo công thức Đầu bếp để nối nhiều dòng (20-30) vào một tệp cấu hình cụ thể.Sử dụng công thức Đầu bếp để nối nhiều dòng vào một tệp cấu hình

Tôi biết mẫu được đề xuất là change entire config files thay vì chỉ thêm vào tệp, nhưng tôi không thích phương pháp này vì nhiều lý do.

Cho đến nay các giải pháp duy nhất tôi thấy là sử dụng một cookbook_file và sau đó sử dụng một nguồn lực bash làm:

cat lines_to_append >> /path/configfile

Rõ ràng điều này sẽ không hoạt động đúng, vì nó muốn nối thêm các tập tin trên và hơn thế, mỗi khi bạn chạy đầu bếp-khách hàng. Tôi phải tạo một tập lệnh bash nhỏ để kiểm tra một chuỗi cụ thể trước, và, nếu không tìm thấy, hãy thêm vào tệp.

Nhưng điều này dường như đánh bại mục đích sử dụng Chef. Phải có cách tốt hơn.

Một giải pháp đầy hứa hẹn là line cookbook từ Cộng đồng OpsCode. Nó nhằm giải quyết vấn đề chính xác này. Thật không may là chức năng không đầy đủ, lỗi và mã chỉ là một hack nhanh. Xa là một giải pháp vững chắc.

Một tùy chọn khác mà tôi đã đánh giá là augeas. Có vẻ khá mạnh mẽ, nhưng nó sẽ thêm một lớp trừu tượng khác vào hệ thống. Overkill, trong trường hợp của tôi.

Vì đây là một trong những nhiệm vụ rõ ràng nhất đối với bất kỳ hệ thống quản trị mạng nào, có giải pháp dễ dàng và đẹp nào với đầu bếp mà tôi không thấy?


EDIT: dưới đây là cách tôi giải quyết nó cho đến nay:

cookbook_file "/tmp/parms_to_append.conf" do 
    source "parms_to_append.conf" 
end 

bash "append_to_config" do 
    user "root" 
    code <<-EOF 
     cat /tmp/parms_to_append.conf >> /etc/config 
     rm /tmp/parms_to_append.conf 
    EOF 
    not_if "grep -q MY_IDENTIFIER /etc/config" 
end 

Nó hoạt động, nhưng không chắc chắn đây là mô hình đầu bếp khuyến khích.

Trả lời

10

Như bạn đã nói, mẫu đầu bếp được đề xuất là quản lý toàn bộ tệp.

Nếu bạn đang sử dụng Chef 11, bạn có thể sử dụng partials cho những gì bạn đang cố gắng đạt được.

Có thêm thông tin here và trên số example cookbook này.

Miễn là bạn có quyền truy cập vào mẫu cấu hình ban đầu, chỉ cần thêm <%= render "original_config.erb" %> vào đầu mẫu parms_to_append.conf của bạn.

8

Như đã nói ở trên, sử dụng mẫu và partials là cách phổ biến để thực hiện việc này, nhưng đầu bếp cho phép thêm tệp và thậm chí thay đổi (chỉnh sửa) dòng tệp.Phụ lục được thực hiện bằng các chức năng sau:

  • insert_line_after_match (regex, newline);
  • insert_line_if_no_match (regex, newline)

Bạn có thể tìm và dụ here trên stackoverflow, và các tài liệu hướng dẫn đầy đủ về rubydoc.info

Vui lòng sử dụng nó một cách thận trọng và chỉ khi partials và các mẫu không phù hợp.

3

tôi đã làm một cái gì đó như thế này:

monit_overwrites/templates/default/monitrc.erb:

#---FLOWDOCK-START 
set mail-format { from: [email protected] } 
#---FLOWDOCK-END 

Trong công thức của tôi, tôi đã làm điều này:

monit_overwrites/công thức nấu ăn/default .rb:

execute "Clean up monitrc from earlier runs" do 
    user "root" 
    command "sed '/#---FLOWDOCK-START/,/#---FLOWDOCK-END/d' > /etc/monitrc" 
end 

template "/tmp/monitrc_append.conf" do 
    source "monitrc_append.erb" 
end 

execute "Setup monit to push notifications into flowdock" do 
    user "root" 
    command "cat /tmp/monitrc_append.conf >> /etc/monitrc" 
end 

execute "Remove monitrc_append" do 
    command "rm /tmp/monitrc_append.conf" 
end 
0

Cách dễ nhất để giải quyết vấn đề này là tạo chuỗi và chuyển nó vào nội dung. Tất nhiên khối bash làm việc ... nhưng tôi nghĩ rằng tài nguyên tập tin là thanh lịch.

lines = "" 
File.open('input file') do |f| 
    f.lines.each do |line| 
     lines = lines + line + "\n" 
    end 
end 
file "file path" do 
    content line 
end 
Các vấn đề liên quan