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".
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
me gusta esta respuesta – Galen
@jtimberman podría por favor explicar más, donde desde la variable 'program' y' version' se establecen –