Установка чего-либо из исходного кода с использованием chef, стоит ли мне делать какие-то проверки

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

Например, то, что у меня сейчас есть:

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

3 ответа

Я бы предпочел использовать утилиты 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. у вас есть версия, которую вы ожидаете иметь

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

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

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

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

Вы обязательно должны использовать метапараметр 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 на странице ресурсов.

Другие вопросы по тегам