Puppet ์คํ
Puppet์ ์์ฒด์ ์ผ๋ก ์ ๊ณต๋๋ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ค. ์์ฑํ ์คํฌ๋ฆฝํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ด๋ฆฌ๋๊ณ ์๋ Host์ ๋ช ๋ น์ ๋ด๋ฆฌ๊ณ ์ธํ๋ผ๋ฅผ ์ฝ๋ํํ์ฌ ๊ด๋ฆฌํ ์ ์๋ค. Puppet ์คํฌ๋ฆฝํธ๋ .pp ํ์ฅ์๋ฅผ ๊ฐ๊ณ Manifest ํ์ผ์ด๋ผ๊ณ ๋ ํ๋ค.
์ด๋ฒ ๊ธ์์๋ Puppet Script์์ ์ฌ์ฉ๋๋ Resource, Class, Manifest ๊ทธ๋ฆฌ๊ณ Node์ ๋ํ ๊ฐ๋ ์ ์์๋ณด๊ณ Nginx๋ฅผ ์ค์นํ๊ณ Nginx ํํ์ด์ง์ htmlํ์ผ์ ๋ฐ์์์ index๋ก ์ ์ํ๋ ์์ ๋ฅผ ์งํํด๋ณด๊ฒ ์ต๋๋ค.
Puppet์ ๋ํ ๊ธฐ๋ณธ ๊ฐ๋ ์ด ํ์ํ๊ฑฐ๋ Puppet์ค์น๊ฐ ์๋์ด์์ผ๋ฉด ์ค์ตํ๊ฒฝ์ ์ํด ์๋ ๊ธ์ ํตํด ์ค์น๊ฐ๋ฅํฉ๋๋ค.
์ค์ตํ๊ฒฝ
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๋ฅผ ์คํํ๋ ํ๋ก์ธ์ค๋
- puppet script ์์ฑํ๋ค.(create nginx.pp)
- puppet script๊ฐ ๋ฌธ๋ฒ์ ๋ฌธ์ ๊ฐ ์๋์ง ๊ฒ์ฌํ๋ค. (puppet parser validate nginx.pp)
- Dry run์ ํตํด์ ๋ชจ์ ์คํํ๋ค. (puppet apply nginx.pp --noop)
- 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
๋๋ฒ ์งธ ๋ฐฉ๋ฒ์ 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๊ฐ ์ค์น๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋๊ธ