Хотя я знаю немедленное решение проблемы, с которой я столкнулся вчера (спасибо ребятам из 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,
}
}
ошибка: не удалось получить каталог с удаленного сервера: ошибка 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 должны быть уникальными, т.е. е. иметь уникальное имя.
В описанном случае у вас был ресурс Exec["sleep 5"]
в вашем определении и каждый раз, когда вы звоните srv
(это в основном то же самое, что и включение параметризованного класса), ресурс Exec["sleep 5"]
также будет включен, и, таким образом, синтаксический анализатор найдет два или более ресурса с одинаковым именем.
Добавив $name
определения имени вашего Exec
ресурс, вы делаете его уникальным. Ну хоть наверняка уникален, так как когда у вас есть другой ресурс с тем же именем (Exec["sleep 5 for foo"
) где-то еще в ваших манифестах, вы снова столкнетесь с этой ошибкой.