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

[Puppet] 퍼펫 소개 및 설치

by 🌻♚ 2021. 1. 10.

Puppet이란?

 Puppet은 ruby로 만들어진 시스템 관리 자동화 툴이다. 주로 설정, 관리, 배포, orchestrate와 같은 일을 하기 위해 사용된다. puppet을 사용하는 이유는 반복되는 업무를 자동화하기 위함이다. 예를 들어 패키지를 5개의 서버에 설치해야한다고 가정하면... 오랜 시간이 걸리지 않아 반복되는 작업을 직접 붙어서 할 수 있다. 하지만, 만약 100개, 1000개 이상의 서버에 같은 작업을 해야한다면? 직접 하기에는 소요되는 비용이 너무 큽니다. 이러한 이유로 인프라, 데브옵스 엔지니어가 조직의 업무를 자동화하기 위해 많이 사용한다.

 

puppet 주요 특징

Master Agent Pull 기반

시스템 관리 툴은 Pull기반과 Push기반으로 나뉜다. Puppet은 Pull기반 툴이며 Master와 Agent로 구성된다.

puppet처림 시스템을 관리할 수 있는 툴 중에 Push Base 툴은 Ansible이 있다. 용어나 그림에서 알 수 있듯이... Pull Base는 master에게 요청해서 작업해야하는 업무를 확인하는 것이고, Push Base는 Master가 직접 작업을 하달한다. Puppet은 각각 관리하는 서버에 agent 설치가 필요하다. agent는 default 1800초 마다 Master에게 필요한 변경사항을 확인하고 반영한다.

 

Agent 서버는 Linux, Window, Solaris 등 대부분의 OS를 지원하지만, Master서버의 경우 Linux서버 위에 설치되어야한다.

 

DSL 제공, declarative

 Puppet은 DSL(Domain Specific Language)을 제공하고 declarative 프로그래밍을 지원한다. 이 관점에서 imperative vs declarative에 대한 개념을 갖고 있는데... imperative는 모든 작업 과정을 일일히 작업해주는 것이고 declarative는 정의한 내용대로 작업 하는 것이다. 직접 운전하는 것과 자율주행으로 예를 들어보면...

위의 예시처럼 Declarative한 프로그래밍이 Imperative한 프로그래밍 보다 가용성이 높은 상태로 사용이 가능하다. 즉, puppet은 미리 정의한 resource를 기반으로 자체 언어를 제공하여 긴 스크립트를 적은 내용으로 구현 가능하다.

 

 

멱등성

작업을 여러 번 수행해도 항상 결과가 같은 성질을 의미한다. 예를들어 어떤 파일에 "This is first line"이라는 문구를 넣는 작업을 수행했는데 한 번 더 수행했을 때, 해당 문구가 이미 들어가 있기 때문에 한 번 더 수행되지 않고 결과가 같도록 합니다. provision이나 자동화의 개념에서 매우 중요한 성질입니다.

 

 

Puppet 작업 흐름

지금까지 Puppet 의 대략적인 구조와 특징에 대해서 알아봤다면... 이제는 Puppet이 어떻게 동작하는지에 대해서 알아보자.

관리자는 master에 접속해서 agent에 반영 할 puppet code를 작성한다. puppet code작성에 대한 부분은 다음 글에서 다룬다.

puppet code 작성이 완료되면 agent가 master와 통신할 수 있도록 secure certificates를 정의하고 puppet master는 8140포트를 개방하여 통신가능하도록 한다. 여기까지는 작업을 위한 설정과정이고, agent가 master에게 변경작업이 필요한지 확인할 때 아래 흐름대로 작업이 이루어진다.

 

 

  1. 통신이 정의되었다면 agent는 master에게 agent host의 전반적인 정보인 Fact 정보(hostname, kernal detail, ip address 등)를 보낸다.
  2. puppet은 이러한 Fact정보를 이용해서 agent에 반영되어야할 설정 목록인 Catalog(패키지 제어, 계정 제어, 시스템 재시작 등)를 컴파일하고 agent는 받은 Catalog를 기반으로 변경사항을 반영한다.
  3. agent는 이후 master에게 변경 결과 여부를 보고하는 Report를 보낸다.

 

Puppet 설치

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

해당 실습을 진행하기 위해 Vagrant를 이용한 provisioning을 진행했습니다.

서버 환경설정이 새롭게 필요시 Vagrant와 Virtual Box를 이용한 자동환경 생성 후 실습 진행 가능합니다.

Vagrantfile을 포함한 기본 실습 설정내용입니다.

 

myJamong/Vagrant-CentOS-Master-Agent-Base

base vagrant settings for master and alpha agents. Contribute to myJamong/Vagrant-CentOS-Master-Agent-Base development by creating an account on GitHub.

github.com

 

 

 

 yum install -y https://yum.puppetlabs.com/puppet5/puppet5-release-el-7.noarch.rpm

master와 agent 노드 모드 설치해준다.

 

master

 yum install -y puppetserver

puppet server를 설치해준다.

 

 

/etc/puppetlabs/puppet/puppet.conf

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

certname: master와 secure connection을 위한 name

environment: host 구분을 위한 환경 --> manifest 정보를 받아올때 사용

server: puppet master 서버 정의

runinterval: 초단위로 master에게 변경사항 요청하는 시간. default 1800

 

해당 설정에 대한 부분은 master 노드도 agent로 사용하기 위해 설정한다. 다른 agent에서도 비슷하게 설정한다.

 

systemctl start puppetserver
netstat -lntup | grep 8140

8140 포트가 띄워져 있으면 이상없이 puppetserver가 실행됨.

 

필요에 따라 firewall을 해제하거나 8140번 포트를 개방한다.

 

mkdir -p /etc/puppetlabs/code/environments/node/manifest

사용할 environment node의 manifest 경로를 생성해준다. 이후에 agent에서 통신 확인하는 작업 중... 오류가 발생할 수 있으니, 미리 생성해준다.

 

agents

관리할 노드에 각각 puppet agent를 설치하고 설정파일을 수정한다.

해당 예제에서는  node01, node02번 서버에 설정한다.

 

 yum install -y puppet

puppet agent를 설치한다.

 

/etc/puppetlabs/puppet/puppet.conf

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

certname에는 각각 hostname에 맞게 설정한다.

 

설치는 이렇게 끝나고 통신을하기 위한 sercure certification 설정이 필요하다.

 

secure certification

master와 통신하기 위해 secure certification 등록이 필요하다. 해당 작업을 진행하기 이전에 master server의 8140포트가 개방되어 있어야한다.

 

agents

각각 agent에서 puppet 통신을 위한 명령어를 실행한다.

puppet agent -tv

해당 명령을 실행하면 ssl key를 생성하고 통신을 시도하지만...  certificate을 찾을 수 없다는 로그를 볼 수 있다.

master에서 certificate에 대해서 등록해줘야한다.

 

master

puppet cert list

certification 요청을 확인하고 등록을 진행한다.

 

puppet cert sign node01.centos.test
puppet cert sign node02.centos.test

cert list 명령어로 확인한 certname을 인자로 등록한다.

 

puppet cert list --all

정상적으로 등록되었는지 확인한다.

 

agents 확인

다시 agent 서버로 돌어와서 연결이 이상없이 되었는지 확인한다.

puppet agent -tv

아까와는 다르게 정상적으로 통신이 node environment를 사용해서 연결된 것을 확인할 수 있다. 지금은 manifest가 없어 아무런 작업을 하지 않지만, manifest를 등록해주고 필요한 작업을 설정해주면 작업에 대한 로그가 남게 된다.

 

 

태그

댓글0