Build Automated Infrastructure with Chef - Chapter 2
Techs( younjin.jeong@gmail.com , 정윤진 )
지난번에 설명한 초간단 쇼핑몰의 인프라의 추상화는 대략 아래와 같은 모양일 것이다. 물론 성능의 향상이나 사용하고 있는 코드의 구조에 따라 자잘한 구성은 충분히 변경 될 수 있으며, 물론 이것보다 훨씬 좋은 구성도 얼마든지 존재한다.
이제 우리가 준비해야 할 내용은 다음과 같다.
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 를 다운 받는다.
d. http://manage.opscode.com 으로 이동하면, Organization 탭이 보일 것이다. 적당한 이름으로 생성하고, 역시 동일하게 key 를 다운 받는다. 또한, 바로 옆에 있는 knife.rb 파일도 다운 받도록 한다.
e. 다운 받은 세개의 파일이, id.pem // organizationname-validation.pem // knife.rb 인지 확인한다.
f. 설치해 둔 CentOS VM 에서, root 계정으로 다음을 실해하여 chef 가 구동 될 수 있는 환경을 구성한다.
위의 패키지 인스톨은 적절한 ruby 버전을 설치하기 위한 몸부림으로 보면 되겠다.
g. FQDN 을 요구하는 경우가 많으므로, /etc/hosts 를 수정하여 훼이크를 준다. vi /etc/hosts
h. 안락한 사용을 위하여 yum 으로 필요한 패키지를 설치한다.
i. 모든 패키지의 설치가 끝났다. 이제 루트가 아닌 적절한 사용자 계정으로 전환하고, 기본 chef-repo 를 opscode.com 의 github 로부터 가져온다.
j. 자, 이제 아까 받아 두었던 3개의 파일을 다음의 위치에 집어 넣는다.
k. 모든 절차가 정상적으로 진행 되었다면, 다음과 같은 커맨드를 때려 다음과 같은 메세지가 잘 나오는지 확인한다.
위와 같이 나온다면, 일단 사용자 인증에는 문제가 없는 것이다. 여기서 Authentication Error 를 밷어 낸다면, 받아 온 사용자아이디.pem 파일이 정상인지 확인하도록 한다.
l. 위의 내용이 정상 동작 한다면, 이제 client 로서의 등록을 위해 다음의 과정을 진행한다.
m. 위와 같이 모두 준비 되었다면, 다음의 커맨드로 정상적으로 클라이언트 등록이 되는지 확인하도록 한다.
또한, /etc/chef/client.pem 파일이 생성되는데, 이는 validate.pem 키를 기반으로 서버에서 인증을 받고 생겨난 새로운 클라이언트 키이다. 이 키는 해당 노드에서 계속 사용되므로, 실수로 지워먹거나 하지 말도록 하자.
역시 이 부분에서도 인증 관련 문제가 발생 하는 경우를 많이 봤는데, 이는 매번 똑같이 설정해도 잘 안되는 경우가 있고, 또는 기존에 한번 등록했던 노드를 다시 등록 하려는 경우 등 몇가지 쉽게 발생하는 휴먼에러들이 있다.
이럴떄는, manage.opscode.com 에 가서 Organization 의 키를 다시 생성하여 다운 받고, 해당 키를 .chef 디렉토리에 넣어 준 후에 다시 knife configure client DIR 을 수행하여 발생한 키를 /etc/chef 에 넣어 준다. 이때, client.pem 파일이 /etc/chef 디렉토리에 있다면 반드시 지워주도록 한다.
o. 위의 모든 과정이 완료 되었다면, 다음의 커맨드로 본인의 VM 의 내용이 나타나는지 확인해 본다.
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 의 리스트는, 다음과 같이 확인이 가능하다.
b. 확인한 cookbook 은 다음과 같은 형태로 다운로드가 가능하다.
c. 다운로드 한 Cookbook 은 아직 각 노드에 배포 될 수 있는 형태가 아니며, 이를 위해서는 다음과 같은 작업이 필요하다.
d. 이렇게 업로드된 쿡북은, run_list 또는 role 로 정의되어 선택된 노드에서 동작 할 수 있게 된다. 노드의 추가 및 run_list 추가는 조금 이따가 보기로 하고, 여기까지 그냥 따라 했다면 이제는 이 Chef의 Server - Client 시스템 및 쿡북의 생성 및 적용, 배포에 관한 사이클에 대해 이해 할 필요가 있다.
대략 이런 흐름으로 Cookbook 을 유지한다. PPT 를 발로 그린건 너그러이 용서를 바람. 집에 가고 싶어서 ㅠㅠ
실제 업무를 한다면, 이런 그림이 되지 않을까 싶다.
어쨌든 개발 및 배포 프로세스는 위와 같으며, 이제 실질적으로 cookbook 을 살펴 보기로 하자.
knife cookbook site list 해서 나온 것 중, 이번 쇼핑몰 구성에 필요하거나 있는 쿡북은 모두 내려 받는다.
위의 목록에서 빠졌거나 또는 기본으로 실려오는게 좀 부족하거나 볼륨이 너무 큰 감이 있다면 다음과 같이 비어있는 쿡북을 만들도록 한다.
e. 자 이제 많은 부분이 준비 되었다. 이제는 Cookbook 자체를 수정하는 일만 남았다.
Cookbook 을 수정하기 위해서는, 먼저 chef 의 디렉토리 구조를 알아야 할 필요가 있다.
쓰다보니 제법 길어져서, 이제 3회를 향해 가야 할것 같은 분위기. ㅋ
KT 회의실에 혼자 쭈그려 있기 좀 민망하므로 오늘은 여기까지.
( 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
...
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
# 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/
@ 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 디렉토리에 넣어 준다. @ knife configure client ./client-config
@ sudo mkdir -p /etc/chef
@ sudo cp -r ./client-config/* /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 라는 메세지를 확인 할 수 있다. [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
또한, /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"
]
[
"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씨 의 말에 따르면 아파치 라이센스라지만, 각자 확인하여 미리 문제가 없도록. # knife cookbook site list
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
# 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 을 참조. do cd ~/chef-repo ; knife cookbook site vendor $i -d ; done
위의 목록에서 빠졌거나 또는 기본으로 실려오는게 좀 부족하거나 볼륨이 너무 큰 감이 있다면 다음과 같이 비어있는 쿡북을 만들도록 한다.
# knife cookbook create COOKBOOK_NAME
e. 자 이제 많은 부분이 준비 되었다. 이제는 Cookbook 자체를 수정하는 일만 남았다.
Cookbook 을 수정하기 위해서는, 먼저 chef 의 디렉토리 구조를 알아야 할 필요가 있다.
쓰다보니 제법 길어져서, 이제 3회를 향해 가야 할것 같은 분위기. ㅋ
KT 회의실에 혼자 쭈그려 있기 좀 민망하므로 오늘은 여기까지.
( younjin.jeong@gmail.com , 정윤진 )