2011-12-16 16 views
35

Tengo un programa que construyo desde la fuente. Para esto estoy usando el recurso 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 condicional not_if incorporado.chef instalar y actualizar programas desde la fuente

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 

Respuesta

67

En primer lugar, si usted tiene los medios para acoger un repositorio de paquetes interna, por lo general recomendamos que se construye paquetes nativos para su plataforma (s) de destino y utilizar el recurso package para gestionarlos, en lugar de construyendo desde la fuente. Sé que no siempre está disponible o viable, así que ...

El método que usted hace un "./configure & & & & hacer make install" idempotente script de instalación de estilo depende del tipo de software que está trabajando con. 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 un acceso directo para los recursos script que tienen el intérprete bash.

Suposiciones: El programa está instalado en /usr/local/bin/program y toma un argumento --version presumiblemente para mostrar el número de versión. Puse el cd, configuro y realizo 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 utilizar wget que es un poco mejor utilizar el recurso remote_file ya que esto es idempotente por su propia cuenta. Tenga en cuenta que se agrega el parámetro 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 podría borrarse en su sistema después del reinicio. 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 más ejemplos, se puede ver recetas "fuente" en varios libros de cocina compartidos por Opscode aquí: http://github.com/opscode/cookbooks. php, python, gnu_parallel y nagios libros de cocina tienen todas las recetas "fuente".

+0

NOTA: Un error con '' archivo_remoto' puede en algún momento '' descomprimir'' un archivo con una extensión '' .gz'', como '' tar.gz''. Entonces '' tar -zxf'' fallará porque no es realmente un gzip. – Evgeny

+1

me gusta esta respuesta – Galen

+0

@jtimberman podría por favor explicar más, donde desde la variable 'program' y' version' se establecen –

Cuestiones relacionadas