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