본문 바로가기
DevOps/IaC 자동화

[Puppet] 퍼펫 실행 Resource, Class, Manifest, Node 사용법

by 🌻♚ 2021. 1. 11.

Puppet 실행

Puppet은 자체적으로 제공되는 언어를 사용하여 스크립트를 작성한다. 작성한 스크립트를 기반으로 관리되고 있는 Host에 명령을 내리고 인프라를 코드화하여 관리할 수 있다. Puppet 스크립트는 .pp 확장자를 갖고 Manifest 파일이라고도 한다.

 

이번 글에서는 Puppet Script에서 사용되는 Resource, Class, Manifest 그리고 Node에 대한 개념을 알아보고 Nginx를 설치하고 Nginx 홈페이지의 html파일을 받아와서 index로 정의하는 예제를 진행해보겠습니다.

 

Puppet에 대한 기본 개념이 필요하거나 Puppet설치가 안되어있으면 실습환경을 위해 아래 글을 통해 설치가능합니다.

 

 

[Puppet] 퍼펫 소개 및 설치

Puppet이란?  Puppet은 ruby로 만들어진 시스템 관리 자동화 툴이다. 주로 설정, 관리, 배포, orchestrate와 같은 일을 하기 위해 사용된다. puppet을 사용하는 이유는 반복되는 업무를 자동화하기 위함이

myjamong.tistory.com

 

실습환경

os : CentOS 7.8
hostnames:
  master.puppet.test
  node01.puppet.test
  node02.puppet.test
puppet version : 5.5.22

puppet master와 2개의 agent로 구성합니다.

 

 

Puppet Script 실행 프로세스

Puppet script를 실행하는 프로세스

  1. puppet script 작성한다.(create nginx.pp)
  2. puppet script가 문법상 문제가 없는지 검사한다. (puppet parser validate nginx.pp)
  3. Dry run을 통해서 모의 실행한다. (puppet apply nginx.pp --noop)
  4. Puppet script를 실행한다. (puppet apply nginx.pp)

무조건 지켜야하는 부분은 아니지만, 위의 4 단계에 걸쳐 실행하는 것이 안전하고 오류없이 puppet script를 실행하는 방법입니다. 아래 예시에서 실행하는 모든 절차는 위의 프로세스를 기반으로 실행합니다.

 

Resource

Resource는 puppet 아키텍처의 기본 구성요소이고 puppet agent에서 작동되는 모든 작업은 puppet resource를 통해서 진행됩니다. 서버를 제어하기 위한 일종의 function과 비슷합니다. 기본적으로 puppet이 제공해주는 Resource도 존재하고 직접 Resource를 정의하여 사용할 수 도 있습니다. Resource는 개별적으로 사용이가능하고 조합을 통해 복잡한 수행 과정을 실행할 수도 있습니다.

 

대표적으로 file, package, service와 같은 Resource가 존재하고 이름처림 file, package, service를 제어할 수 있는 Resource입니다. 

 

puppet resource --type

위의 명령어를 통해서 puppet에서 기본적으로 정의해 놓은 Resource들을 확인할 수 있습니다. 해당 Resource들에 대해서 자세한 사용법을 알아보기 위해서는 2가지 방법이 있습니다.

 

puppet describe 명령

puppet describe file

describe 명령어를 사용하면 Command line 상에서 사용할 수 있는 옵션과 용도를 확인할 수 있습니다.

 

puppet documentation

 

Resource Type: file | Puppet

Puppet automates away the challenges, complexity, and risk of securing and running global hybrid and cloud-native infrastructure, so you can focus on delivering the next great thing.

puppet.com

두번 째 방법은 puppet documentation을 통해 사용방법을 확인할 수 있습니다.

 

nginx 설치 실습

실습은 master node에서 진행한다.

Puppet script 생성

nginx.pp

package { 'nginx':
  ensure => 'present'
} ->

package { 'wget':
  ensure => 'present'
} ->

exec { 'download nginx index':
  cwd => '/usr/share/nginx/html/',
  command => '/bin/wget https://www.nginx.com -O /usr/share/nginx/html/index.html',
} ->

service { 'nginx':
  ensure => 'running'
}

nginx를 설치하고 nginx 홈페이지 index.html을 받아서 web server에 위치시키고 nginx 서버를 실행하는 puppet 파일입니다.

문법의 구조를 보면 '{}'를 사용하여 앞에 Resource를 정의해서 어떤 작업을 하는지 알아보기 쉽게 되어 있습니다. 각 Resource에 대한 파라미터는 describe 명령어나 documentation을 확인하여 활용법을 알 수 있습니다.

 

nginx.pp 파일에서 사용되는 파리미터는...

package ensure present : 없으면 설치하고, 있으면 설치하지 않는다.

exe cwd: command가 실행되는 위치

exe command: 실행할 command

service ensure running : 서비스가 실행되어 있는 상태

 

여기서 중요하게 봐야할 부분은 Resource 사이사이에 '->' 입니다. '->'없이도 문제없이 잘 돌아갑니다. 하지만 순서는 모두 동시에 실행됩니다. '->' 문자를 사용해서 실행되는 순서를 정해줍니다. 필요에따라 꼭 선행되어야하는 작업이 있을 수 있습니다. nginx 설치 부분에서도 package가 설치 된 후에, 파일을 받아야합니다. 여러 상황을 고려하여 '->'문자를 유용하게 사용할 수 있습니다.

Puppet script 검사

puppet parser validate nginx.pp

에러로그가 발생하지않으면 문법상 문제가 없는 스크립트입니다.

 

Puppet script Dry run

puppet apply nginx.pp --noop

apply명령으로 직업 스크립트를 실행할 수 있고 --noop 옵션을 사용하여 실제로 실행되지 않는 dry run을 할 수 있습니다.

로그의 내용을 보면 현재 값과 변경되어야할 값을 확인할 수 있습니다. 실제로 실행하기 이전에 이상없이 실행되는 것을 확인하기 위해 Dry run을 진행합니다.

 

Puppet script 실행

puppet apply nginx.pp

 

실행이 완료되었고 이제 브라우저에서 master node에 붙어서 nginx서버가 정상적으로 실행되어 있는지 확인한다.

문제가 없다면 위와 같이 nginx 홈페이지와 동일한 html을 갖고 서버가 정상적으로 실행되었을 것이다.

 

만약 한번 더 실행하면 어떻게 될까?

한번 더 실행되었을 때는 exec Resource에 대한 부분만 실행됩니다. Puppet은 멱등성이라는 특징때문에 항상 같은 결과를 반환해주는 성질을 갖고 있습니다. exec의 경우 command를 실행하는 작업이기 때문에 실행되었지만,... 나머지 package나 service에 대한 Resource는 실행되지 않았습니다. 이미 실행된 부분이기 때문에 넘어갑니다.

 

 

Class

지금까지는 puppet의 Resource들을 조합해서 puppet script를 작성했습니다. 만약 puppet 코드가 복잡해지고 계속해서 Resource들만 나열해서 스크립트를 작성하면, 알아보기도 어렵고 코드의 재사용도 불가능하고 관리적인 측면에 있어서 비효율적입니다. 이러한 문제를 해결하기 위해 Resource들을 하나의 목적을 갖는 작업으로 묶고 관리하기 위해 Class를 사용한다.

 

Nginx 삭제

yum remove nginx -y

 

nginx 설치 실습

실습은 master node에서 진행한다.

 

Puppet script 생성

nginx.pp

class nginx_install {
  package { 'nginx':
    ensure => 'present'
  } ->
  
  package { 'wget':
    ensure => 'present'
  } ->

  exec { 'download nginx index':
    cwd => '/usr/share/nginx/html/',
    command => '/bin/wget https://www.nginx.com -O /usr/share/nginx/html/index.html',
  } ->

  service { 'nginx':
    ensure => 'running'
  }
}
include nginx_install

nginx 설치하는 class를 생성했습니다. 보시는 코드와 같이 위에서 Resource 실습한 부분에서 class로만 묶어주고 하단에 include 명령을 사용 class에 정의되어 있는 내용을 실행합니다. puppet script에 class를 사용한다면 객체지향형 프로그래밍의 개념이 도입되고 코드의 재사용이 가능합니다.

 

마찬가지로 Puppet script 검사, Dry run, 실행 순서대로 실행해주고 확인합니다.

Puppet script 검사

puppet parser validate nginx.pp

 

Puppet script Dry run

puppet apply nginx.pp --noop

 

Puppet script 실행

puppet apply nginx.pp

 

Manifest

지금까지는 puppet script를 아무 위치에서 실행하고 있었습니다. puppet에서는 지정된 곳에 puppet script를 생성하도록 정의되어 있습니다. manifest를 사용하는 단계에서 puppet의 master와 agent에 대한 개념을 잘 이해야합니다. puppet은 pull based 자동화 관리 툴입니다. Ansible처럼 Ansible이 설치되어 있는 Host에서 관리되는 host에 명령을 하는 것이아니라, agent가 수시로 master에게 해야할 일을 물어보고 적용하는 관계를 갖습니다. 즉, agent가 무엇을 해야하는지 master에게 물어볼때, 바라오는 곳이 바로 manifest directory 입니다.

 

agent에 실행하려는 puppet manifest를 master의 manifest directory에 위치시켜주면 실행하게됩니다.

 

puppet config print

해당 명령을 통해서 puppetserver의 모든 환경설정을 확인할 수 있습니다.

 

puppet config print | grep manifest

config의 정보에서 manifest를 찾아보면 manifest의 경로를 확인할 수 있습니다.

'/etc/puppetlabs/code/environmets/' 해당 경로아래 Host가 속해있는 environment 폴더를 생성해주고 manifests 폴더를 안에 생성해서 puppet manifest을 작성해서 넣어주면 runinterval 주기마다 혹은 puppet agent -t 명령이 실행될 때 agent가 master에게 작업을 요청하여 실행합니다.

 

runinterval도 config중 하나이고, 해당 설정은 /etc/puppetlabs/puppet/puppet.conf 파일에 정의하거나 수정하여 변경할 수 있습니다. 변경 후에는 puppetserver를 재시작해줍니다.

 

 

site.pp

실습을 진행하기 이전에 site manifest에 대해서 조금 알아보자.

manifest 경로안에 여러개의 파일이 있는 경우 어떻게 될까? puppet에서는 site.pp라는 파일을 agent가 master의 manifest를 확인할 때 가장 처음 확인하는 파일이다. community 버전에서는 파일을 생성해줘야한다. 가장 널리 사용되는 방식이라고 한다면 여러 파일에 각각 class와 Resource을 사용해서 manifest를 생성해주고 site.pp에 include 명령을 통해서 실행하는 main manifest 정도로 생각하면 된다.

 

Nginx 삭제

yum remove nginx -y

 

nginx 설치 실습

agent puppet.conf

[main]
certname = node01.puppet.test
environment = node
server = master.puppet.test
runinterval = 600

agent에 /etc/puppetlabs/puppet/puppet.conf 설정파일의 내용이다.

보면 environment = node로 지정해줬는데 이는 master에 요청할 때 /etc/puppetlabs/code/environments/node/manifest아래 있는 puppet manifest를 실행하겠다는 의미이다.

 

master /etc/puppetlabs/code/environments/node/manifest puppet script 생성

nginx.pp

class nginx_install {
  package { 'nginx':
    ensure => 'present'
  } ->

  package { 'wget':
    ensure => 'present'
  } ->

  exec { 'download nginx index':
    cwd => '/usr/share/nginx/html/',
    command => '/bin/wget https://www.nginx.com -O /usr/share/nginx/html/index.html',
  } ->

  service { 'nginx':
    ensure => 'running'
  }
}

 

site.pp

include nginx_install

 

Puppet script 검사

master에서 진행한다.

puppet parser validate nginx.pp
puppet parser validate site.pp

 

Puppet script Dry run

agent에서 진행한다.

puppet agent -t --noop

일반 puppet script를 생성해서 실행하는 것과 다르게 master가 아닌 실제 반영하는 host에 접속해서 puppet agent -t 명령을 실행해서 apply를 진행한다. 

 

 

Puppet script 실행

puppet agent -t

실행 후 반영 확인한다.

 

 

Node

Node는 어떤 Host에 작업을 반영할지 정의할 때 사용한다. 예를 들어서 현재 node로 이름이 되어있는 environment에 node01.puppet.test, node02.puppet.test 두개의 host가 있다. 그런데 node01에만 적용하고 싶은 경우에 사용할 수 있다. agent에서 master에게 작업을 요청할때 manifest에 자신의 host를 찾아가는 느낌으로 이해하면 될것이다.

 

Nginx 삭제

yum remove nginx -y

 

nginx 설치 실습

Puppet script 생성

nginx.pp

 

class nginx_install {
  package { 'nginx':
    ensure => 'present'
  } ->
  
  package { 'wget':
    ensure => 'present'
  } ->

  exec { 'download nginx index':
    cwd => '/usr/share/nginx/html/',
    command => '/bin/wget https://www.nginx.com -O /usr/share/nginx/html/index.html',
  } ->

  service { 'nginx':
    ensure => 'running'
  }
}
include nginx_install

 

site.pp

node "node01.puppet.test" {
  include nginx_install
}

node 'default' {

}

 

Puppet script 검사

master에서 진행한다.

puppet parser validate nginx.pp
puppet parser validate site.pp

 

Puppet script 실행

편의 상 dry run은 생략한다.

puppet agent -t

puppet을 node01과 node02, 모든 agent에서 실행해본다.

결론적으로 node01 agent에서만 nginx가 설치되는 것을 확인할 수 있다.

태그

댓글0