System Compleat.

'chef cookbook'에 해당되는 글 1건

  1. Build Automated Infrastructure with Chef - Chapter 2

Build Automated Infrastructure with Chef - Chapter 2

Techs
( younjin.jeong@gmail.com , 정윤진 ) 

지난번에 이야기 한 대로, 금일은 다음과 같이 구성된 시스템을 chef 를 통해 자동화 하는 과정을 살펴보겠다. 
빠른 코드 작성을 위해서 대부분의 코드는 OPSCODE ( http://www.opscode.com ) 으로 부터 가져왔으며, 가져오는 방법은 아래에 설명한 대로 진행하면 쉽다. 



지난번에 설명한 초간단 쇼핑몰의 인프라의 추상화는 대략 아래와 같은 모양일 것이다. 물론 성능의 향상이나 사용하고 있는 코드의 구조에 따라 자잘한 구성은 충분히 변경 될 수 있으며, 물론 이것보다 훨씬 좋은 구성도 얼마든지 존재한다.

Figure 1



이제 우리가 준비해야 할 내용은 다음과 같다.

1. opscode.com 의 chef 서버를 사용하거나, stand alone 서버를 만들어 망 내에 설비한다. ( chef 서버의 설치는 3호에 다루도록 한다. )
2. 필요한 package 별로 cookbook 을 다운로드 하여 서비스에 맞도록 수정하고, 필요한 것들은 만들도록 한다.
3. knife 툴을 사용하여 생성된 cookbook 을 업로드 하고, 이를 테스트를 수행할 노드에서 이상이 없는지 코드를 실행, 서비스가 정상적으로 동작하는지 확인한다.
4. 각 서버에 OS 를 설치하고, chef-client 구동 환경을 준비하여 미리 지정된 role 을 사용하여 서버를 셋업한다.


1. 번의 내용을 진행하기 위해, 다음을 수행한다. ( opscode 의 chef server 를 사용하여 진행하는 경우 )
설명되는 절차는 다음의 wiki 페이지에서 그대로 따라 할 수 있다.
 - http://wiki.opscode.com/display/chef/Quick+Start#QuickStart-SetupanewChefClient

a. Cookbook 개발 및 배포에 사용할 VM 을 준비한다.  현재 사용하고 있는 데스크탑 또는 노트북의 VMWare 또는 VirtualBox 등으로 준비하면 된다.  사용하는 Linux 배포판은 Ubuntu 나, CentOS 등 일반적으로 많이 사용하는 배포판으로 준비 하도록 한다.  지난번에 Ubuntu 로 설명 했으니, 이번에는 CentOS 한번 간다. ㅎ

b. http://www.opscode.com 에 계정을 등록하고, 가입한다.
   - https://cookbooks.opscode.com/users/new

c. 가입 후, 우측 상단에 보이는 ID 를 클릭하면 나오는 페이지에서 key 를 다운 받는다.
  

ID Section



Get a new Private key


d. http://manage.opscode.com  으로 이동하면, Organization 탭이 보일 것이다.  적당한 이름으로 생성하고, 역시 동일하게 key 를 다운 받는다.  또한, 바로 옆에 있는 knife.rb 파일도 다운 받도록 한다.

e. 다운 받은 세개의 파일이,  id.pem  //  organizationname-validation.pem // knife.rb  인지 확인한다.

f. 설치해 둔 CentOS VM 에서, root 계정으로 다음을 실해하여 chef 가 구동 될 수 있는 환경을 구성한다.

# sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

# sudo rpm -Uvh http://download.elff.bravenet.com/5/i386/elff-release-5-3.noarch.rpm

위의 패키지 인스톨은 적절한 ruby 버전을 설치하기 위한 몸부림으로 보면 되겠다.

g. FQDN 을 요구하는 경우가 많으므로, /etc/hosts 를 수정하여 훼이크를 준다. vi /etc/hosts
..
...
10.0.0.111   someone.hohoho.com


h. 안락한 사용을 위하여 yum 으로 필요한 패키지를 설치한다.
# yum install git chef -y

i. 모든 패키지의 설치가 끝났다. 이제 루트가 아닌 적절한 사용자 계정으로 전환하고,  기본 chef-repo 를 opscode.com 의 github 로부터 가져온다.
# su - USERID
# cd ~
# git clone git://github.com/opscode/chef-repo.git ~/chef-repo

j. 자, 이제 아까 받아 두었던 3개의 파일을 다음의 위치에 집어 넣는다.
@ mkdir -p ~/chef-repo/.chef
@ cp -r OPSCODE_USERID.pem VALIDATION.pem ~/chef-repo/.chef/
@ cp -r knife.rb ~/chef-repo/.chef/

k. 모든 절차가 정상적으로 진행 되었다면, 다음과 같은 커맨드를 때려 다음과 같은 메세지가 잘 나오는지 확인한다.
@ knife node list
[

]

위와 같이 나온다면, 일단 사용자 인증에는 문제가 없는 것이다.  여기서 Authentication Error 를 밷어 낸다면, 받아 온 사용자아이디.pem 파일이 정상인지 확인하도록 한다.

l. 위의 내용이 정상 동작 한다면, 이제 client 로서의 등록을 위해 다음의 과정을 진행한다.
@ cd ~/chef-repo
@ knife configure client ./client-config
@ sudo mkdir -p /etc/chef
@ sudo cp -r ./client-config/* /etc/chef/
위의 커맨드는 client 등록을 위한 validation.pem / client.rb 파일을 생성하며, 이 파일들은 chef-client 의 기본 설정파일 참조 위치인 /etc/chef 디렉토리에 넣어 준다.

m. 위와 같이 모두 준비 되었다면, 다음의 커맨드로 정상적으로 클라이언트 등록이 되는지 확인하도록 한다.
@ sudo chef-client

[Wed, 13 Oct 2010 18:39:26 +0900] INFO: Client key /etc/chef/client.pem is not present - registering
[Wed, 13 Oct 2010 18:39:31 +0900] WARN: HTTP Request Returned 404 Not Found: Cannot load node localhost.localdomain
[Wed, 13 Oct 2010 18:39:36 +0900] INFO: Starting Chef Run (Version 0.9.8)
[Wed, 13 Oct 2010 18:39:37 +0900] WARN: Node localhost.localdomain has an empty run list.
[Wed, 13 Oct 2010 18:39:39 +0900] INFO: Chef Run complete in 3.40439 seconds
[Wed, 13 Oct 2010 18:39:39 +0900] INFO: Running report handlers
[Wed, 13 Oct 2010 18:39:39 +0900] INFO: Report handlers complete
모두 정상적으로 수행이 되었다면, Report handlers complete 라는 메세지를 확인 할 수 있다.
또한, /etc/chef/client.pem 파일이 생성되는데, 이는 validate.pem 키를 기반으로 서버에서 인증을 받고 생겨난 새로운 클라이언트 키이다.   이 키는 해당 노드에서 계속 사용되므로, 실수로 지워먹거나 하지 말도록 하자.

역시 이 부분에서도 인증 관련 문제가 발생 하는 경우를 많이 봤는데, 이는 매번 똑같이 설정해도 잘 안되는 경우가 있고, 또는 기존에 한번 등록했던 노드를 다시 등록 하려는 경우 등 몇가지 쉽게 발생하는 휴먼에러들이 있다.
이럴떄는, manage.opscode.com 에 가서 Organization 의 키를 다시 생성하여 다운 받고, 해당 키를 .chef 디렉토리에 넣어 준 후에 다시 knife configure client DIR 을 수행하여 발생한 키를 /etc/chef 에 넣어 준다.  이때, client.pem 파일이 /etc/chef 디렉토리에 있다면 반드시 지워주도록 한다.

o. 위의 모든 과정이 완료 되었다면, 다음의 커맨드로 본인의 VM 의 내용이 나타나는지 확인해 본다.
# knife node list
[
  "domU-12-31-38-04-6C-92.compute-1.internal",
  "localhost.localdomain"
]
# knife client list
[
  "domU-12-31-38-04-6C-92.compute-1.internal",
  "localhost.localdomain",
  "younjinjeong_org-validator"
]

p. 역시, http://manage.opscode.com 에 자신의 계정으로 로그인 하면 현재 붙어있는 노드 및 해당 노드에서 수행하는 프로세스 및 MAC 정보 등 많은 시스템 정보를 확인 할 수 있다.  이는, 향후 관리를 용이하게 하며 각 노드에서 수행해야 할 cookbook 및 run_list 를 서버측에서 관리함으로서 필요시에 원하는 형태로 패키지 설정 및 노드 검색 등이 가능하다.
이는, ohai 라는 chef 가 설치 될 때 함께 설치되는 util 에서 나타나는 output 과 같으며, 쉘에서 수행 가능하므로 직접 수행하여 어떤 내용을 나타내 주는지 확인 해 보면 되겠다.



자, 이제는, knife 를 통해 opscode.com 에 생성된 나만의 chef 서버와 api 통신이 가능해 진 것이다.  이후 opscode 로 부터 이미 생성된 cookbook 을 자유롭게 받아 수정하고, 업로드하여 새로운 노드에 반영하면 될 것이다. 위에 일부러 굵게 볼드체로 해 놓은 2번의 내용은 제법 기니깐, 한두어 가지의 cookbook 을 knife 를 통해 다운로드 하고, 이를 수정하여 노드에 직접 적용해 보는 것으로 마무리 하며, 나머지는 향후 3부에 올려 놓을 github.com 링크를 통해 코드를 확인 하시면 되겠다.


a. cookbook 의 download.  다운 로드 가능한 cookbook 의 리스트는, 다음과 같이 확인이 가능하다.
# cd ~/chef-repo
# knife cookbook site list
마치 yum search 한 것마냥 쿡북이 줄줄이 나오는데, 이는 OPSCODE 에서 미리 작성해 둔 코드들이다.  이 코드들의 라이센스는 각 소스에 적혀있으므로, 미리 확인하도록 하자.  Aaron Peterson씨 의 말에 따르면 아파치 라이센스라지만, 각자 확인하여 미리 문제가 없도록.

b. 확인한 cookbook 은 다음과 같은 형태로 다운로드가 가능하다.
# knife cookbook site vendor COOKBOOK_NAME -d
커맨드 설명만 하는  것 같아서 기분이 좀 그런데, knife 커맨드의 각 2열까지는 type 후 그냥 엔터를 쳐도 대략적인 help 정보를 볼 수 있으며, 이후에는 --help 를 붙여 주시면 되겠다.

c. 다운로드 한 Cookbook 은 아직 각 노드에 배포 될 수 있는 형태가 아니며, 이를 위해서는 다음과 같은 작업이 필요하다.
/* Upload  All Cookbook */
# knife cookbook upload -a

/* Specify a cookbook to upload */
# knife cookbook upload COOKBOOK_NAME 

d. 이렇게 업로드된 쿡북은, run_list 또는 role 로 정의되어 선택된 노드에서 동작 할 수 있게 된다. 노드의 추가 및 run_list 추가는 조금 이따가 보기로 하고,  여기까지 그냥 따라 했다면 이제는 이 Chef의 Server - Client 시스템 및 쿡북의 생성 및 적용, 배포에 관한 사이클에 대해 이해 할 필요가 있다.

Cookbook Life cycle


대략 이런 흐름으로 Cookbook 을 유지한다.  PPT 를 발로 그린건 너그러이 용서를 바람.  집에 가고 싶어서 ㅠㅠ

실제 업무를 한다면, 이런 그림이 되지 않을까 싶다.
어쨌든 개발 및 배포 프로세스는 위와 같으며, 이제 실질적으로 cookbook 을 살펴 보기로 하자.

knife cookbook site list 해서 나온 것 중, 이번 쇼핑몰 구성에 필요하거나 있는 쿡북은 모두 내려 받는다.
# for i in apache2 cron eaccelerator heartbeat iptables mysql nagios nginx rsyslog rsync ; \
do cd ~/chef-repo ; knife cookbook site vendor $i -d ; done
이상한 현상중의 하나가 어떨때는 tar.gz 으로 쿡북이 오거나 또는 압축이 풀린상태로 cookbook 디렉토리에 이쁘게 잘 들어가기도 한다.  아마, knife 의 옵션에 뭔가 있을 것 같은 생각이므로 궁금하신 분들은 wiki.opscode.com 을 참조.

위의 목록에서 빠졌거나 또는 기본으로 실려오는게 좀 부족하거나 볼륨이 너무 큰 감이 있다면 다음과 같이 비어있는 쿡북을 만들도록 한다.
# knife cookbook create COOKBOOK_NAME

e. 자 이제 많은 부분이 준비 되었다.  이제는 Cookbook 자체를 수정하는 일만 남았다.

Cookbook 을 수정하기 위해서는, 먼저 chef 의 디렉토리 구조를 알아야 할 필요가 있다.
쓰다보니 제법 길어져서, 이제 3회를 향해 가야 할것 같은 분위기. ㅋ


KT 회의실에 혼자 쭈그려 있기 좀 민망하므로 오늘은 여기까지.


( younjin.jeong@gmail.com , 정윤진 )