как и многие люди, у меня проблема с классовой зависимостью марионетки. Либо один класс выполняется слишком рано, либо я попадаю в цикл зависимости.
После настройки:
node foo:
require base
include somethingelse
class base:
require sources // <- class defines package sources needed for everything
class somethingelse
apt::builddep { 'foo': } // <- requires some package sources
Насколько я понимаю, узел foo
выполняется, но требует base
, поэтому марионетка выполняет это первой. base
первая строка требует sources
так что марионетка выполнит это первой. builddep
идет последним.
Однако это происходит с точностью до наоборот. Источники запускаются в любое время без какой-либо логики (например, ресурс без зависимостей). Много раз после builddep, что приводит к ошибке марионетки, так как источник, который ему нужен, еще не существует.
Когда я определил зависимости узлов следующим образом:
include "base"
include "somethingelse"
Class['base'] -> Class['somethingelse']
Или добавить Class['sources']
как зависимость от builddep, я получаю цикл зависимости, подобный этому:
(Anchor[apt::source::puppetlabs] => Apt::Source[puppetlabs] => Class[Sources] => Class[Base] => Cron[execute-puppet] => Class[Base] => Class[somethingelse] => Apt::Builddep[foo] => Exec[apt-builddep-foo] => Exec[apt_update] => Class[Apt::Update] => Anchor[apt::source::puppetlabs])
Что я делаю не так? Может ли кто-нибудь указать мне правильное направление? Важно то, что все в базе (включая исходники) выполняется до класса somethingelse
(и, следовательно, builddep)
РЕДАКТИРОВАТЬ
Сужая его. Проблема в том, что builddep не требует наличия исходных кодов. Без каких-либо требований builddep запускается до добавления источников, но требует обновления apt-get. При добавлении требования к моему классу источников я снова попадаю в цикл зависимости.
Сейчас пробую это: Apt::Source <| |> -> Apt::Builddep <| |>
что приводит к
(Anchor[apt::source::puppetlabs] => Apt::Source[puppetlabs] => Apt::Builddep[foo] => Exec[apt-builddep-foo] => Exec[apt_update] => Class[Apt::Update] => Anchor[apt::source::puppetlabs])
Я пришел к выводу, что это ошибка в apt. builddep
уведомляет apt-get update
вместо того, чтобы требовать этого, что, на мой взгляд, не имеет большого смысла. Вы хотите apt-get update
быть выполненным перед установка зависимостей сборки.
Я исправил, чтобы требовать apt-get update
, который решает мой цикл зависимости. Представил запрос на вытягивание чтобы увидеть, что говорят разработчики.