Установка чего-либо из исходного кода с использованием 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
если 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 на странице ресурсов.