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

Лучшие практики - условные выражения для ресурсов Chef без атрибутов защиты?

Мы настраиваем кластер с использованием Apache Ambari.

Работа Chef прерывается необходимостью использовать Ambari для подготовки кластера Hadoop. Текущая установка состоит из трех частей:

  1. Первоначальный запуск Chef для подготовки ОС.
  2. Используйте Ambari для настройки (и последующего управления) кластера Hadoop.
  3. Конфиги Post-Ambari с использованием второго запуска Chef.

Я искал похожие вопросы, но все ответы были связаны с использованием ресурсов, которые включали защитные атрибуты для условных выражений. Во втором прогоне используется ряд ресурсов, которые не принимают атрибуты защиты.

Я работал над этим, используя команды выполнения и охранников «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

Действие по умолчанию для пакета - это установка, поэтому в этом случае вам не нужен полный блок.