Я устанавливаю что-то из исходников, используя шеф-повар и ресурс сценария. Должен ли я выполнять проверку полученного исполняемого файла и т. Д. Как часть этого?
например В настоящее время у меня есть:
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 [?]), Таким образом вы проверяете две вещи:
потому что наличия файла недостаточно, чтобы предположить, что двоичный файл работает и это именно та версия, которую вы ожидаете
Вы обязательно должны использовать метапараметры 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
в качестве последней строки вашего сценария и посмотрите, что произойдет.
В любом случае, поскольку проверить существующий файл нетрудно, почему бы просто не сделать это на всякий случай?