2012-05-14 5 views
3

그냥 꼭두각시를 시작하고 첫 번째 템플릿에 문제가 있습니다. 그것은 매우 쉬워야하지만, 나는 그것을 이해할 수 없다.꼭두각시가 템플릿에 대한 변수를 찾을 수 없습니다.

나는

/etc/puppet/modules/base/ 
    ./manifests 
    ./manifests/service.pp 
    ./manifests/init.pp 
    ./manifests/params.pp 
    ./manifests/config.pp 
    ./manifests/install.pp 
    ./templates 
    ./templates/puppet.conf.erb 

다른 물건을 거기에서 모듈 "기본"을 가지고 있지만, 그것은 필요는 없습니다.

기본/매니페스트/init.pp :

class base { 
    include base::install, base::service, base::config, base::params 
} 

기본/매니페스트/마지막 config.pp

class base::config { 
    include base::params 

    File { 
    require => Class["base::install"], 
    ensure => present, 
    owner => root, 
    group => root, 
    } 

    file { "/etc/puppet/puppet.conf": 
    mode => 0644, 
    content => template("base/puppet.conf.erb"), 
    require => Class["base::install"], 
    nofity => Service["puppet"], 
    } 
... 

기본/매니페스트/params.pp

class base::params { 
    $puppetserver = "pup01.sdirect.lab" 
} 

흥미로운 base/templates/puppet.conf.erb에있는 템플릿의 일부

오류 메시지 :

오류 : 은/etc/인형/모듈 /베이스/매니페스트에서 'puppetserver'에 대한 값을 찾을 수 없습니다 : 템플릿 기반/puppet.conf.erb을 구문 분석하지 못했습니다 /config.pp:13 on node ...

문제가 발생하지 않습니다. Pro Puppet 책에서이 부분을 곧바로 복사했습니다.

누군가가 $ puppetserver를 정의해야하는 위치를 어떻게 표시 할 수 있습니까?

답변

14
문제가 변수에 정의되어 꼭두각시 값을 찾을 수 있도록이 템플릿이 평가되는 것과 다른 범위에 정의되어 있기 때문에 이름 "puppetserver는"정규화 할 필요가 있다고한다.

base::params 그래서 그 범위에서 단순히 "puppetserver"로만 언급 될 수 있습니다. base::config에서 템플릿을 평가할 때는 다른 범위에 있으므로 간단한 이름만으로 변수를 참조 할 수 없습니다. "include"는 다른 클래스를 카탈로그에 추가하지만 이러한 규칙은 변경하지 않습니다.

이것은 액세스하는 것을 의미하므로 클래스 이름을 base::params::puppetserver으로 정규화합니다. 매니페스트 자체에서 사용하는 경우 $base::params::puppetserver이됩니다. 비슷한 예제가 ssh::configssh::service 클래스의 Pro Puppet에서 params 클래스 (43-45 페이지)의 "ssh_service_name"을 참조하는 클래스를 볼 수 있습니다.

템플릿의 변수에 액세스하려면 약간 다릅니다. scope.lookupvar("base::params::puppetserver")을 사용하십시오. 전체 예를 촬영하고 누락을 추가하는 템플릿 (출력 값) 등호 (=) :

... 
server=<%= scope.lookupvar("base::params::puppetserver") %> 

Scope and Puppet as of 2.7 페이지에서 범위 지정에 대해 좀 더 정보가있다.

(수정 : 동일한 솔루션으로 confirmed errata page에도 표시되는 것처럼 보입니다.)

+0

정말 고마워요. scope.lookupvar가 완벽하게 작동했습니다. base :: :: config의 초기 클래스 정의 바로 뒤에 "include base :: params"를 추가해야했습니다. – fandingo

6

Answer #1은 기술적으로는 정확하지만 매우 자세한 템플릿이 생성됩니다. 예상대로 다음

class base::config { 
    include base::params 
    $puppetserver = $base::params::puppetserver 
    ... 
} 

그리고 템플릿에서 사용할 :

당신은 자신의 클래스 범위에 다른 클래스에서 변수 값을 가져 와서 그것들을 단축 할 수

server=<% puppetserver %> 
1

또한 상속을 사용할 수 있습니다 이 방법으로

class puppet::config inherits puppet::params { 
.... 

을 당신은 $puppetserver 전압 강하를 정의 할 필요가 없습니다 이 클래스의 n.

관련 문제