수업을 찾을 수 없지만 아직 있습니다


31

puppet agent새 이미지에서 전화를 걸 때 err: Could not find class custommod오류가 발생합니다. 모듈 자체는 /etc/puppet/modules/custommod우리가 호출하는 다른 모든 모듈과 동일하지만 이것은 필수입니다.

[site.pp]

node /clunod-wk\d+\.sub\.example\.local/ {
      include base
      include curl
      include custommod
      class{ "custommod::apps": frontend => "false}
      [...]
}

퍼펫 마스터가 디버그 출력으로 실행되면 기본 및 컬에 대한 정보를 명확하게 찾습니다.

debug: importing '/etc/puppet/modules/base/manifests/init.pp' in environment production
debug: Automatically imported base from base into production
debug: importing '/etc/puppet/modules/curl/manifests/init.pp' in environment production
debug: Automatically imported curl from curl into production
err: Could not find class custommod for clunod-wk0130.sub.example.local at /etc/puppet/manifests/site.pp:84 on node clunod-wk0130.sub.example.local

84 행은 include custommod

약식 디렉토리 및 파일 구조 :

/etc/puppet
   |- manifests
   |     |- site.pp
   |
   |- modules
         |- base
         |    |- manifests
         |          |- init.pp
         |
         |- curl
         |    |- manifests
         |          |- init.pp
         |   
         |- custommod
              |- files 
              |     |- apps
              |         |- [...]
              |
              |- manifests
                    |- init.pp
                    |- apps.pp

철자를 확인했습니다 :}

init.ppcustommod 디렉토리 의 내용 은 완전히 주목할 수 없습니다.

class custommod {
}

목적은 apps.pp 파일을위한 빈 클래스를 만드는 것입니다.

class custommod::apps {

    [lots of stuff]
}

단지 앱 파일에 도달하지 않습니다. 를 주석 처리 include custommod하면 위의 오류가 class{ "custommod::apps": frontend => "false}줄에 생성 됩니다.

이 오류가 어떻게 발생하는지 찾기 위해 사냥에서 무엇을 놓치고 있습니까? 이 리포지토리를 통해 로컬로 실행하면 제대로 작동합니다 puppet apply.


클래스가 있는지 클라이언트 yaml 파일에서 정점에 도달 했습니까?
Zoredache

@Zoredache 클라이언트에서 / var / lib / puppet / client_yaml / 디렉토리가 비어 있습니다. 클라이언트에 could not retrieve catalog from remote server:오류가 발생했을 수 있습니다.
sysadmin1138

Hrm ..은 기본 레이아웃 및 가져 오기 구조를 다시 만들었으며 문제를 재현 할 수 없었습니다 (2.7.1). 비어있는 것을 멈추는 것이 안전해야합니다 custommod- init.pp필요하지 않을 수도 있기 때문에 완전히 삭제 해보 십시오.
Shane Madden

@ShaneMadden 그것을 시도한 후, 다음 단계는 strace그것을 던져서 그 파일을 읽는 방법을 알아내는 것입니다.
sysadmin1138

답변:


32

그래서 ... 이것은 조금 당황 스럽지만 ...

환경.

/etc/puppet.conf파일에는 다음이 있습니다.

[master]
  manifest=$confdir/manifests/site.pp
  modulepath=$confdir/environments/$environment/modules:$confdir/modules

strace파일을 어디에서 사냥했는지 파악하기 위해 던졌습니다 . 아래 /etc/puppet/environments/production/modules에서 custommod를 찾고 있었고 거기에 (빈) 디렉토리가 있었 으므로 check하지 않았습니다/etc/puppet/modules . 분명히 모듈을 가져올 때 파일 존재 (init.pp)가 아닌 디렉토리 존재를 확인합니다.

빈 디렉토리를 제거하면 작업이 시작됩니다.

다른 환경을 사용하여 퍼펫 에이전트를 실행하면 작업이 시작됩니다.

이야기의 교훈:

퍼펫 환경 경로는 bash $ PATH처럼 작동하지 않습니다.


8
그리고 누군가가 puppet.conf에 자신의 모듈 경로를 명시 적으로 정의하지 않고 strace에 의존하지 않고 꼭두각시의 모듈 경로를 찾으려면 실행할 수도 있습니다 puppet config print modulepath.
Alison R.

1
이것이 꼭두각시로보고 되었습니까?
Felipe Alvarez

3
이제 모듈 경로가 사용 중단 경고를 트리거합니다.
마젤란

4

나는이 같은 문제에 부딪 쳤지 만 다른 수정이 있었다

꼭두각시 모듈을 다음과 같이 생성하는 경우 :

puppet module generate foo-example_module

그것은라는 이름의 모듈이 만들어집니다 example_module으로 foo이름 공간을. 모든 매니페스트는라는 디렉토리 안에 있습니다.foo-example_module

init.pp에 정의 된 클래스 이름은 폴더 이름과 같아야합니다.

간단한 수정 :

mv foo-example_module example_module

꼭두각시 린트를 실행하면 다음 메시지가 표시됩니다.

ERROR: example_module not in autoload module layout on line 42

r10k 또는 librarian-puppet과 함께 Puppetfile을 사용하는 경우 파일이 모듈 디렉토리에 'foo'접두어없이 배치되도록 이름 공간을 제거해야 할 수도 있습니다.

전에:

mod 'foo-example_module',
    :git => git@github.com:foo/example_module'

후:

mod 'example_module',
    :git => git@github.com:foo/example_module'


0

Fedora의 puppet 3.7.1과 비슷한 문제가 발생했습니다. my.server의 클래스 puppet을 찾을 수 없습니다.

해결책:

sudo ln -s /my/local/copy/puppet/modules /etc/puppet/

그런 다음 작동합니다.


0

나는 비슷한 문제가 있었다. 제 경우에는 클래스 이름이 "onehost :: change_IoT_password_reminder"였습니다. strace를 사용한 후 꼭두각시가 modules / onehost / manifests / change_iot_password_reminder.pp 파일을 찾고 있음을 발견했습니다. 클래스 이름에 대문자를 사용하는 것은 클래스의 첫 글자가 아니더라도 좋은 생각이 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.