12.5.3 매개변수를 이용해서 웹 서버 모듈 재활용하기
같은 방법으로 여러 노드에서 동시에 웹 서버를 운영하려면 어떻게 해야 할까요? 노드마다 코드를 ‘복사/붙여넣기’하는 대신 모듈을 재활용하는 편이 바람직합니다. 한 가지 방법은 매개변수(parameter)를 이용해서 클래스를 정의하는 것입니다. 매개변수는 클래스 사이에 자료를 주고받는 데 사용합니다. 고유한 값을 넘겨 모듈에 정의해 놓은 클래스를 참조하면 함수에 인자를 넣어 호출하는 것처럼 다양한 결과를 얻을 수 있습니다.
모듈 코드에서 공통된 부분을 제외하고 다른 노드에 적용할 때 달라지는 항목을 찾아 매개변수로 바꿉니다. webapp::web 클래스에서는 가상 호스트 이름으로 사용할 호스트 이름과 포트 번호를 다르게 설정해야 노드마다 다양한 가상 호스트 서비스가 가능합니다. 매니페스트를 수정합니다.
administrator@vmgate:~/code/environments/production$ vi modules/webapp/manifests/web.pp
➊ 클래스 선언 뒤에 괄호(( ))를 넣어 전달받을 매개변수를 선언하고 초기화합니다. webapp::web 클래스에서는 호스트 이름과 포트 번호에 해당하는 servername과 port에 각각 ${::fqdn}과 80을 할당했습니다. 리소스 속성처럼 여러 매개변수는 쉼표(,)로 구분합니다. ➋ servername으로 사용한 ${::fqdn}은 팩트 변수로 시스템의 호스트 이름으로 해석됩니다. ➌ port로 쓰인 80번은 웹 서버 기본 포트 번호를 의미합니다. webapp::web 클래스를 참조할 때 servername이나 port를 명시하지 않은 상태로 호출하면 초기화된 값을 적용하지만, 직접 값을 지정해서 호출하면 초기화 정보는 무시하고 지정한 값에 따라 가상 호스트 서비스가 제공될 것입니다.