Мы настраиваем кластер с использованием Apache Ambari.
Работа Chef прерывается необходимостью использовать Ambari для подготовки кластера Hadoop. Текущая установка состоит из трех частей:
Я искал похожие вопросы, но все ответы были связаны с использованием ресурсов, которые включали защитные атрибуты для условных выражений. Во втором прогоне используется ряд ресурсов, которые не принимают атрибуты защиты.
Я работал над этим, используя команды выполнения и охранников «not_if» / «only_if». Пример:
%w{package1 package2 package3 package4}.each do |package|
execute "Install #{package}" do
command "yum install #{package}"
user 'root'
only_if { ::File.exists?("/etc/yum.repos.d/ambari.repo")}
end
end
Но писать для каждого ресурса становится утомительно. Должен быть способ получше.
Есть ли стандартная или «лучшая» практика для выполнения всего оставшегося кода (или выбора ресурсов) в рецепте, если выполняется одно условие?
Я думал об упаковке в блок Ruby и использовании уведомлений, но блоки кажутся декларативными. Я не уверен, как лучше всего настроить их на «делать x, если y, иначе ничего», или даже если это правильный инструмент для работы?
ruby_block "Check for Ambari.repo" do
block do
File.exists?("/etc/yum.repos.d/ambari.repo")
end
notifies :run "execute[package]" :immediately
end
%w{package1 package2 package3 package4}.each do |package|
execute "Install #{package}" do
command "yum install #{package}"
user 'root'
action :nothing
end
end
Вы запрашиваете блок if, так почему бы просто не использовать блок if?
if File.exists?("/etc/yum.repos.d/ambari.repo")
%w{package1 package2}.each do |pkg|
package pkg
end
... do some other stuff here if you want...
end
Действие по умолчанию для пакета - это установка, поэтому в этом случае вам не нужен полный блок.