Ответ 1
Прежде всего, если у вас есть средство для размещения внутреннего репозитория пакетов, я обычно рекомендую вам создавать собственные пакеты для вашей целевой платформы (ов) и использовать ресурс package
для управления ими, а не для создания из источник. Я знаю, что это не всегда доступно или возможно, поэтому...
Метод, с помощью которого вы создаете "./configure & make && make install" style install script idempotent, зависит от типа программного обеспечения, с которым вы работаете. Чаще всего достаточно проверить наличие целевого файла. Иногда желательно определить, какая версия требуется, и какую версию программа выведет при выполнении с соответствующей опцией командной строки. Я буду использовать ваш ресурс выше как отправную точку для этих примеров. Обратите внимание, что вы можете использовать bash
как ярлык для ресурсов script
, у которых есть интерпретатор bash
.
Предположения: программа установлена на /usr/local/bin/program
и принимает аргумент --version
, предположительно, для отображения номера версии. Я добавляю команды cd, configure и make вместе с &&
, потому что, предположительно, если не удается, мы не должны пытаться продолжить выполнение.
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
Вместо использования wget
немного лучше использовать ресурс remote_file
, так как он сам является идемпотентом. Обратите внимание, что добавлен параметр checksum
со значением как атрибутом. Этот параметр указывает Chef не загружать удаленный файл, если локальный целевой файл соответствует контрольной сумме. Это контрольная сумма SHA256. Кроме того, этот ресурс будет уведомлять script для немедленного запуска, поэтому после его загрузки. script устанавливается с действием :nothing
, поэтому он запускается только при загрузке файла 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
Кроме того, /tmp
может быть стерта в вашей системе при перезагрузке. Рекомендуется загружаться в другое место, которое не удаляется, например, местоположение кэша файла шеф-повара, которое является значением Chef::Config[:file_cache_path]
. Например:
remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do
...
end
В качестве дополнительных примеров вы можете увидеть "исходные" рецепты в нескольких кулинарных книгах, разделяемых Opscode здесь: http://github.com/opscode/cookbooks. php
, python
, gnu_parallel
и nagios
кулинарные книги имеют "исходные" рецепты.