웹사이트 검색

Puppet 코드 시작하기: 매니페스트 및 모듈


소개

에이전트/마스터 구성에서 Puppet을 설정한 후 Puppet 매니페스트 및 모듈을 작성하는 데 도움이 필요할 수 있습니다. Puppet을 효과적으로 사용하려면 매니페스트와 모듈이 구성되는 방식을 이해해야 합니다. 이 자습서에서는 Puppet 코드 기본 사항을 다루고 Puppet을 사용하여 서버 환경을 관리하는 데 도움이 되는 매니페스트 및 모듈을 구성하는 방법을 보여줍니다. Puppet을 사용하여 Ubuntu 14.04 VPS에서 LAMP 스택을 구성하는 세 가지 방법을 보여줍니다.

전제 조건

이 자습서를 시작하기 전에 작동 중인 에이전트/마스터 Puppet 설정이 있어야 합니다. 아직 없는 경우 서버 인프라를 관리하기 위해 Puppet을 설치하는 방법 자습서를 따르십시오.

또한 Puppet 마스터가 관리할 Puppet 에이전트 노드 역할을 할 새 VPS를 하나 이상 생성할 수 있어야 합니다.

새 에이전트 노드 생성

"lamp-1\이라는 새 Ubuntu 14.04 VPS를 만들고 Puppet 에이전트 노드로 추가하고 Puppet 마스터에서 인증서 요청에 서명합니다.

꼭두각시 코드 기본 사항

시스템을 구성할 Puppet 코드를 작성하기 전에 뒤로 물러서서 관련 Puppet 용어 및 개념을 검토해 보겠습니다.

자원

꼭두각시 코드는 주로 리소스 선언으로 구성됩니다. 리소스는 특정 사용자 또는 파일이 존재해야 하거나 패키지가 설치되어야 하는 것과 같은 시스템 상태에 대한 내용을 설명합니다. 다음은 사용자 리소스 선언의 예입니다.

user { 'mitchell':
  ensure     => present,
  uid        => '1000',
  gid        => '1000',
  shell      => '/bin/bash',
  home       => '/home/mitchell'
}

리소스 선언의 형식은 다음과 같습니다.

resource_type { 'resource_name'
  attribute => value
  ...
}

따라서 이전 리소스 선언은 지정된 속성을 가진 'mitchell'이라는 사용자 리소스를 설명합니다.

Puppet에서 사용할 수 있는 모든 기본 리소스 유형을 나열하려면 다음 명령을 입력합니다.

puppet resource --types

이 자습서 전체에서 몇 가지 리소스 유형을 더 다룰 것입니다.

매니페스트

꼭두각시 프로그램을 매니페스트라고 합니다. 매니페스트는 꼭두각시 코드로 구성되며 해당 파일 이름은 .pp 확장자를 사용합니다. apt를 통해 설치된 Puppet의 기본 기본 매니페스트는 /etc/puppet/manifests/site.pp입니다.

전제 조건인 Puppet 자습서를 따랐다면 파일을 생성하고 Apache를 설치하는 매니페스트를 이미 작성한 것입니다. 또한 이 튜토리얼에서 몇 가지를 더 작성할 것입니다.

클래스

Puppet에서 클래스는 다른 코드에서 호출할 수 있는 코드 블록입니다. 클래스를 사용하면 Puppet 코드를 재사용할 수 있고 매니페스트를 더 쉽게 읽을 수 있습니다.

클래스 정의

클래스 정의는 클래스를 구성하는 코드가 있는 곳입니다. 클래스를 정의하면 매니페스트에서 클래스를 사용할 수 있지만 실제로는 아무것도 평가하지 않습니다.

다음은 클래스 정의의 형식을 지정하는 방법입니다.

class example_class {
  ...
  code
  ...
}

위는 "example_class\라는 클래스를 정의하고 Puppet 코드는 중괄호 사이에 위치합니다.

클래스 선언

클래스 선언은 매니페스트에서 클래스가 호출될 때 발생합니다. 클래스 선언은 Puppet에게 클래스 내의 코드를 평가하도록 지시합니다. 클래스 선언은 일반 및 리소스와 같은 두 가지 다른 방식으로 제공됩니다.

다음과 같이 Puppet 코드에서 include 키워드가 사용될 때 일반 클래스 선언이 발생합니다.

include example_class

이렇게 하면 Puppet이 example_class의 코드를 평가하게 됩니다.

자원 유사 클래스 선언은 다음과 같이 클래스가 자원처럼 선언될 때 발생합니다.

class { 'example_class': }

리소스와 유사한 클래스 선언을 사용하면 클래스 속성의 기본값을 재정의하는 클래스 매개변수를 지정할 수 있습니다. 전제 조건 자습서를 따랐다면 host2에 Apache를 설치하기 위해 PuppetLabs Apache 모듈을 사용할 때 리소스와 유사한 클래스 선언("apache\ 클래스)을 이미 사용한 것입니다.

node 'host2' {
  class { 'apache': }             # use apache module
  apache::vhost { 'example.com':  # define vhost resource
    port    => '80',
    docroot => '/var/www/html'
  }
}

이제 리소스, 매니페스트 및 클래스에 대해 알았으므로 모듈에 대해 배우고 싶을 것입니다.

모듈

모듈은 매니페스트 및 데이터(예: 팩트, 파일 및 템플릿)의 모음이며 특정 디렉터리 구조를 가집니다. 모듈은 코드를 여러 매니페스트로 분할할 수 있기 때문에 Puppet 코드를 구성하는 데 유용합니다. 모듈을 사용하여 거의 모든 Puppet 매니페스트를 구성하는 것이 모범 사례로 간주됩니다.

Puppet에 모듈을 추가하려면 모듈을 /etc/puppet/modules 디렉터리에 배치합니다.

자신만의 기본 모듈을 작성하는 데 필요한 세부 사항을 다룰 것입니다. 자세한 내용을 알아보려면 PuppetLabs Module Fundamentals 참조 가이드를 확인하십시오.

매니페스트 개발

Puppet 매니페스트, 클래스 및 모듈을 작성하는 방법을 시연하기 위해 Puppet을 사용하여 Ubuntu에서 LAMP 스택을 설정합니다(이 자습서의 설정과 유사). 이전에 LAMP 스택을 설정한 적이 없는 경우 링크된 자습서를 실행하여 수동으로 설정하는 방법을 익히고 싶을 것입니다.

LAMP 스택 자습서에서 우리는 다음 리소스가 있는 Ubuntu 14.04 서버가 필요하다는 것을 알고 있습니다.

  • Apache 패키지(apache2) 설치됨
  • Apache 서비스(apache2) 실행 중
  • MySQL 서버 패키지(mysql-server) 설치됨
  • MySQL 서버 서비스(mysql) 실행 중
  • PHP5 패키지(php5) 설치됨
  • 테스트 PHP 스크립트 파일(info.php)
  • 패키지를 설치하기 전에 apt 업데이트

다음 세 섹션에서는 Puppet을 사용하여 작동하는 LAMP 서버와 유사한 결과를 얻는 다양한 방법을 보여줍니다. 첫 번째 예는 모두 하나의 파일에 있는 기본 매니페스트를 작성하는 방법을 보여줍니다. 두 번째 예는 첫 번째 예에서 개발된 매니페스트를 기반으로 클래스와 모듈을 빌드하고 사용하는 방법을 보여줍니다. 마지막으로 세 번째 예에서는 공개적으로 사용 가능한 기존 모듈을 사용하여 유사한 LAMP 스택을 쉽고 빠르게 설정하는 방법을 보여줍니다. 세 가지 예를 모두 시도하고 싶다면 학습 목적으로 매번 새로운 VPS(전제 조건에 설명된 대로)로 시작하는 것이 좋습니다.

예 1: 단일 매니페스트로 LAMP 설치

이전에 Puppet 매니페스트를 작성해 본 적이 없다면 이 예제를 시작하는 것이 좋습니다. 매니페스트는 Puppet 에이전트 노드에서 개발되고 puppet apply를 통해 실행되므로 에이전트/마스터 설정이 필요하지 않습니다.

다음 유형의 리소스 선언을 사용할 매니페스트를 작성하는 방법을 배웁니다.

  • exec: apt-get과 같은 명령 실행
  • 패키지: apt를 통해 패키지를 설치하려면
  • 서비스: 서비스가 실행 중인지 확인
  • 파일: 특정 파일이 존재하는지 확인하기 위해

매니페스트 만들기

새로운 lamp-1 VPS에서 새 매니페스트를 만듭니다.

sudo vi /etc/puppet/manifests/lamp.pp

다음 줄을 추가하여 원하는 리소스를 선언합니다. 인라인 주석은 각 리소스 선언에 대해 자세히 설명합니다.

# execute 'apt-get update'
exec { 'apt-update':                    # exec resource named 'apt-update'
  command => '/usr/bin/apt-get update'  # command this resource will run
}

# install apache2 package
package { 'apache2':
  require => Exec['apt-update'],        # require 'apt-update' before installing
  ensure => installed,
}

# ensure apache2 service is running
service { 'apache2':
  ensure => running,
}

# install mysql-server package
package { 'mysql-server':
  require => Exec['apt-update'],        # require 'apt-update' before installing
  ensure => installed,
}

# ensure mysql service is running
service { 'mysql':
  ensure => running,
}

# install php5 package
package { 'php5':
  require => Exec['apt-update'],        # require 'apt-update' before installing
  ensure => installed,
}

# ensure info.php file exists
file { '/var/www/html/info.php':
  ensure => file,
  content => '<?php  phpinfo(); ?>',    # phpinfo code
  require => Package['apache2'],        # require 'apache2' package before creating
} 

저장 및 종료.

매니페스트 적용

이제 puppet apply 명령을 사용하여 매니페스트를 실행하려고 합니다. lamp-1에서 다음을 실행합니다.

sudo puppet apply --test

매니페스트의 리소스 선언과 일치하도록 서버 상태가 어떻게 변경되는지 보여주는 많은 출력 라인을 볼 수 있습니다. 오류가 없으면 퍼블릭 IP 주소(또는 도메인 이름을 설정한 경우)를 방문하여 Apache와 PHP가 작동 중임을 나타내는 PHP 정보 페이지를 볼 수 있습니다. 서버에 MySQL이 설치되어 있는지도 확인할 수 있습니다(보안이 설정되지 않았지만 지금은 이에 대해 걱정하지 않겠습니다). 축하해요! Puppet으로 LAMP 스택을 설정합니다.

에이전트/마스터 설정을 활용하지 않았기 때문에 이 특정 설정은 그리 흥미롭지 않습니다. 매니페스트는 현재 다른 에이전트 노드에서 사용할 수 없으며 Puppet은 서버가 매니페스트에 설명된 상태에 있는지 지속적으로(30분마다) 확인하지 않습니다.

이제 방금 개발한 매니페스트를 모듈로 변환하여 다른 Puppet 노드에서 사용할 수 있도록 하려고 합니다.

예 2: 새 모듈을 생성하여 LAMP 설치

이제 예제 1에서 개발한 LAMP 매니페스트를 기반으로 기본 모듈을 만들어 보겠습니다. 이번에는 Puppet 마스터 노드에서 이 작업을 수행합니다. 모듈을 생성하려면 Puppet의 modules 디렉토리에 디렉토리(모듈 이름과 일치하는 이름)를 생성해야 하며 manifests라는 디렉토리를 포함해야 합니다. init.pp 파일을 포함합니다. init.pp 파일은 모듈 이름과 일치하는 Puppet 클래스만 포함해야 합니다.

모듈 생성

Puppet master에서 lamp라는 모듈의 디렉토리 구조를 만듭니다.

cd /etc/puppet/modules
sudo mkdir -p lamp/manifests

이제 모듈의 init.pp 파일을 만들고 편집합니다.

sudo vi lamp/manifests/init.pp

이 파일 내에서 다음 줄을 추가하여 "lamp\라는 클래스에 대한 블록을 추가합니다.

class lamp {

}

이전에 생성한 LAMP 매니페스트의 내용을 복사(또는 위의 예 1에서 복사)하여 lamp 클래스 블록에 붙여넣습니다. 이 파일에서 "lamp\ 클래스에 대한 클래스 정의를 생성했습니다. 클래스 내의 코드는 현재 평가되지 않지만 선언할 수 있습니다. 또한 정의를 위한 Puppet 규칙을 준수하기 때문에 모듈, 이 클래스는 다른 매니페스트에서 모듈로 액세스할 수 있습니다.

저장 및 종료.

메인 매니페스트에서 모듈 사용

이제 기본 램프 모듈이 설정되었으므로 이를 사용하여 lamp-1에 LAMP 스택을 설치하도록 기본 매니페스트를 구성하겠습니다.

Puppet 마스터에서 기본 매니페스트를 편집합니다.

sudo vi /etc/puppet/manifests/site.pp

파일이 비어 있다고 가정하고 다음 노드 블록을 추가합니다("lamp-1\을 LAMP를 설치하려는 Puppet 에이전트의 호스트 이름으로 바꿉니다).

node default { }

node 'lamp-1' {

}

노드 블록을 사용하면 특정 에이전트 노드에만 적용되는 Puppet 코드를 지정할 수 있습니다. 기본 노드는 지정된 노드 블록이 없는 모든 에이전트 노드에 적용되며 비워 둡니다. lamp-1 노드 블록은 lamp-1 Puppet 에이전트 노드에 적용됩니다.

lamp-1 노드 블록에서 방금 생성한 "lamp\ 모듈을 사용하기 위해 다음 코드를 추가합니다.

  include lamp

이제 저장하고 종료합니다.

다음에 lamp-1 Puppet 에이전트 노드가 마스터에서 해당 구성을 가져오면 기본 매니페스트를 평가하고 LAMP 스택 설정을 지정하는 모듈을 적용합니다. 즉시 사용해 보려면 lamp-1 에이전트 노드에서 다음 명령을 실행하십시오.

sudo puppet agent --test

완료되면 예제 1과 똑같이 기본 LAMP 스택이 설정되었음을 확인할 수 있습니다. Apache와 PHP가 작동하는지 확인하려면 a에서 lamp-1의 공용 IP 주소로 이동합니다. 웹 브라우저:

http://lamp_1_public_IP/info.php

PHP 설치에 대한 정보 페이지가 표시되어야 합니다.

생성한 "램프\ 모듈은 다른 노드 블록에 선언하여 재사용할 수 있습니다. 모듈을 사용하는 것이 Puppet 코드 재사용을 촉진하는 가장 좋은 방법이며 논리적인 방식으로 코드를 구성하는 데 유용합니다.

이제 유사한 설정을 달성하기 위해 기존 모듈을 사용하는 방법을 보여드리겠습니다.

예 3: 기존 모듈과 함께 LAMP 설치

자체 인프라를 개발하려고 할 때 유용할 수 있는 Puppet Forge에는 공개적으로 사용 가능한 모듈 저장소가 있습니다. Puppet Forge 모듈은 내장된 puppet module 명령으로 빠르게 설치할 수 있습니다. Apache 및 MySQL을 설치하고 유지 관리하기 위한 모듈을 여기에서 사용할 수 있습니다. LAMP 스택을 설정하는 데 어떻게 사용할 수 있는지 시연합니다.

Apache 및 MySQL 모듈 설치

Puppet 마스터에서 puppetlabs-apache 모듈을 설치합니다.

sudo puppet module install puppetlabs-apache

모듈이 올바르게 설치되었음을 나타내는 다음 출력이 표시됩니다.

Notice: Preparing to install into /etc/puppetlabs/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ puppetlabs-apache (v1.0.1)
  ├── puppetlabs-concat (v1.0.0) [/etc/puppet/modules]
  └── puppetlabs-stdlib (v3.2.0) [/etc/puppet/modules]

또한 puppetlabs-mysql 모듈을 설치합니다.

sudo puppet module install puppetlabs-mysql

이제 apachemysql 모듈을 사용할 수 있습니다!

기본 매니페스트 편집

이제 새 모듈을 사용하여 LAMP 스택을 설치하도록 기본 매니페스트를 편집하겠습니다.

Puppet 마스터에서 기본 매니페스트를 편집합니다.

sudo vi /etc/puppet/manifests/site.pp

파일이 비어 있다고 가정하고 다음 노드 블록을 추가합니다(예제 2를 따른 경우 lamp-1 노드 블록의 내용만 삭제).

node default { }

node 'lamp-1' {

}

lamp-1 노드 블록 내에서 리소스와 유사한 클래스 선언을 사용하여 apache 모듈을 사용합니다(인라인 주석은 각 행을 설명합니다).

  class { 'apache':                # use the "apache" module
    default_vhost => false,        # don't use the default vhost
    default_mods => false,         # don't load default mods
    mpm_module => 'prefork',        # use the "prefork" mpm_module
  }
   include apache::mod::php        # include mod php
   apache::vhost { 'example.com':  # create a vhost called "example.com"
    port    => '80',               # use port 80
    docroot => '/var/www/html',     # set the docroot to the /var/www/html
  }

apache 모듈은 모듈의 기본 동작을 재정의하는 매개변수를 전달할 수 있습니다. 모듈이 생성하는 기본 가상 호스트를 비활성화하고 PHP를 사용할 수 있는 가상 호스트를 생성하는지 확인하는 몇 가지 기본 설정을 전달하고 있습니다. PuppetLabs-Apache 모듈에 대한 전체 설명서는 readme를 확인하십시오.

MySQL 모듈을 사용하는 것은 Apache 모듈을 사용하는 것과 유사합니다. 이 시점에서 실제로 데이터베이스를 사용하지 않기 때문에 간단하게 유지하겠습니다. 노드 블록 내에 다음 줄을 추가합니다.

  class { 'mysql::server':
    root_password => 'password',
  }

Apache 모듈과 마찬가지로 MySQL 모듈은 매개변수를 전달하여 구성할 수 있습니다(전체 문서는 여기.

이제 info.php가 적절한 위치에 복사되도록 하는 파일 리소스를 추가해 보겠습니다. 이번에는 source 매개변수를 사용하여 복사할 파일을 지정합니다. 노드 블록 내에 다음 줄을 추가합니다.

  file { 'info.php':                                # file resource name
    path => '/var/www/html/info.php',               # destination path
    ensure => file,
    require => Class['apache'],                     # require apache class be used
    source => 'puppet:///modules/apache/info.php',  # specify location of file to be copied
  }

이 파일 리소스 선언은 이전과 약간 다릅니다. 주요 차이점은 content 매개변수 대신 source 매개변수를 지정한다는 것입니다. Source는 puppet에게 단순히 파일 내용을 지정하는 대신 파일을 복사하도록 지시합니다. 지정된 소스 puppet:///modules/apache/info.php는 Puppet에 의해 /etc/puppet/modules/apache/files/info.php로 해석됩니다. 따라서 이 리소스 선언이 제대로 작동하려면 소스 파일을 만들어야 합니다.

site.pp를 저장하고 종료합니다.

다음 명령을 사용하여 info.php 파일을 만듭니다.

sudo sh -c 'echo "<?php  phpinfo(); ?>" > /etc/puppet/modules/apache/files/info.php'

다음에 lamp-1 Puppet 에이전트 노드가 마스터에서 해당 구성을 가져오면 기본 매니페스트를 평가하고 LAMP 스택 설정을 지정하는 모듈을 적용합니다. 즉시 사용해 보려면 lamp-1 에이전트 노드에서 다음 명령을 실행하십시오.

sudo puppet agent --test

완료되면 예제 1과 똑같이 기본 LAMP 스택이 설정되었음을 확인할 수 있습니다. Apache와 PHP가 작동하는지 확인하려면 a에서 lamp-1의 공용 IP 주소로 이동합니다. 웹 브라우저:

http://lamp_1_public_IP/info.php

PHP 설치에 대한 정보 페이지가 표시되어야 합니다.

결론

축하해요! Puppet을 사용하여 Ubuntu 14.04 LAMP 스택을 설정했습니다.

이제 Puppet 코드의 기본 사항에 익숙하고 기본 매니페스트 및 모듈을 작성할 수 있으므로 Puppet을 사용하여 환경의 다른 측면을 구성해야 합니다.

시작하기 좋은 곳은 Puppet을 사용하여 시스템 사용자와 애플리케이션 구성 파일을 관리하는 것입니다. Puppet을 사용하여 리소스를 관리하는 경우 Puppet 마스터 서버에서 해당 특정 리소스를 변경해야 합니다. 그렇지 않으면 다음에 에이전트 노드가 정기적인 카탈로그 풀 요청을 수행할 때 덮어쓰게 됩니다.

행운을 빌어요!