Puppet

오픈소스 비즈니스 컨설팅
둘러보기로 가기 검색하러 가기

배포 자동화 솔루션인 puppet를 정리 합니다.

Puppet 개요

puppet-%EC%84%A4%EC%B9%981.png

Puppet 용어

용어 상세
Manifest 환경 설정 정보 파일
vim /etc/puppet/environments/production/manifests/~.pp
node "~" {
    Resource { "~":
        attr => value,
    }
​}
  • Resource : File, Service, Package, User 등
  • Class : Resource의 집합으로 modules 폴더 아래에 ~.pp 형태로 저장

puppet  apply  ~.pp      #--- local machine에서 실행, node 부분이 없음
puppet  agent  --test     #--- agent에서 실행

Catalog Manifest가 컴파일되어 Puppet Agent에서 전달되는 정보
puppetmasterd 관리 서버에서 실행되는 데몬
puppetd 각 서버에서 실행되는 데몬

Puppet 설치

Puppet Server 설치

yum install puppet-server

vi  /etc/puppet/puppet.conf

module=/etc/puppet/modules
certname=puppetserver.jopenbusiness.com

puppet resource package puppet-server ensure=latest

/etc/init.d/puppetmaster start

netstat -antp | grep LISTEN | grep 8140

Puppet Agent 인증

puppet cert --sign  --list                        #--- + 도메인은 인증이 완료된 Puppet Agent

puppet cert puppetagent001.jopenbusiness.com

puppet cert --sign --all --list

Puppet Agent 설치

yum install puppet

vi  /etc/puppet/puppet.conf

certname=puppetagent001.jopenbusiness.com
runinterval=60                            #--- 초단위

vi  /etc/sysconfig/puppet

PUPPET_SERVER=puppetserver.jopenbusiness.com
PUPPET_LOG=/var/log/puppet/puppet.log

/etc/init.d/puppet start

ps -ef | grep puppet

auth.conf

참고 문헌

  • auth.conf

hiera.yaml

Puppet에서 사용하는 변수=값 을 설정 파일로 지정

참고 문헌

Puppet 구성

실행 및 검사

puppet --version

puppet apply /etc/puppet/manifests/site.pp

puppet apply /etc/puppet/manifests/site.pp --modulepath=/etc/puppet/modules

puppet parser validate nodes.pp                 #--- 구문 오류 검사

https://forge.puppetlabs.com/ 모듈 사용 

puppet module search httpd               #--- 모듈 검색
puppet module install puppetlabs-apache  #--- 검색된 모듈 설치

Folder 구조

/etc/puppet/

  • manifest/
    • site.pp (이름 변경 가능)
      import 'nodes.pp'
    • nodes.pp (이름 변경 가능)
      node '~' {
          include 모듈명
          #--- Class, Resource, Variabled 등 포함
      }
  • modules/모듈명/
    • manifest/init.pp
      class 모듈명 {
          #--- files, settings, modules, scripts 등 포함
      }

package

package { 'nginx':
    ensure => installed,    #--- installed. 설치, absent. 삭제, latest. 업데이트, '버전명'. 해당 버전 설치
​}

file

file { '/tmp/nginx.conf':
    #--- nginx(모듈명)/files/default.conf 파일 사용
    source => 'puppet:///modules/nginx/default.conf',   
    notify => Service['nginx'],            #--- 다른 자원 호출
    content => '~\n",
    ensure => file,
    mode => '06400',
    owner => root,
    group => root,
​}

service

service {'nginx':
    ensure => running,
    require => Package['nginx'],          #--- 먼저 필요한 자원
    hasrestart => true,
    hasstatus => true,
    subscribe = file ["nginx.conf"],
​}

exec

exec { 'Run my arbitray command':
  command => '/bin/echo I ran this command on `/bin/date` > /tmp/command.output.txt',
  creates => '/tmp/command.output.txt',
  #unless  => '/usr/bin/test -f /tmp/command.output.txt',
  #onlyif  => '/usr/bin/test -f /tmp/command.output.txt',
  #path => ['bin','/usr/bin'],
}

cron

cron { 'test cron':
  command => 'touch /tmp/testcron',
  hour    => '04',
  minute  => '00',
}

template

Template 파일은 Ruby로 작성되어 있기 때문에 <%= @변수명 %>을 사용합니다.

Puppet에선s $변수명 을 사용 합니다.

vi apache/templates/vhost.conf.erb

Listen <%= @vhost_port %>
<VirtualHost *:<%= @vhost_port %>>
    DocumentRoot /var/www/html
    ServerName <%= @site_name %>
</VirtualHost>

vi apache/manifests/init.pp

$vhost_port = "8080"
$site_name = 'example.com'
file { '/etc/httpd/conf.d/example.com.conf':
    content => template('apache/vhost.conf.erb'),
    notify => Service['httpd'],
}

define

Resource를 그룹하여 사용

vi  modules/base/manifests/script_job.pp

define base::script_job ( $hour = '00' ) {
        include base
        file { "/usr/local/bin/${name}":
            source => "puppet:///modules/base/${name}",
            mode => '0755',
        }
        cron { "Run ${name}":
            command => "/usr/local/bin/${name}",
            hour => $hour,
            minute => '00',
            user => 'vagrant',
        }
}

vi  manifests/nodes.pp

node 'vagrant-centos64.vagrantup.com' {
    include base
    base::script_job { 'backup_database1':
        hour => '05',
    }
}

class

class appserver($domain, $database) {
​}

user

user { 'user01':
    ensuer => present,
    comment => '~',
    home => '/home/user01',
    managehome => true,
​}

ssh_authorized_key

ssh_authorized_key { 'user001_ssh':
    user => 'user01', 
    type => 'rsa', 
    key => '~',
}

참고 문헌