Подтвердить что ты не робот

Chef устанавливать и обновлять программы из источника

У меня есть программа, которую я создаю из источника. Для этого я использую ресурс script. Каков хороший способ реализации логики для установки и обновления? Прямо сейчас у меня есть инсталляция с встроенным 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
4b9b3361

Ответ 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 кулинарные книги имеют "исходные" рецепты.