Прежде всего, если у вас есть средства для размещения внутреннего репозитория пакетов, я обычно рекомендую создавать собственные пакеты для вашей целевой платформы (платформ) и использовать ресурс package
для управления ими, а не собирать изисточник.Я знаю, что это не всегда доступно или выполнимо, поэтому ...
Способ, которым вы создаете идемпотентный сценарий установки в стиле "./configure && make && make install", зависит от типа программного обеспечения, с которым вы работаетес.Чаще всего достаточно проверить наличие целевого файла.Иногда желательно определить, какая версия требуется, и какую версию программа выведет при запуске с соответствующей опцией командной строки.Я буду использовать ваш ресурс выше в качестве отправной точки для этих примеров.Обратите внимание, что вы можете использовать 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.Также этот ресурс уведомит скрипт о запуске сразу же после загрузки.Для сценария задано действие :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, значение которой равно 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
поваренные книги имеют рецепты "источника".