4장. OpenStack Puppet 모듈에 추가 구성
이 장에서는 OpenStack Puppet 모듈에 추가하는 방법을 살펴봅니다. 여기에는 Puppet 모듈 개발에 대한 몇 가지 기본 지침이 포함됩니다.
4.1. Puppet 구문 및 모듈 구조
다음 섹션에서는 Puppet 구문 및 Puppet 모듈의 구조를 이해하는 데 도움이 되는 몇 가지 기본 사항을 제공합니다.
4.1.1. Puppet 모듈 분석
OpenStack 모듈에 기여하기 전에 Puppet 모듈을 생성하는 구성 요소를 이해해야 합니다.
- CrashLoopBackOffmanifests
매니페스트는 리소스 집합 및 해당 속성을 정의하는 코드가 포함된 파일입니다. 리소스는 시스템의 구성 가능한 부분입니다. 리소스의 예로는 패키지, 서비스, 파일, 사용자, 그룹, SELinux 구성, SSH 키 인증, cron 작업 등이 있습니다. 매니페스트는 특성에 키-값 쌍 세트를 사용하여 각 필수 리소스를 정의합니다.
package { 'httpd': ensure => installed, }
예를 들어 이 선언은
httpd
패키지가 설치되었는지 확인합니다. 그렇지 않은 경우 매니페스트는dnf
를 실행하고 설치합니다. 매니페스트는 모듈의 매니페스트 디렉터리에 있습니다. Puppet 모듈은 테스트 매니페스트에 테스트 디렉터리를 사용합니다. 이러한 매니페스트는 공식 매니페스트에 있는 특정 클래스를 테스트하는 데 사용됩니다.- 클래스
- 클래스는 매니페스트에 여러 리소스를 통합합니다. 예를 들어 HTTP 서버를 설치하고 구성하는 경우 세 가지 리소스(HTTP 서버 패키지를 설치하는 방법, HTTP 서버를 구성하는 방법, 서버를 시작하거나 활성화하는 클래스)를 생성할 수 있습니다. 또한 해당 구성에 적용되는 다른 모듈의 클래스를 참조할 수도 있습니다. 예를 들어 웹 서버도 필요한 애플리케이션을 구성하려면 HTTP 서버에 대해 이전에 언급된 클래스를 참조할 수 있습니다.
- 정적 파일
모듈에는 Puppet에서 시스템의 특정 위치에 복사할 수 있는 정적 파일이 포함될 수 있습니다. 매니페스트에서 파일 리소스 선언을 사용하여 위치 및 권한과 같은 기타 속성을 정의합니다.
정적 파일은 모듈의 파일 디렉터리에 있습니다.
- behindtemplates
구성 파일에 사용자 지정 콘텐츠가 필요한 경우가 있습니다. 이 경우 사용자는 정적 파일 대신 템플릿을 생성합니다. 정적 파일과 마찬가지로 템플릿은 매니페스트에 정의되어 시스템의 위치에 복사됩니다. 차이점은 템플릿을 통해 Ruby 표현식이 사용자 정의 콘텐츠 및 변수 입력을 정의할 수 있다는 것입니다. 예를 들어 사용자 지정 가능한 포트를 사용하여 httpd를 구성하려면 구성 파일의 템플릿에 다음이 포함됩니다.
Listen <%= @httpd_port %>
이 경우
httpd_port
변수는 이 템플릿을 참조하는 매니페스트에 정의되어 있습니다.템플릿은 모듈의 템플릿 디렉터리에 있습니다.
- Plugins
Puppet의 핵심 기능을 넘어 확장할 수 있는 측면에 대한 플러그인을 사용합니다. 예를 들어 플러그인을 사용하여 사용자 지정 팩트, 사용자 지정 리소스 또는 새 함수를 정의할 수 있습니다. 예를 들어 데이터베이스 관리자에게 PostgreSQL 데이터베이스의 리소스 유형이 필요할 수 있습니다. 데이터베이스 관리자가 PostgreSQL을 설치한 후 새 데이터베이스 세트로 PostgreSQL을 채울 수 있습니다. 따라서 데이터베이스 관리자는 PostgreSQL 설치 및 데이터베이스 생성 후 생성되도록 하는 Puppet 매니페스트만 생성해야 합니다.
플러그인은 모듈의 lib 디렉터리에 있습니다. 여기에는 플러그인 유형에 따라 하위 디렉터리 세트가 포함됩니다.
-
/lib/facter
- 사용자 지정 팩트의 위치입니다. -
/lib/puppet/type
- 특성의 키-값 쌍을 간략하게 설명하는 사용자 정의 리소스 유형 정의 위치입니다. -
/lib/puppet/provider
- 리소스를 제어하는 데 리소스 유형 정의와 함께 사용되는 사용자 정의 리소스 공급자의 위치입니다. -
/lib/puppet/parser/functions
- 사용자 정의 함수의 위치입니다.
-
4.1.2. 서비스 설치
일부 소프트웨어에는 패키지 설치가 필요합니다. 이는 Puppet 모듈이 수행할 수 있는 하나의 기능입니다. 이를 위해서는 특정 패키지에 대한 구성을 정의하는 리소스 정의가 필요합니다.
예를 들어 mymodule
모듈을 통해 httpd
패키지를 설치하려면 mymodule
모듈의 Puppet 매니페스트에 다음 콘텐츠를 추가합니다.
class mymodule::httpd { package { 'httpd': ensure => installed, } }
이 코드는 httpd
라는 mymodule
의 하위 클래스를 정의한 다음 httpd
패키지에 대한 패키지 리소스 선언을 정의합니다. ensure => installed
속성은 패키지가 설치되었는지 확인하도록 Puppet에 지시합니다. 설치되지 않은 경우 Puppet은 yum
을 실행하여 설치합니다.
4.1.3. 서비스 시작 및 활성화
패키지를 설치한 후 서비스를 시작할 수 있습니다. service
라는 다른 리소스 선언을 사용합니다. 다음 콘텐츠를 사용하여 매니페스트를 편집합니다.
class mymodule::httpd { package { 'httpd': ensure => installed, } service { 'httpd': ensure => running, enable => true, require => Package["httpd"], } }
결과는 다음과 같습니다.
-
ensure => running
속성은 서비스가 실행 중인지 확인합니다. 그렇지 않으면 Puppet에서 활성화합니다. -
enable => true
특성은 시스템이 부팅될 때 서비스가 실행되도록 설정합니다. -
require => Package["httpd"]
속성은 하나의 리소스 선언과 다른 리소스 선언 간의 순서 관계를 정의합니다. 이 경우httpd
패키지를 설치한 후httpd
서비스가 시작되는지 확인합니다. 이렇게 하면 서비스와 해당 패키지 간에 종속성이 생성됩니다.
4.1.4. 서비스 구성
HTTP 서버는 포트 80에서 웹 호스트를 제공하는 /etc/httpd/conf/httpd.conf
에 몇 가지 기본 구성을 제공합니다. 그러나 사용자 지정 포트에 추가 웹 호스트를 제공하기 위해 구성을 추가할 수 있습니다.
절차
사용자 정의 포트에 변수 입력이 필요하므로 템플릿 파일을 사용하여 HTTP 구성 파일을 저장해야 합니다. 모듈 템플릿 디렉터리에서 다음 내용이 포함된
myserver.conf.erb
파일을 추가합니다.Listen <%= @httpd_port %> NameVirtualHost *:<%= @httpd_port %> <VirtualHost *:<%= @httpd_port %>> DocumentRoot /var/www/myserver/ ServerName *:<%= @fqdn %>> <Directory "/var/www/myserver/"> Options All Indexes FollowSymLinks Order allow,deny Allow from all </Directory> </VirtualHost>
이 템플릿은 Apache 웹 서버 구성의 표준 구문을 따릅니다. 유일한 차이점은 Ruby 이스케이프 문자를 포함하여 모듈에서 변수를 삽입하는 것입니다. 예를 들어 웹 서버 포트를 지정하는 데 사용하는
httpd_port
입니다.fqdn
이 포함된 변수는 시스템의 정규화된 도메인 이름을 저장하는 변수입니다. 이것을 시스템 팩트 라고 합니다. 시스템 팩트는 시스템의 각 Puppet 카탈로그를 생성하기 전에 각 시스템에서 수집됩니다. Puppet은facter
-
myserver.conf.erb
를 저장합니다. 모듈의 Puppet 매니페스트에 리소스를 추가합니다.
class mymodule::httpd { package { 'httpd': ensure => installed, } service { 'httpd': ensure => running, enable => true, require => Package["httpd"], } file {'/etc/httpd/conf.d/myserver.conf': notify => Service["httpd"], ensure => file, require => Package["httpd"], content => template("mymodule/myserver.conf.erb"), } file { "/var/www/myserver": ensure => "directory", } }
결과는 다음과 같습니다.
-
서버 구성 파일
(/etc/httpd/conf.d/myserver.conf
)에 대한 파일 리소스 선언을 추가합니다. 이 파일의 내용은 생성한myserver.conf.erb
템플릿입니다. -
이 파일을 추가하기 전에
httpd
패키지가 설치되었는지 확인합니다. -
웹 서버에 대한 디렉터리
/var/www/myserver
를 생성하는 두 번째 파일 리소스 선언을 추가합니다. -
notify => Service["
서비스 간의 관계를 추가합니다. 이렇게 하면 구성 파일에서 변경 사항이 있는지 확인합니다. 파일이 변경되면 Puppet에서 서비스를 다시 시작합니다.httpd
"] 속성을 사용하여 구성 파일과 httpd