software programming pricing learn language docs automate ruby deployment chef

ruby - programming - chef instale y actualice programas desde la fuente



docs chef io (1)

Tengo un programa que construyo desde la fuente. Para esto estoy usando el recurso de script . ¿Cuál es una buena manera de implementar la lógica de instalación y actualización? En este momento solo tengo la instalación implementada con el built-in not_if condicional.

script "install_program" do not_if {File.exists?(''/program'')} interpreter "bash" user "root" cwd "/tmp" code <<-EOH wget http://www.example.com/program.tar.gz tar -zxf program.tar.gz cd tarball ./configure make make install EOH end


Primero y ante todo, si tiene los medios para alojar un repositorio interno de paquetes, generalmente recomiendo que cree paquetes nativos para su (s) plataforma (s) de destino, y use el recurso de package para administrarlos, en lugar de compilar desde el origen. Sé que no siempre está disponible o es factible, así que ...

El método con el que crea un script de instalación de estilo "./configure && make && make install" depende del tipo de software con el que esté trabajando. En la mayoría de los casos, es suficiente verificar la existencia del archivo de destino. Algunas veces, es deseable determinar qué versión se requiere y qué versión emitirá el programa cuando se ejecute con la opción de línea de comando adecuada. Utilizaré su recurso anterior como punto de partida para estos ejemplos. Tenga en cuenta que puede usar bash como acceso directo para los recursos de script que tienen intérprete bash .

Suposiciones: El programa se instala en /usr/local/bin/program y toma un argumento --version presumiblemente para mostrar el número de versión. Pongo el cd, configuro y hago comandos junto con && porque presumiblemente si falla uno no deberíamos intentar continuar con la ejecución.

bash "install_program" do not_if "/usr/local/bin/program --version | grep -q ''#{node[:program][:version]}''" user "root" cwd "/tmp" code <<-EOH wget http://www.example.com/program-#{node[:program][:version]}.tar.gz -O /tmp/program-#{node[:program][:version]}.tar.gz tar -zxf program-#{node[:program][:version]}.tar.gz (cd program-#{node[:program][:version]}/ && ./configure && make && make install) EOH end

En lugar de usar wget , es un poco mejor usar el recurso remote_file ya que es idempotente por sí mismo. Tenga en cuenta que se agrega el parámetro de checksum , con el valor como atributo. Este parámetro le dice al Chef que no descargue el archivo remoto si el archivo de destino local coincide con la suma de comprobación. Esta es una suma de comprobación SHA256. Además, este recurso notificará al script que se ejecute inmediatamente, por lo tanto, luego de que se descargue. El script se establece con la acción :nothing por lo que solo se ejecuta si se descarga el archivo remoto.

remote_file "/tmp/program-#{node[:program][:version]}.tar.gz" do source "http://www.example.com/program-#{node[:program][:version]}.tar.gz" checksum node[:program][:checksum] notifies :run, "bash[install_program]", :immediately end bash "install_program" do user "root" cwd "/tmp" code <<-EOH tar -zxf program-#{node[:program][:version]}.tar.gz (cd program-#{node[:program][:version]}/ && ./configure && make && make install) EOH action :nothing end

Además, /tmp puede borrarse en su sistema al reiniciar. Se recomienda descargar a otra ubicación que no se elimine, como la ubicación del caché de archivos del Chef, que es el valor de Chef::Config[:file_cache_path] . Por ejemplo:

remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do ... end

Para obtener más ejemplos, puede ver las recetas de "origen" en varios libros de cocina compartidos por Opscode aquí: http://github.com/opscode/cookbooks . php libros de cocina php , python , gnu_parallel y nagios tienen recetas "fuente".