2013-02-13 30 views
26

Tôi có 7 tệp và 1 cuộc chiến. Tôi cần thay đổi giá trị khi triển khai chúng. Tôi có điều này:Làm cách nào để thay đổi tệp bằng Đầu bếp?

##usuario 
#alfresco.user=***** 
alfresco.user=******** 
##pass 
#alfresco.password= sfsfs 
alfresco.password=sfgsf 

alfresco.rutaAnexos=/gthtfdh/dfgdf/cm: 

#atributo.type.anexo=ANEXO_INFO_OBJETO 
atributo.type.anexo=AN 
atributo.type.observaciones=OBSERVACIONES 

Tôi cần phải nhận xét một số dòng và bỏ ghi chú một số dòng khác. Sau đó, tôi cần tạo bảy mẫu và đặt các biến tùy thuộc vào môi trường và tạo một tệp trong công thức.

Làm thế nào tôi có thể làm điều này?

+2

Xem http://docs.opscode.com/essentials_cookbook_templates.html và http://docs.opscode.com/resource_template.html, cách mẫu hoạt động. – StephenKing

Trả lời

0

Theo thiết kế, bạn không sửa đổi tệp bằng Đầu bếp. Thay vào đó, bạn đặt trình giữ chỗ (<%= ..%>) vào các mẫu tệp, sau đó được thay thế bằng các giá trị động (được gọi là thuộc tính).

+7

Điều gì xảy ra nếu tệp cũng được phần mềm khác chỉnh sửa? Các mẫu là rất tốt, nhưng cũng cần phải chỉnh sửa các tệp (thậm chí ansible có mô-đun lineinfile). – neutrinus

+0

Sau đó xem câu trả lời bên dưới. – StephenKing

67

Đầu bếp thực sự cho phép và sử dụng tính năng này. Bạn có thể tìm thấy một ví dụ trong của Opscode

cookbooks/chef-server/recipes/default.rb:

ruby_block "ensure node can resolve API FQDN" do 
    block do 
    fe = Chef::Util::FileEdit.new("/etc/hosts") 
    fe.insert_line_if_no_match(/#{node['chef-server']['api_fqdn']}/, 
           "127.0.0.1 #{node['chef-server']['api_fqdn']}") 
    fe.write_file 
    end 
    not_if { Resolv.getaddress(node['chef-server']['api_fqdn']) rescue false } 
end 

Dưới đây là việc sử dụng hợp cụ thể. Sau khi cài đặt từ nguồn tôi đã phải bỏ ghi chú dòng trong một số tập tin cấu hình được tạo ra mà đã không được như nhau trong tất cả các phiên bản của phần mềm, do đó sử dụng các mẫu đã không được thích hợp. Các phương pháp tôi sử dụng là:

  • (Object) search_file_replace (regex, thay thế)
  • (Object) search_file_replace_line (regex, newline)

Bạn có thể tìm thấy những tài liệu hướng dẫn đầy đủ ở đây:

ĐỂ STRESS: Phương pháp này chỉ được sử dụng khi sử dụng các mẫu và partials là không phù hợp. Như @StephenKing đã nói, các mẫu là cách phổ biến để làm điều này.

+0

Chắc chắn, bạn có thể làm điều đó theo cách này, nhưng tôi mạnh mẽ cho rằng việc đưa toàn bộ tệp vào vị trí là thực hành tốt nhất so với việc khắc phục chúng. Tôi đoán bạn thấy nó khi bạn so sánh mã của bạn với việc sử dụng một tài nguyên mẫu. – StephenKing

+0

@StephenKing nếu có, tôi muốn bạn trả lời câu hỏi của tôi: Nếu bạn có 7 phiên bản phần mềm, mỗi phiên bản có sự khác biệt về tệp cấu hình và trong tệp đó, bạn phải đặt một số cấu hình cốt lõi không bao giờ thay đổi bạn đặt 7 tệp trong mẫu? Hoặc bạn sẽ sử dụng phương pháp này để uncomment 3 dòng mã, và làm cho cookbook đầu bếp của bạn phổ quát? – Konzula

+1

@StephenKing, nếu bạn có một số cách mà tôi chưa từng nghĩ đến, vui lòng cung cấp ở đây. Tôi nghĩ rằng kiểu tranh luận này sẽ mang lại lợi ích cho toàn bộ chủ đề. Bên cạnh đó, tôi đồng ý, phương pháp mà tôi đã cung cấp nên được sử dụng cẩn thận và chỉ trong trường hợp nhu cầu không thể tránh khỏi. – Konzula

16

Dưới đây là ví dụ về cách bạn có thể sử dụng Chef để bỏ ghi chú dòng trong tệp cấu hình. ruby_block được bảo vệ bằng ::File::grep. Bài kiểm tra cho Debian chỉ là để giải trí.

pam_config = "/etc/pam.d/su" 
commented_limits = /^#\s+(session\s+\w+\s+pam_limits\.so)\b/m 

ruby_block "add pam_limits to su" do 
    block do 
    sed = Chef::Util::FileEdit.new(pam_config) 
    sed.search_file_replace(commented_limits, '\1') 
    sed.write_file 
    end 
    only_if { ::File.readlines(pam_config).grep(commented_limits).any? } 
end if platform_family?('debian') 
+0

chỉ là những gì tôi muốn! – brauliobo

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