더북(TheBook)

매니페스트 작성하기

앞에서 살펴본 예제의 ‘site.pp’와 같은 파일을 매니페스트 manifest라고 합니다. 매니페스트는 일종의 명세서로서 퍼펫을 실행할 대상과 어떤 리소스 resources를 어떻게 조작할지 결정합니다. 마치 프로그래밍 언어와도 같은 퍼펫만의 전문적인 문법을 사용해서 매니페스트를 작성합니다.

Tip

‘site.pp(사이트 매니페스트)’는 가장 기본적인 매니페스트 파일로 퍼펫이 반드시 읽어서 적용합니다.

리소스는 제어의 최소 단위인 시스템 자원을 의미합니다. 파일file, 사용자user, 패키지package, 서비스service, 크론 작업cron, 외부 스크립트(exec) 등이 대상이며 실제 리소스 선언에서 가장 먼저 제어할 리소스 유형을 밝혀야 합니다.

유형 { 이름 :
     속성1 => 값,
     속성2 => 값,
     …
}

앞에서 소개한 매니페스트 예제(‘site.pp’ 파일)를 다시 살펴봅시다.

shinjaehun@losttemple:~$ vi site.pp

앞에서는 파일을 다루는 리소스 file을 사용했습니다. 파일 이름은 /tmp/hello이며 파일 내용은 content 속성에 의해 “Hello, puppet!\n”이 됩니다.

file {'/tmp/hello':
     content => "Hello, puppet!\n",
}
Tip

문자열 뒤에 붙은 ‘\n’은 줄바꿈 문자입니다. 문자열을 화면에 출력하고 한 칸 아래에 명령 프롬프트를 보여주기 위해 사용했습니다.

지금까지는 퍼펫이 실행되는 서버만을 대상으로 매니페스트를 적용하고 있지만, 실무에서는 시스템별로 역할을 나눠 매니페스트를 적용해서 관리합니다. 제어 대상을 지정하는 선언이 노드node입니다. 노드 내 리소스를 선언해서 해당 시스템을 제어합니다.

node 이름 {
  리소스1 { 이름 :
          속성1 => 값,
          속성2 => 값,
          …
  }
  리소스2 {
  …
}

다음과 같이 각 시스템의 호스트 이름으로 노드를 선언합니다. 앞에서 작성했던 file 리소스를 삭제하고 호스트 losttemple.linuxmaster.com과 vm01.linuxmaster.com에 각각 /tmp/hello 파일을 생성하는 file 리소스를 삽입합니다.

file {'/tmp/hello':
    content => "Hello, puppet!\n",
}

node 'losttemple.linuxmaster.com' {
   file {'/tmp/hello':
        content => "Hello, puppet!\n",
   }
}

node 'vm01.linuxmaster.com' {
   file {'/tmp/hello':
        content => "Hello, puppet!\n",
   }
}
Tip

아직 가상 게스트 vm01.linuxmaster.com은 인증되지 않은 상태이므로 저렇게 입력해도 /tmp/hello 파일을 생성하지는 못합니다. 퍼펫 마스터 서버와 에이전트 사이의 인증 과정을 거친 다음에 다른 호스트를 제어할 수 있습니다.

클래스class는 매니페스트를 모듈화한 코드로서 관련 리소스를 묶어 놓은 그룹입니다.

class 이름 {
   리소스1 { 이름 :
          속성1 => 값,
          속성2 => 값,
          …
   }
   리소스2 {
   …
}

클래스를 정의해두고 각 노드마다 include 키워드를 써서 해당 클래스를 사용합니다. 이렇게 해서 코드를 재사용하면 노드마다 같은 코드를 반복하는 수고를 덜 수 있습니다. 코드를 간결하게 해서 코드 이해를 돕고 코드 중복으로 발생할 수 있는 문제를 미연에 방지할 수 있습니다.

node 이름 {
   include 클래스
   리소스 {
   …
}

node 이름 {
   include 클래스
   리소스 {
   ...
}

hello_puppet이라는 클래스에 /tmp/hello를 생성하는 파일 리소스를 선언하고 노드마다 hello_puppet 클래스를 사용하고 있습니다.

class hello_puppet {
   file {'/tmp/hello':
        content => "Hello, puppet!\n",
   }
}

node 'losttemple.linuxmaster.com' {
   include hello_puppet
}

node 'vm01.linuxmaster.com' {
   include hello_puppet
}

같은 클래스를 적용한다면 노드를 하나로 묶어 선언할 수 있습니다. 코드도 간결해지고 훨씬 알아보기 쉽습니다.

class hello_puppet {
   file {'/tmp/hello':
        content => "Hello, puppet!\n",
   }
}

node 'losttemple.linuxmaster.com' {
  include hello_puppet
}

node ‘losttemple.linuxmaster.com’, ‘vm01.linuxmaster.com’ {
   include hello_puppet
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.