Назад | Перейти на главную страницу

Классы и определения в 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,
                } 
                              }

ошибка: не удалось получить каталог с удаленного сервера: ошибка 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") где-то еще в ваших манифестах, вы снова столкнетесь с этой ошибкой.