꼭두각시 매개 변수화 된 클래스를 사용해야하는 이유는 무엇입니까?


12

일반적으로 복잡한 퍼펫 모듈로 작업 할 때 노드 수준 또는 클래스 내부에서 변수를 설정합니다. 예를 들어

node 'foo.com' {
  $file_owner = "larry" 
  include bar 
}

class bar { 
  $file_name = "larry.txt"
  include do_stuff
}

class do_stuff {
  file { $file_name:
    ensure => file,
    owner  => $file_owner,
  }
}

이런 상황에서 매개 변수화 된 수업이 어떻게 / 언제 / 왜 도움이됩니까? 퍼펫 모듈을 구성하기 위해 매개 변수화 된 클래스를 어떻게 사용하고 있습니까?


2
이 예제를 찾은 모든 사람에게이 코드는 Puppet 버전 <3.0에서 허용 된 전역 변수 조회를 보여줍니다. Puppet> 3.0에서는 범위를 벗어난 변수에 액세스 할 수 없으며 변수에 액세스하려면 네임 스페이스를 사용해야합니다. 이 예에서는 해당 변수 를 사용 $bar::file_name하고 $::file_owner해당 변수에 액세스해야합니다. 그러나 매개 변수화 된 클래스를 사용할 때 매개 변수를 통해 클래스로 전달 된 변수는 로컬 범위 변수가됩니다.
robbyt

답변:


12

매개 변수화 된 클래스는 코드를보다 잘 구성하는 데 도움이되는 언어 구성입니다. 전역 변수를 과도하게 사용하지 못하게합니다 (예와 같이).

노드 설명에 20 개의 클래스가 더 포함되어 있고 매니페스트의 전역 또는 노드 범위에서 일부 변수를 설정해야한다고 상상해보십시오. 또한 매개 변수화 된 클래스를 사용하면 기본 매개 변수를 쉽게 가질 수 있으므로 여러 위치에서 $file_owner동일한 값 (예 :)을 제공하는 대신 기본값을 사용할 수 있습니다 larry.

예제 스 니펫 (두 개의 추가 노드 포함)은 다음과 같이 작성할 수 있습니다.

node 'example.com' { 
  class { bar: }
}

node 'example.net' {
  class { bar: owner = "harry" }
}

node 'example.net' {
  class { bar: file_name = "barry.txt" }
}

class bar($owner = "larry", $file_name = "larry.txt") { 
  class { do_stuff: owner => $owner, file_name => $file_name }
}

class do_stuff($owner, $file_name) {
  file { $file_name:
    ensure => file,
    owner  => $owner,
  }
}

전역 변수를 사용하면 $owner각 노드에 이름이 지정된 변수를 선언해야하며 노드 $file_name당 변수 / 매개 변수 를 덮어 쓸 수 없습니다 . 대신 bar각 노드마다 다른 클래스 를 선언해야 합니다.

Puppet의 언어 진화에 대한 문서와 물론 언어 안내서는 매개 변수가있는 클래스를 사용하는 방법과이 언어 구문의 근거에 대한 좋은 예를 제공합니다.


8

이것을 생각하는 가장 좋은 방법은 이미 Puppet 관용구를 아는 것으로 시작하는 대신 처음부터 시작하는 것입니다.

처음에하려고하는 것은 매개 변수를 클래스에 전달하는 것입니다. 인수를 함수에 전달하는 것과 같이 동작 방법을 결정하는 데 필요한 정보를 제공합니다. 이것이 perl이고 multiply_squares라는 함수가 있다고 가정하십시오. 당신은 좋아하는 전화 것 multiply_squares(3, 4)3, 4 일부 글로벌 변수를 설정하고 함수 내부에서이를 읽을 수 없습니다!

그러나 역사적으로 Puppet 코드는 전역 변수 또는 동적 범위를 사용하여이를 수행해야했습니다. 언어를 설계하기 전에 수행해야했기 때문입니다. 개인적으로, 일단 매개 변수화 된 클래스가 좀 더 발전되고 더 널리 배포되면 기본적으로 변수 범위 문제를 과거의 일로 만들 것입니다. 작업에 적합한 도구를 사용할 수 있으면 무서운 해킹의 전체 계층이 제거되기 때문입니다.

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