Классы и определения в Puppet

Классы и определения в Puppet

Хотя я знаю немедленное решение проблемы, с которой я столкнулся вчера (спасибо ребятам из 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"), вы снова столкнетесь с этой ошибкой.

Связанный контент