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

Как зависеть от класса Puppet перед установкой?

Я монтирую Cloudfuse для доступа к Cloudfiles Rackspace с помощью Puppet, но на новом хосте монтирование запускается слишком рано, хотя мне нужен весь класс. В Pro PuppetДжеймс рекомендует разделять определения классов следующим образом:

class cloudfuse{
  include cloudfuse::install, cloudfuse::service, cloudfuse::config
}

class cloudfuse::install{
  # download and install
}

class cloudfuse::config{
  file{'/root/.cloudfuse':
    notify => Class['cloudfuse::service'],
  }
}

class cloudfuse::service{
  service{'cloudfuse':
    ensure => running,
  }
}

Это прекрасно работает. Когда я буду готов к монтированию, мне потребуется родительский класс верхнего уровня, например:

exec{'mount /data/cloudfiles':
  command => "/usr/local/bin/cloudfuse /data/cloudfiles",
  require => [
    File['/data/cloudfiles'],
    Class['cloudfuse'],
  ]
}

Вопросы такие:

  1. Это идиоматика? Я видел это в другом месте, поэтому я бы сказал, что это так.
  2. Должен ли я действительно потребовать cloudfuse::install вместо родителя?

Я знаю, что требуется cloudfuse::install исправит мою проблему, но если у меня будет очень простой класс, возможно, я не разделю на три, как это, тогда мне придется угадывать / смотреть на манифест, чтобы знать, как объявить зависимость.

Раскрытие информации, я являюсь одним из разработчиков Puppet.

К сожалению, ошибка в Puppet означает, что класс, содержащий только другие классы, не вызывает транзитивных зависимостей. Ты можешь использовать узор "якорь" чтобы обойти это, или вы можете добавить бессмысленный ресурс в класс верхнего уровня, как в:

class cloudfuse {
  include cloudfuse::install, ...
  notify { "hate #8040": message => "work around bug #8040" }
}

Вы можете следить ошибка # 8040 чтобы следить за тем, когда мы наконец исправим это.