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,
                } 
                              }

오류: 원격 서버에서 카탈로그를 검색할 수 없습니다. SERVER의 오류 400: 중복된 정의: Exec[sleep 5]는 /etc/puppet/modules/common/manifests/defines/srv.pp 파일의 4행에 이미 정의되어 있습니다. test.abc.def.com 노드의 /etc/puppet/modules/common/manifests/defines/srv.pp:4에서 재정의할 수 없습니다.

올바른 정의:

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,
                }
                              }

그렇다면 첫 번째 경우에는 왜 오류가 발생했습니까? 정의를 어떻게 복제합니까? 즉, 이 정의를 사용하는 단일 모듈이 있는 경우 첫 번째 정의가 작동하게 됩니까? 아마도 문서에 있는 꼭두각시 용어가 나를 혼란스럽게 만들었을 수도 있지만, 수많은 (작동하는) 모듈을 작성하고 이를 이해하지 못하는 것은 나에게 위험한 것처럼 들리므로 명확한 답변을 얻을 수 있기를 바랍니다.

답변1

Puppet의 리소스는 고유해야 합니다. 즉, 고유한 이름을 가져야 합니다.

Exec["sleep 5"]설명된 경우 정의에 리소스가 있고 호출할 때마다 srv(기본적으로 매개변수화된 클래스를 포함하는 것과 동일) 리소스 Exec["sleep 5"]도 포함되므로 파서는 동일한 이름을 가진 두 개 이상의 리소스를 찾습니다.

$name리소스 이름에 정의를 추가하면 Exec해당 리소스를 고유하게 만들 수 있습니다. 글쎄, 적어도아마도매니페스트의 다른 위치에 동일한 이름( )을 가진 다른 리소스가 있으면 Exec["sleep 5 for foo"이 오류가 다시 발생하기 때문입니다.

관련 정보