posted by 은이종 은이종 2013. 4. 16. 18:28

1. 배경

Puppet은 아래의 그림 처럼 하나의 Master 서버에서 설정(아파치 설정, WAS 기동 등..)을
하면 각 Agent에게 설정 정보를 보냅니다. (이러한 명령을 "catalog" 라고 합니다.)
수신된한 Agent는 변경된 설정 정보를 실행하고, 결과 리포트는 Master에게
전송 합니다.

Puppet의 특징

- GPL 기반 오픈 소스이며, Ruby에서 할 수있다
(Ent버전 유료과 오픈 버전이 있습니다.) 
- 자신의 선언적 언어로 시스템을 관리 -> 고유 언어 시스템으로 작성된 파일을 "매니페스트"라고 합니다.
- 클라이언트 / 서버 아키텍처
- 추상화 레이어 -> 여러 OS가 혼합된 환경에서도 OS의 차이를 의식하지 않고, 단일 매니페스트에서 시스템을 관리 할 수 있게 된다.
- 종속성 처리
- LDAP 지원

자원 : 사용자, 파일, 소프트웨어 등의 Puppet 관리 대상
매니페스트 만들기 첫 걸음은 자원을 선언하는 것

file (파일)
user (사용자)
group (그룹)
host (호스트)
package (소프트웨어 패키지)
service (실행중인 서비스)
그외 다양함

Puppet의 기본 동작은 puppetd가 30 분에 1 회 puppetmasterd에 매니페스트를 가져 가고, 자신에 매니페스트를 적용합니다. 
이 경우 puppetd이 puppetmasterd에 액세스 할 타이밍을 제어하는 것이 어렵 기 때문에 다음과 같은 문제가 있습니다.
- Puppet 클라이언트가 수백 대 혹은 그 이상의 규모가 된 경우 Puppet 서버에 대한 액세스가 동 시간대에 집중 될 수있다
- 새로운 명단을 우선 하나만 적용하여 테스트 해보고 싶다,라고하더라도 모든 서버에 마음대로 적용되어 버릴 우려가있다
이 문제를 해결하기 위해서는 puppetrun을 이용해 Puppet을 운영해야합니다.


템플릿 기능은 Puppet 클라이언트의 조건에 따라 내용이 다른 파일을 클라이언트마다 만들수 있습니다.
puppetrun의 일부 옵션(-all-class)이 LDAP에서 노드 관리하지 않으면 사용할 수 없다는 점이 있습니다.
Puppet의 설정 및 데이터 파일 (매니페스트 템플릿 배포 파일, 모듈 등)을 Subversion에서 관리하여,
누가 어떻게 변화를했는지 기록도 남아 있기 때문에, 변경 추적 및 감사 변경을 롤백 할 수 있습니다.

-기타 주의 사항-
1CPU/2GB 메모리 Puppet Master 서버 1대에서 50~100 대의 Puppet 클라이언트를 관리하는 것이 한계

단일 구성의 향상
Puppet에서는 웹 서버로, Ruby 표준에 포함되어있는 WEBrick을 사용하므로, Mongrel으로 대체할 수 있는데, Mongrel의 경우 SSL 처리가 안되므로,리버스 프록시 구성으로 Apache + mod_ssl + mod_proxy 와 같이 구성하면 됩니다.
Nginx를 사용하는 것도 한 방안임.
SSL 인증서를 사용할 경우, 키 인증과 관련한 구성상의 문제점이 있으므로 상세한 확인이 필요한다.

[출처] puppet 요약|작성자 


 2. 설치 환경

  • OS

     테스트 설치 환경은 "CentOS 6.4 x32" 입니다. 

  • Ruby

     Puppet은 Ruby로 만들었기 때문에 반드시 Ruby를 반드시 설치해야 합니다.

     1.9.x 버전이 OpenSSL과 연동시 이슈가 있었습니다. 
     그래서 현 시점에서는 1.8.x 버전을 설치 하시길 권고 드립니다.

  • 서버 구성

     서버는 Master 1 대, Agent 1대 총 2대로 진행 하며, Puppet은 Master <-> Agent 간에
     SSL 통신을 하기 때문에 도메인이 필요 합니다.

     하지만 이번 설치에는 /etc/hosts 파일에 설정을 하면서 진행 했습니다.
     Master 도메인 : master.jongeun.co.kr
     Agent 도메인 : client1.jongeun.co.kr


3. Master 설치 하기

Yum 설치로 진행을 하였습니다. 기본 CentOS repo로는 설치가 안되므로,
sourceforge 의 Repo를 연결하여 진행합니다.

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.i386.rpm

rpm -Uvh rpmforge-release-0.5.1-1.el5.rf.i386.rpm


  (1) 루비 및 관련 라이브러리 설치

     ※ruby와 관련 라이브러리들을 설치 합니다.
     # yum install ruby ruby-libs ruby-shadow


   (2) Puppet Master 설치

     Puppet을 설치하려면 3가지 패키지를 설치해 해야 합니다.

  • puppet : Agent 모듈
  • puppet-server : Master 모듈
  • facter : 서버 정보를 gathering 하는 모듈

     # yum install puppet puppet-server facter

 

4. Agent 설치 하기

     Master 설치하기 와 동일하고 3번 설치 항목에서 2개만 설치 합니다.

  1. Puppet Agent 설치 하기

     # yum install puppet facter


5. Master 설정 하기

 vi /etc/puppet/puppet.conf

          [master]

          certname=master.jongeun.co.kr

"cetname"은 master 도메인 정보를 설정하는 속성입니다. 추후에 이 도메인명을 가지고 SSL 인증서를 발급 합니다.

추가로 conf에 "[main]"은 공통 설정,  "[master]"는 master 전용 설정, 마지막으로  "[agent]"는 agent를 위한 설정 입니다. 

Puppet은 TCP 8140을 사용하기에 Iptable에서 허용해줘야합니다. 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8140 -j ACCEPT
 


6. Agent 설정 하기

  vi /etc/puppet/puppet.conf

  [agent]
  certname=client1.jongeun.co.kr

 Agent의 도메인 정보를 입력 합니다. 추후에 서버에서 SSL 인증서를 발급 받습니다.

  • 만약 master 도메인이 퍼블릭 도메인이 아닌 경우는 "/etc/hosts" 파일에 도메인 정보를 추가 합니다.

          192.168.0.1 master.jongeun.co.kr
 
 
Puppet은 TCP 8140을 사용하기에 Iptable에서 허용해줘야합니다. 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8140 -j ACCEPT



7. Master to Agent 연동 하기  

     Master 와 각 Agent는 SSL 통신을 합니다. Master 입장에서는 승인된 Agent정보가 필요하며,
     반대로 Agent도 승인된 Master가 필요 합니다. 즉 쌍뱡향 SSL 승인절차를 필요 합니다.
     서로 같에 SSL 승인이 되지 않으면 연동 자체가 불가 합니다.
     Puppet 같은 경우는 자체 CA (certificate authority) 인증 기관이 있고,  SSL 인증을 최적화
     되어 있습니다.
     그래서 공인인증 수준의 SSL 인증 발급을 쉽게 할수 있도록 지원을 합니다. 
     Puppet은 큰 특징 중 하나가 바로 SSL 인증 발급을 하는 것입니다.
     또한 Customize 할수 있는 기능도 제공 합니다.

     인증서 발급 FLOW는 아래와 같습니다.



     (1) Master 서버가 기동을 해서 Agent를 리스닝 합니다.

     (2) Agent는 서버에 접속을 합니다.
     (3) Master는 Agent의 도메인 정보를 얻은 후 SSL을 발급 합니다.
     (4) 발급된 ".pem" 파일을 Agent에 전송 합니다.

     (5) Agent는 "/etc/puppet/ssl" 폴더에 서버 와 본인 인증서를 저장 합니다.
     (6) 이후 부터는 인증서를 통해서 ssl 통신을 합니다.


 <<Master > 
 
puppet master --no-daemonize -d -v

-no-daemonize : puppet을 데몬이 아닌 foreground로 실행하는 옵션

-debug : debug 모드로 실행

-verbose: verbose 모드로 실행




<<Agent >

 
puppet agent --server master.jongeun.co.kr --no-daemonize --verbose




  • << Master >>

    puppet cert --all and --list
     
     
    "+" 표기된 부분은 발급이 완료된 Agent들을 말합니다. 지금 접속한 "node1.example.com"은 "+" 표시가 되어 있지 않습니다.  즉, 서버에 접속은 되어 있지만 발급이 안되서 대기중인 상태를 말합니다.


          puppet cert --sign client1.jongeun.co.kr
       
clien1.jongeun.co.kr 로 접속한 Agent에게 SSL 인증서를 발급 하겠다는 내용 입니다.



  • <<Agent >>
    발급이 완료되면 Master로 부터 새로운 catalog(설정 변경에 대한 지시 사항)을 받습니다.
    puppet agent --server master.jongeun.co.kr --no-daemonize --verbose





  • 최종적으로 아래와 같이 Master/Agent 로그가 나오면 정상적으로 설정이 완료 됩니다.

          추후 Agent가 추가가 되면 위에 설정 방식을 반복해서 설정을 하면 됩니다.

<<Master Side>>

<<Agent Side>>

     다음에 간단하게 Master에 있는 파일을 다운로드 받아서 Agent 특정 위치로 복사하는 예제를
     올리도록 하겠습니다.

8. 참고 자료

'관리툴 > Puppet' 카테고리의 다른 글

Puppet 설정 (수정 중)  (0) 2013.04.30
Puppet 설치 및 기본설정  (2) 2013.04.16

댓글을 달아 주세요

  1. 김재환 2016.03.29 13:12  Addr  Edit/Del  Reply

    너무 좋은 글 잘 읽고 갑니다.

  2. 2018.10.02 20:32  Addr  Edit/Del  Reply

    비밀댓글입니다