Я монтирую 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'],
]
}
Вопросы такие:
cloudfuse::install
вместо родителя?Я знаю, что требуется cloudfuse::install
исправит мою проблему, но если у меня будет очень простой класс, возможно, я не разделю на три, как это, тогда мне придется угадывать / смотреть на манифест, чтобы знать, как объявить зависимость.
Раскрытие информации, я являюсь одним из разработчиков Puppet.
К сожалению, ошибка в Puppet означает, что класс, содержащий только другие классы, не вызывает транзитивных зависимостей. Ты можешь использовать узор "якорь" чтобы обойти это, или вы можете добавить бессмысленный ресурс в класс верхнего уровня, как в:
class cloudfuse {
include cloudfuse::install, ...
notify { "hate #8040": message => "work around bug #8040" }
}
Вы можете следить ошибка # 8040 чтобы следить за тем, когда мы наконец исправим это.