Назад | Перейти на главную страницу

Установка чего-то из исходников с помощью шеф-повара, стоит ли делать какие-то проверки

Я устанавливаю что-то из исходников, используя шеф-повар и ресурс сценария. Должен ли я выполнять проверку полученного исполняемого файла и т. Д. Как часть этого?

например В настоящее время у меня есть:

remote_file "/tmp/foo.tar.gz" do
  source "foo.tar.gz"
  mode "0644"
end

script "install_foo" do
  interpreter "bash"
  user "root"
  cwd "/tmp"
  code <<-EOH
  tar -zxf foo.tar.gz
  cd foo
  make
  cp foo /usr/local/bin
  EOH
end

Я бы предпочел использовать утилиты Chef :: Mixin :: ShellOut, как в этом посте https://stackoverflow.com/questions/16309808/how-can-i-put-the-output-of-a-chef-execute-resource-into-a-variable

Я бы запустил команду с правильным параметром, чтобы проверить номер ее версии (в большинстве случаев -v [?]), Таким образом вы проверяете две вещи:

  1. компиляция не только работала, но и создала двоичный файл, который запускается
  2. у вас есть версия, которую вы ожидаете иметь

потому что наличия файла недостаточно, чтобы предположить, что двоичный файл работает и это именно та версия, которую вы ожидаете

Вы обязательно должны использовать метапараметры not_if или only_if для ресурса сценария, иначе Chef будет выполнять сценарий каждый раз, когда он запускается на узле. В зависимости от программного обеспечения, которое вы компилируете, это может быть так же просто, как наличие файла, или то, что это ненулевой размер, или так сложно, как проверка того, что команда, скопированная в / usr / local / bin, выводит некоторую конкретную строку .

Например, если вы хотите увидеть, существует ли файл просто и предположить лучшее:

script "install_foo" do
  # .. other stuff you wrote!
  not_if "test -x /usr/local/bin/foo"
end

Вероятно, вам следует убедиться, что файл является исполняемым, поскольку вы помещаете его в / usr / local / bin.

file "/usr/local/bin/foo" do
  mode 0755
end

Если вы хотите проверить, что команда имеет определенный вывод, вы можете сделать что-то вроде:

script "install_foo" do
  # .. other stuff you wrote!
  not_if "test -x /usr/local/bin/foo && /usr/local/bin/foo | grep -x 'foo is awesome'"
end

(конечно, при условии, что запуск foo даст такой результат.)

Метапараметры not_if (и only_if) могут принимать строку или блок Ruby. Если это строка, то это будут команды оболочки, выполняемые в системе. Если это блок Ruby (do .. end или {}), он будет выполнен как Ruby.

Мета-параметры задокументированы в вики Chef под страница "ресурсы".

Этот сценарий завершится с 1 если foo не существует и поэтому не может быть скопирован. Если chef будет правильно обрабатывать скрипты, которые не завершаются успешно (код выхода 0), вам не понадобится еще одна проверка, но если этого не произойдет, я настоятельно рекомендую создать ее.

Я не могу проверить chefпрямо сейчас, но проверить это несложно: поставьте exit 1 в качестве последней строки вашего сценария и посмотрите, что произойдет.

В любом случае, поскольку проверить существующий файл нетрудно, почему бы просто не сделать это на всякий случай?