¿Cómo puedo cambiar un archivo con Chef?

Tengo 7 archivos y 1 guerra. Necesito cambiar los valores cuando los despliegue. Tengo esto:

##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 

Necesito comentar algunas líneas y descomentar algunas otras líneas. Entonces necesito hacer siete plantillas y poner variables dependiendo de los entornos y crear un archivo en la receta.

¿Cómo puedo hacer esto?

Por diseño, no modifica los archivos con Chef. En su lugar, coloca marcadores de posición ( <%= ..%> ) en las plantillas de archivos, que luego se reemplazan con los valores dynamics (llamados atributos).

Chef realmente permite y usa esto. Puedes encontrar un ejemplo en el 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 

Aquí está el caso de uso. Después de la instalación desde el origen, tuve que descomentar las líneas en algún archivo de configuración creado que no había sido el mismo en todas las versiones de software, por lo tanto, el uso de plantillas no fue apropiado. Los métodos que utilicé fueron:

  • (Object) search_file_replace (regex, reemplazar)
  • (Object) search_file_replace_line (regex, nueva línea)

Puede encontrar la documentación completa aquí:

TENER ESFUERZO: Este método se debe usar solo cuando el uso de plantillas y parciales sea inapropiado. Como @StephenKing ya dijo, las plantillas son una forma común de hacer esto.

Aquí hay un ejemplo de cómo puede usar Chef para descomentar una línea en un archivo de configuración. El ruby_block está protegido con ::File::grep . La prueba para Debian es solo por diversión.

 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')