2016-12-18 11 views
1

크레이그 던 (Craig Dunn)과 URL https://docs.puppet.com/pe/2016.4/r_n_p_full_example.html에서 설명한 역할/프로필 패턴을 https://docs.puppet.com/guides/module_guides/bgtm.html에 지정된 규칙으로 빌드 한 모듈에 적용하고 싶습니다.Puppet Roles/Profiles 및 init.pp 클래스 전용 매개 변수

이러한 규칙에 따라 모든 구성 요소 모듈 (예 : Apache, OpenLDAP)은 매개 변수화 된 init.pp 클래스 만 유지합니다. 그런데, 난 보통 역할을 사용

# 
# Component classes. 
# 

class apache ($logfile = '.log', $backend = $::apache::params::backend) inherits ::apache::params { 
    # 
    # This is the unique parametrized class. 
    # 
} 

class apache::log inherits ::apache { 
    # 
    # This class inherits the params. 
    # 
} 

은/등 - 포함 또는 컴포넌트 클래스 리소스 사용 형 선언 (프로필 :: 아파치 프로필 :: OpenLDAP를 추천) 클래스 프로필.

상위 프로필 클래스 (예 : profile :: apache)에서 리소스와 비슷한 선언을 사용하고 상속 된 프로필 (예 : profile :: apache :: openssh 또는 profile :: apache :: openldap)을 사용하여 새 기능, 부모 구성 요소를 재정의해야하지만 Puppet v4를 사용하면 상위 프로필 (클래스 [:: apache] {backend => 'ldap'})에 선언 된 구성 요소 클래스를 재정의하거나 리소스 수집기 (클래스 < | name == ':: apache'|> {백엔드 => 'ldap'}).

# 
# Profile classes. 
# 

class profile::apache { 
    class { ::apache: 
     logfile => '.my_log', 
    } 
} 

class profile::apache::openldap inherits profile::apache { 
    include ::openldap 

    # Doesn't work with Puppet 4. 
    Class[::apache] { 
     backend => 'ldap' 
    } 

    # 
    # OR... 
    # 

    # Also, doesn't work with Puppet 4. 
    Class <| name=='::apache'|> { 
     backend => 'ldap' 
    } 
} 

는 과거에 나는 매개 변수화 구성 요소 클래스를 사용하고 자식 프로필 클래스에 나는 직접적인 방법의 구성 요소 클래스를 호출하지 않고 구성 요소 클래스의 init.pp의 PARAMS를 오버라이드 (override) 할 수있다.

이 내 오래된 approch입니다 :

class apache::backend ($backend) inherits ::apache { 
    # 
    # Do stuff. 
    # 
} 

class profile::apache::openldap inherits profile::apache { 
    include ::openldap 

    class { ::apache::backend: 
     backend => 'ldap' 
    } 
} 

class profile::apache::mysql inherits profile::apache { 
    include ::mysql 

    class { ::apache::backend: 
     backend => 'mysql' 
    } 
} 

그래서, 코딩의 나의 새로운 스타일로, 내가 사용하는 경우 내가 역할/프로필 패턴을 적용 할 수있는 방법 구성 요소 클래스는 매개 변수화 만 init.pp?

답변

4

꼭두각시 인형 DSL은 당신이 생각하는 것처럼 보이는 객체 지향 언어가 아닙니다. 특히 계급 상속은 당신이 생각하는 것을하지 않습니다. The language specification remarks :

클래스 상속은 일반적으로 단지 다음과 같은 상황에서 매우 아껴서 사용해야합니다

  • 당신은 자원이 기본 클래스에 속성을 재정의해야합니다.
  • 는 "PARAMS 클래스는"다른 클래스의 매개 변수에 대한 디폴트 값을 제공하도록하려면 :

[...] 거의 모든 다른 경우, 상속은 불필요한 복잡성이다.

실제로는 후자의 상속 사용이 일반적입니다.

  1. (이것은 클래스가 선언 한 자원의 속성을 오버라이드 (override)는 매우 다르다) 그 클래스에서 상속하여 사용할 수 없습니다

    당신은 부모 클래스 자체의 클래스 매개 변수를 수정하려고하는, 그리고

  2. 일반적으로 퍼핏에서는 작동하지 않으며 작동하지 않습니다.실제로

, 언어 안내도 (강조 추가) 말한다 : 기본 클래스는 매개 변수가

경우, 이러한 매개 변수는 을 기본 값이 또는 값이 자동으로 외부 데이터 조회에 의해 공급이 있어야 하나. 상속 된 클래스의 매개 변수에는 Puppet 언어의 값을 지정할 수 없습니다. 당신이 말하는


...

는 과거에 나는 매개 변수화 구성 요소 클래스를 사용하고 자식 프로필에 나는 직접적인 방법의 구성 요소 클래스를 호출하지 않고 초기화의 PARAMS을 무시할 수 구성 요소 클래스의 .pp.

... 리소스 유사 클래스 선언을 사용하여 매니페스트에 매개 변수 값을 지정한다는 의미입니다. 이는 대부분의 경우 빈약 한 스타일이지만 동일한 모듈의 private 클래스를 선언하는 클래스는 예외입니다.

그래서 init.pp 구성 요소 클래스 만 매개 변수화 된 경우 역할/프로필 패턴을 적용 할 수 있습니까?

언어 안내에 따르면 외부 데이터 조회 (예 : Hiera)를 사용하여 모듈 매개 변수를 맞춤 설정합니다. 또한 이는 구성 요소 모듈에도 적용됩니다. 클래스 apache에서 상속받은 공용 클래스 apache::log이 있으면이 인스턴스를 자원과 유사한 구문을 통해 선언해서는 안됩니다.

+0

질문이 업데이트되었습니다. 하지만 External 데이터 조회 만 사용할 수 있습니까? 다른 방법은 없습니까? 이런 식으로 어떻게하면 profile :: apache :: openldap 또는 profile :: apache :: mysql을 정의 할 수 있습니까?이 클래스가 최종 사용자의 포함에 따라 component :: apache 클래스의 param 'backend'를 편집 할 수 있어야합니다. ? – BnG

+0

@ BnG이 답변 외에도 프로필과 모듈의 디자인 패턴이 혼란스럽고 복잡합니다. LAMP 프로파일을 만들고 싶다면 내부에 필요한 클래스가있는 LAMP 프로파일을 만드십시오. 자신이해야 할 것보다 어렵게 만들지 마십시오. –

+0

@BnG, 내가 편집 한 내용으로 인해 내가 이미 대답 한 것과 다른 결과를 가져 오는 것은 아무것도 없습니다. –