Roles을 이용하면 비슷한 성격을 가지는 노드들을 하나의 그룹으로 묶어서 설정을 관리할 수 있다. 서비스를 위한 웹서버를 운용한다고 가정해 보자. 이들 웹 서버는 apache 웹서버, php, mysql이 올라간다. 그렇다면 앞으로 추가되는 웹 서버들도 모드 동일한 애플리케이션과 설정을 가질 것이다. 그렇다면 webserver role을 만들어서 여기에 APM에 대한 정보를 넣어 넣고, 웹서버 node가 추가될 때마다 webserver role을 추가하면 간단하게 자동화 할 수 있을 것이다.
또한 동일한 APM으로 구성된 웹 서버라고 할지라도 서비스를 위한 웹 서버와 내부 개발을 위해서 사용하는 웹서버는 설정이 다를 것이다. 이때는 webserver-dev 등의 role을 따로 만들어서 관리할 수 있을 것이다. ubunt와 centos등 운영체제에 따라서 다른 룰을 만들 수도 있을 것이다.
role을 이용해서 복잡한 자동화 관리를 간단히 만들어 보자.
이 문서는 chef install, node 및 cookbook 등록은 할 줄 안다는 가정하에 만들었습니다.
role 구성
role은 attribute와 run list로 구성된다.
node는 하나 이상의 role를 적용할 수 있다.
chef client가 실행되면, 자신에게 할당된 role의 run list와 자신의 attributes를 조합해서 설정을 관리한다.
예를 들어 우분투 서버에 웹 서버를 설치하려고 한다면, 이 노드는 'ubuntu'와 'web_server' 두개의 role을 적용할 수 있다. 각 role은 우분투 리눅스 설정과 웹 서버 설정에 필요한 로직과 데이터를 가지고 있다.
role 관리
role은 4가지 방식으로 관리할 수 있다.
chef repository에 디렉토리를 만들어서 role를 관리한다. role 파일은 json 형식을 따른다.
혹은 json 대신에 ruby DSL로 만들 수도 있다. DSL은 JSON으로 컴파일 된다.
knife를 이용.
혹은 REST API를 이용.
role 작업 방법
role 파일을 수정할 경우.
ruby DSL 혹은 JSON 형식을 사용할 수 있다.
JSON은 간단하게 사용할 수 있으며, DSL을 이용할 경우 다이나믹한 role을 만들 수 있다.
role을 형상관리 시스템을 이용해서 버전관리를 하도록 한다.
role을 완성했다면 knife를 이용해서 chef 서버에 upload 한다.
Chef server management console (웹 콘솔)을 이용할 경우
management console를 이용하면, 직관적으로 role을 관리할 수 있다.
하지만 DSL을 이용할 수 없으며,
버전관리도 쉽지 않다.
가능하면 role 파일을 이용해서 작업하는 걸 권장한다.
Ruby DSL을 이용한 role 관리
Role는 JSON 파일을 컴파일하고 이 결과를 chef server에 업로드하는 방식으로 만든다.
다음은 간단한 웹 서버 role의 모습이다.
name "webserver"
description "Simple Web App"
run_list (
"recipe[apache2]"
)
name, run_list, description과 같은 몇 가지 구성요소를 확인할 수 있을 것이다. 이들 구성요소의 정보를 채워넣어서 role을 만든다. 아래에 구성요소들을 설명하겠다.
name
Role은 유일한 이름을 가지고 있어야 한다. ![a-zA-Z0-9_-!]를 이름으로 사용할 수 있다. 스페이스 문자를 사용할 수는 없다.
name 'webserver'
description
Role에 대한 설명
description "The base role for systems that server HTTP traffic"
이 노드에는 apache2, apache2::mode_ssl 레시피와 monitor role이 적용될 것이다.
env_run_lists
<!> env_run_lists는 Chef 10.0이상에서 사용할 수 있다.
Env에 대한 용어 정리를 하고 넘어가자. Env는 설정이 적용되는 환경을 의미한다. 예컨데 제대로된 프로세스를 밟는 제품이라면 개발 환경과 스테이지 환경, 상용 환경이 구분될 것이다. 개발 환경에서 개발을 끝낸 다음 스테이징 환경에서 테스트를 끝내고, 마지막에 상용 환경에 적용해서 실제 서비스를 하는 식이다. 이 경우 동일한 설정이라도 환경에 따라 달라질 수 있을 것이다.
env_run_lists를 이용하면 환경별로 chef 코드를 적용할 수 있다.
knife로 role을 만들어 보자. role이 실제 동작하는 환경을 만들어야 이해가 쉬울 것 같다서, 다음과 같은 테스트 환경을 만들었다.
chef client 운영체제 : Centos 6.2. virtualbox(:12)를 이용해서 생성.
chef client 도메인 이름 : web01.yundream.com
chef server 운영체제 : Centos 6.2. virtualbox(:12)로 생성
webserver를 위한 role을 만든다. 이 role은 mysql과 apache를 run_list로 가진다.
role 이름은 webserver
mysql과 apache cookbook을 만든다.
제대로 하자면 php cookbook까지 만들어야 하겠지만, 여기에서는 설치 후 실행까지만 진행한다.
web01.yundream.com node에 webserver role 적용.
mysql : 설치/실행 후 패스워드까지 적용한다.
apache : 설치/실행.
cookbook 만들기
mysql cookbook
cookbook 생성
# knife cookbook create mysql
template 파일 생성
# cat mysql/templates/default/my.cnf.erb
# This file is created by chef server
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
port=3306
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#log-bin=mysql-bin
#server-id=1
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
recipes 만들기
# mysql package를 install 한다.
package "mysql" do
action :install
end
# mysql-server package를 install
package "mysql-server" do
action :install
end
# 만약 template 내용이 변경되면, mysqld service를 restart 한다.
template "/etc/my.cnf" do
notifies :restart, "service[mysqld]"
end
# my.cnf 파일 생성
template "/etc/my.cnf" do
owner "root"
group "root"
mode "0644"
source "my.cnf.erb"
end
# mysqld 서비스 등록
service "mysqld" do
supports :restart => true, :start => true
action :start
end
# 설치 완료 후 root 패스워드를 만든다.
execute "mysqladmin" do
command "mysqladmin -u root password 12345678"
action :run
end
apache cookbook
cookbook 생성
# knife cookbook create apache
template 파일 : 그냥 적당한 httpd.conf 파일 가져다 사용한다.
recipies
package "httpd" do
action :install
end
directory "/etc/httpd/conf" do
owner "root"
group "root"
mode "0744"
action :create
end
template "/etc/httpd/conf/httpd.conf" do
owner "root"
group "root"
mode "0644"
source "httpd.conf.erb"
end
service "httpd" do
supports :restart => true, :start => true
action :start
end
role 만들기
이름이 webserver인 role를 만든다. 만들기 전에 편집에 사용할 에디터를 지정해야 한다.
# export EDITOR=vim
# knife role create webserver
knife를 실행하고, JSON 파일을 수정하면 된다. run_list에 apache와 mysql를 추가했다.
Contents
Roles
role 구성
role 관리
role 작업 방법
Ruby DSL을 이용한 role 관리
name
description
run_list
env_run_lists
default_attributes
override_attributes
JSON을 이용한 role 관리
json_class
chef_type
knife로 role 관리하기
Node에 role 추가하기
role 만들기
role 편집
role 보기
role 삭제
파일에서 role 만들기
role 다루기 예
cookbook 만들기
mysql cookbook
apache cookbook
role 만들기
role 추가및 확인
히스토리
Recent Posts
Archive Posts
Tags