шеф-повар устанавливает и обновляет программы из исходного кода - PullRequest
35 голосов
/ 16 декабря 2011

У меня есть программа, которую я создаю из исходного кода. Для этого я использую ресурс 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

1 Ответ

68 голосов
/ 27 декабря 2011

Прежде всего, если у вас есть средства для размещения внутреннего репозитория пакетов, я обычно рекомендую создавать собственные пакеты для вашей целевой платформы (платформ) и использовать ресурс 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 поваренные книги имеют рецепты "источника".

...