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".