
Хотя я знаю немедленное решение проблемы, с которой я столкнулся вчера (спасибо ребятам из IRC #puppet), я все еще не понимаю, как оно решило проблему, или, скорее, в чем принципиальное различие между классами и определениями в этом конкретном сценарии:
Первоначальное определение, которое было неверным:
define srv($name,$enable="true",$ensure="running",$provider="runit",$hasstatus="true",$hasrestart="true"){
exec {"sleep 5": path=>"/usr/bin:/usr/sbin:/bin:/sbin", before=>Service["$name"],}
service{"$name":
enable=>$enable,
ensure=>$ensure,
provider=>$provider,
hasstatus=>$hasstatus,
hasrestart=>$hasrestart,
}
}
err: Не удалось получить каталог с удаленного сервера: Ошибка 400 на СЕРВЕРЕ: Повторяющееся определение: Exec[sleep 5] уже определен в файле /etc/puppet/modules/common/manifests/defines/srv.pp в строке 4; невозможно переопределить в /etc/puppet/modules/common/manifests/defines/srv.pp:4 на узле testing.abc.def.com
Правильное определение:
define srv($enable="true",$ensure="running",$provider="runit",$hasstatus="true",$hasrestart="true"){
exec {"sleep 5 for $name": command=>"sleep 5", path=>"/usr/bin:/usr/sbin:/bin:/sbin", before=>Service["$name"],}
service{"$name":
enable=>$enable,
ensure=>$ensure,
provider=>$provider,
hasstatus=>$hasstatus,
hasrestart=>$hasrestart,
}
}
Итак, почему ошибка в первом случае? Как я дублирую определение или, другими словами, если бы был один модуль, использующий это определение, то сработало бы первое определение? Возможно, меня сбила с толку терминология puppet в документации, но, написав кучу (работающих) модулей и не понимая этого, я надеюсь, что смогу получить какие-то ясные ответы.
решение1
Ресурсы в Puppet должны быть уникальными, т.е. иметь уникальное имя.
Exec["sleep 5"]
В описанном случае в вашем определении был ресурс , и каждый раз, когда вы вызываете srv
(это по сути то же самое, что и включение параметризованного класса), ресурс Exec["sleep 5"]
также будет включен, и, таким образом, анализатор находит два или более ресурсов с одинаковым именем.
Добавляя $name
определение к названию вашего Exec
ресурса, вы делаете его уникальным. Ну, по крайней меревероятноуникально, поскольку если где-то в ваших манифестах есть другой ресурс с таким же именем ( Exec["sleep 5 for foo"
), вы снова столкнетесь с этой ошибкой.