Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

... 작성 중..

Roles

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가지 방식으로 관리할 수 있다.
  1. chef repository에 디렉토리를 만들어서 role를 관리한다. role 파일은 json 형식을 따른다.
  2. 혹은 json 대신에 ruby DSL로 만들 수도 있다. DSL은 JSON으로 컴파일 된다.
  3. knife를 이용.
  4. 혹은 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"

run_list

run_list에는 node에 적용할 recipes의 목록을 명시한다.
run_list "recipe[apache2]", "recipe[apache2::mode_ssl]", "role[monitor]"
이 노드에는 apache2, apache2::mode_ssl 레시피와 monitor role이 적용될 것이다.

env_run_lists

<!> env_run_lists는 Chef 10.0이상에서 사용할 수 있다.

Env에 대한 용어 정리를 하고 넘어가자. Env는 설정이 적용되는 환경을 의미한다. 예컨데 제대로된 프로세스를 밟는 제품이라면 개발 환경과 스테이지 환경, 상용 환경이 구분될 것이다. 개발 환경에서 개발을 끝낸 다음 스테이징 환경에서 테스트를 끝내고, 마지막에 상용 환경에 적용해서 실제 서비스를 하는 식이다. 이 경우 동일한 설정이라도 환경에 따라 달라질 수 있을 것이다.

env_run_lists를 이용하면 환경별로 chef 코드를 적용할 수 있다.
env_run_lists "prod" => ["recipe[apache2]"], "staging" => ["recipe[apache2::staging]"], "_default" => []

default_attributes

chef 코드 개발자는 role에 포함된 모든 node에 적용될 attribute를 정의할 수 있다.
default_attributes "apache2" => {"listen_ports" => ["80","443"]}
만약 동일한 이름의 attribute가 존재할 경우에는 원하지 않는 결과가 생길 수 있다. 예를 들어 cook book의 attribute에 "listen_ports"가 있고 값이 배열이라면, "listen_ports"에 원소가 추가가 된다.

override_attributes

role을 가진 모든 node의 attribute를 override 한다.
override_attributes "apache2" => {"listen_ports" => ["80","443"]}

JSON을 이용한 role 관리

위에 소개한 루비 DSL로 개발한 attribute는 아래와 같이 JSON 형태로 작성할 수 있다.
{
  "name": "webserver",
  "chef_type": "role",
  "json_class": "Chef::Role",
  "default_attributes": {
    "apache2": {
      "listen_ports": [ 
        "80",
        "443"
      ]
    }
  },
  "description": "The base role for systems that serve HTTP traffic",
  "run_list": [
    "recipe[apache2]",
    "recipe[apache2::mod_ssl]",
    "role[montior]"
  ],
  "env_run_lists" : {
    "_default" : [],
    "production" : [],
    "preprod" : [],
    "dev": [
      "role[base]",
      "recipe[apache]",
      "recipe[apache::copy_dev_configs]",
    ],
    "test": [
      "role[base]",
      "recipe[apache]"
    ]
   },
  "override_attributes": {
    "apache2": {
      "max_children": "50"
    }
  }
}
Json일 경우 몇 가지 요소가 더 필요하다.

json_class

Chef::Role만 사용된다.

chef_type

role만 사용된다.

knife로 role 관리하기

Node에 role 추가하기

run_list 명령으로 role를 추가할 수 있다.
knife node run_list add NODE "role[ROLE NAME]"
하나 이상의 role을 추가할 수 있다.
knife node run_list add NODE "role[ROLE NAME 1],role[ROLE NAME 2],role[ROLE NAME 3]"

role 만들기

role을 만들 때 사용할 에디터를 지정해야 한다. 환경변수를 이용해서 지정할 수 있다.
export EDITOR=vi

새로운 role을 만든다.
knife role create footbar

EDITOR에 등록한 에디터로 role을 편집한다.
{
    "name": "foobar",
    "default_attributes": {
    },
    "json_class": "Chef::Role",
    "run_list": [
 
    ],
    "description": "",
    "chef_type": "role",
    "override_attributes": {
    }
}

에디터를 종료하면 chef server에 저장이 된다.

role 편집

knife role edit foobar
등록된 에디터로 role을 편집하고 저장하면 된다.

role 보기

knife role show foobar

role 삭제

knife role delete foobar

파일에서 role 만들기

JSON 파일로 부터 role을 만들 수도 있다.
knife role from file FILE

role 다루기 예

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를 추가했다.
{
  "default_attributes": {
  },
  "override_attributes": {
  },
  "json_class": "Chef::Role",
  "chef_type": "role",
  "run_list": [
    "recipe[apache]",
    "recipe[mysql]"
  ],
  "env_run_lists": {
  },
  "description": "",
  "name": "webserver"

role 추가및 확인

web01.yundream.com node에 webserver role을 추가
# knife node run list add web01.yundream.com 'role[webserver]'

role 정보 확인
# knife role show webserver
chef_type:            role
default_attributes:   
description:          
env_run_lists:        
json_class:           Chef::Role
name:                 webserver
override_attributes:  
run_list:             recipe[apache], recipe[mysql]

node에 role이 잘 적용됐는지 확인
# knife node show web01.yundream.com
Node Name:   web01.yundream.com
Environment: _default
FQDN:        web01.yundream.com
IP:          192.168.56.111
Run List:    role[webserver]
Roles:       webserver
Recipes:     apache, mysql
Platform:    centos 6.2

히스토리

  1. 2012년 2월 28일 작성