chef instala y actualiza programas desde el origen


Tengo un programa que compilo desde el código fuente. Para esto estoy usando el recurso script. ¿Cuál es una buena manera de implementar la lógica para la instalación y actualización? Ahora mismo solo tengo la instalación implementada con el condicional incorporado not_if.

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
Author: m33lky, 2011-12-16

1 answers

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

El método que usted hace un "./ configure & & make & & make install " style installation script idempotent depende del tipo de software con el que esté trabajando. Muy a menudo, es suficiente para comprobar la existencia del archivo de destino. A veces, es deseable determinar qué versión se requiere, y qué versión el programa de salida cuando se ejecuta con la opción de línea de comandos adecuada. Usaré el recurso anterior como punto de partida para estos ejemplos. Tenga en cuenta que puede usar bash como un atajo para script recursos que tienen interpreter bash.

Suposiciones: El programa se instala en /usr/local/bin/program y toma un argumento --version presumiblemente para mostrar la versión numero. Pongo los comandos cd, configure y make junto con && porque presumiblemente si uno falla no deberíamos intentar continuar 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í solo. Tenga en cuenta que se agrega el parámetro checksum, con el valor como atributo. Este parámetro indica a 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 verificación SHA256. Además, este recurso notificará al script para que se ejecute inmediatamente, así que después de que se descargue. El script se establece con action :nothing por lo que solo se ejecuta si se descarga el archivo remote_file.

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

También, /tmp puede ser borrado en su sistema al reiniciar. Se recomienda descargar a otra ubicación que no se elimine, como la ubicación de caché de archivos de 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 recetas "fuente" en varios libros de cocina compartidos por Opscode aquí: http://github.com/opscode/cookbooks. php, python, gnu_parallel, y nagios todos los libros de cocina tienen recetas "fuente".

 68
Author: jtimberman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-19 21:09:43