사실 지난번에 Opsworks에 대해서 포스팅은 했지만 저는 infrastructure as code의 전문가가 아닙니다. 포스팅 후 새로운 일이 생겨서 하는 김에 infrastructure as code를 의식해서 일을 진행해보자..해서 진행하게 되었고 알게 된 것들을 공유하고자 합니다. #1이라고 붙였는데 #2를 쓰게 될지 어떨지는 잘 모르겠네요 ㅎ 일단 이번 포스팅에서는 chef코드를 통해서 서버를 구축하는데 까지 써보려고 합니다.
- 왜 이런 짓을 하는가
- VirtualBox Install
- Vagrant Install
- Chef Install
- 만들자!
- 끝
1. 왜 이런 짓을 하는가
팀에 다섯명이 개발을 한다. 그런데 개발 환경은 다 다르다. 어떤 때는 깔려 있는 패키지의 버전이 다르고, 어떤 때는 아예 패키지가 없기도 하다. 물론, 개발 환경 구축에 대한 문서는 공유되어 있다. 허나 maintenance를 안하는 동안 이미 유명무실해졌다. 그냥 옆 사람한테 물어보는게 빠르므로. 그래서 개발 환경 구축 따위 그냥 하는거다. 언제까지? 돌아갈때 까지.
그리고 두 명이 나가고 한 명의 어리버리한 개발자가 새로 들어왔다. 새로 들어온 개발자에게 이미 유명무실해진 구축 문서를 보여주면서 그대로 하라고 한다. 될리가 있나. 왼쪽 사람에게 물어 본다. 계속 물어 본다. 슬슬 짜증낼 것 같으면 오른쪽 사람에게 물어본다. 그렇게, 하루가 간다.
드디어 개발 중인 어플이 돌아가기 시작했다. 허나 이게 완벽하게 돌아가는지 어떤지는, 아무도 모른다.
이런 풍경은 내가 개발자로 살던 지난 몇년동안 거의 모든 프로젝트에서 벌어졌다. 개발 환경 만드는건, 진짜.. 열라 짜증난다. 진짜 짜증난다. 그래서 infrastructure as code에 흥미를 가지게 되었고, 나같은 이들이 조금이라도 있을꺼란 생각에 글을 남기게 되었다.
(사실, 위와 같은 일이 아직까지도 끊이지 않고 벌어지는 이유는 개발자 본인들의 책임이 크다. 새로운 것을 받아들이려 하기 보단 그냥 하던 대로 하는 걸 하고 싶어 한다. 이러 이렇게 하면 더 나아질 수 있어요! 하면, 귀찮아, 배워야 해, 지금 이대로 해도 어차피 되긴 되잖아, 등등의 말이 돌아오는 일이 많다. 최첨단이라는 이미지가 있는 개발자들은 의외로 보수적이다.)
 |
대충 이런 느낌입니다..(10분간 그렸음) |
2. VirtualBox Install
내가 맥을 쓰니 맥 위주로 설명을 하겠다. 윈도우를 쓴 기간이 훨씬 길었는데, 이미 윈도우는 다 잊었다!! 윈도우를 쓰던 시절, 가상머신을 설치하는 건 필수였다. 리눅스 커맨드를 쓰려면 어쩔 수 없었다. 하지만 맥에서는 아니다. 안깔아도 쓸 수 있다. 그래서 나도 안 깔고 썼는데.....
그리고 나의 맥은 개판이 되었다............
brew 커맨드와 npm, gem 커맨드로 이것 저것 그때마다 깔아댔더니 패키지 간의 종속관계며 버전이며 뒤죽박죽이 되었다. 이 상태로 새로운 프로젝트를 만들어 진행하다가 새로운 서버에 릴리스를 해야할 시점이 되면, 나는 고민해야 한다. 내 개발환경의 어느 부분만큼 서버에서 재현해야 할 것인가....
하지만 이제 이런 고민을 할 필요는 없다. code로 인프라를 정의해놓으면 100번이든 만번이든 똑같은 서버를 만들 수가 있다. 고로, 개발 환경도 code로 정의된 인프라에서 만들면 된다!
그 첫번째 단계가, 가상환경을 만드는 것이다.
서론이 길었는데,
여기 가서 다운 받자. dmg클릭해서 다음다음다음..
커맨드는 나중에 소개.
3. Vagrant Install
Vagrant는 가상환경 그 자체의 설정을 도와주는 툴이다. 가상환경의 메모리는 얼마를 줄 것인가, ip는 뭘로 할 것인가, os는 어떤 것으로 할 것인가, 등등의 설정을 할 수 있다.
여기 가서 다운 받자. dmg클릭해서 다음다음다음..
Vagrant는 Vagrantfile이라는 설정 파일에 기술함으로써 서버 설정을 할 수가 있는데, 그 서버를 [2]에서 설치한 virtualbox에 하게 된다. 그런데, 플러그인을 사용하면 AWS의 EC2를 컨트롤할 수도 있다. 무슨 말인고 하니, 맥에다가 VirtualBox깔아서 가상서버를 만들 필요도 없이 EC2의 서버를 가상머신처럼 쓸 수 있다는 소리다.. 이것 말고도 수많은 플러그인이 있는데, 사실 나는 안써봐서 잘 모른다. 나는 그냥 전도만 하겠음.. 신앙심을 키우시는건 본인들의 몫
4. Chef Install
여기서 디벨롭 킷을 다운로드하는 방법도 있는데, 나는 아직 필요성을 못 느꼈으므로 gem으로 인스톨.
$ gem i chef --no-ri --no-rdoc
Chef를 인스톨하면 knife라는 커맨드를 사용할 수 있게 된다. knife는 chef레포지토리를 조작하는 커맨드이다. 다음으로 knife를 인스톨하자
$ knife configure
이걸 실행하면
~/.chef/knife.rb에 설정파일이 저장된다. 이것저것 물어보는데 언제나 처럼 모두 디폴트로!
그 다음 knife-solo를 실행한다.
$ gem i knife-solo --no-ri --no-rdoc
소개가 늦었는데, chef에는 chef-server와 chef-solo가 있다.
- Chef-server: 설정값을 서버에 저장하여, chef-client는 그 설장값을 참조
- Chef-solo: 설정값을 파일에 저장. 그 파일을 Git으로 관리가 가능.
위의 기능으로 봤을때, 일반 개발자라면 Chef-solo가 훨씬 쓰기가 편하다. 그 chef-solo를 실행해 주는게 knife-solo가 되겠다.
자, 그럼 준비가 끝났나? 아직 남았다. 잊어선 안된다
Don't repeat yourself
서버에 프로그램을 설치하는 건 정형화되어 있다. 그렇다면? 그렇다. 다른 사람이 만들어놓은걸 가져다 쓰면 된다. Rails에서의 Gemfile 같은...
$ gem i berkshelf --no-ri --no-rdoc
자. 이제 준비가 끝났다. 만들어 보자!
5. 만들자!
1. Chef레포지토리 만들기
% knife solo init chef-repo
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Berkshelf...
이걸 실행하면
% tree chef-repo
chef-repo
├── Berksfile #Berkshelf설정파일. rails에서의 Gemfile
├── cookbooks #Berksfile에 설정한cookbook들이 다운로드 되는 디렉토리
├── data_bags #모름
├── environments #잘모름
├── nodes #모름
├── roles #모름
└── site-cookbooks #유저가 직접 작성하는 cookbook
이런 것들이 생긴다. 언제나 처럼, 모두 다 알려고 하지 말자.
2. Berksfile 설정/실행
% cd chef-repo
% vi Berksfile
하면
site :opscode라고 한줄이 써 있는데, 버전3에서 부터 문법이 바뀌었으므로 지우고 아래와 같은 줄을 추가하자
source 'https://api.berkshelf.com'
cookbook 'nginx'
cookbook 'git'
그런후, rails의 bundle install과 같은 커맨드인 아래의 커맨드를 실행하자. 버전3부터는 bundler로 인스톨도 가능하다고 써있었는데 나는 안해봤다.
% berks vendor cookbooks
Resolving cookbook dependencies...
Fetching cookbook index from https://api.berkshelf.com...
Using build-essential (2.2.3)
Using dmg (2.2.2)
Using chef_handler (1.1.9)
Using git (4.2.2)
Using yum-epel (0.6.0)
Using yum (3.6.1)
Using windows (1.37.0)
.......
이것으로 cookbooks디렉토리에 다운로드 되었다.
3. vagrant 설정
이제 가상서버를 만들자.
% vagrant init
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
% vi Vagrantfile
위의 커맨드로, vagrant 설정파일인 Vagrantfile이라는 파일이 생긴다. 이 파일을 에디터로 열어서, 기본적인 값만 설정해보자.
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.vm.synced_folder "../", "/share"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.provision :chef_solo do |chef|
chef.json = {
}
chef.run_list = [
'recipe[nginx]',
"recipe[git]"
]
end
end
대충 설정값을 보면 감이 올 거라 생각하는데, 이중에서 config.vm.box_url 는 http://www.vagrantbox.es/ 를 참고해서 각자 원하는 os값을 넣도록 하자.
4. 실행
자 이제, 제대로 되었는지 어떤지 실행을 할 시간이다.
우선 서버를 켜고
% vagrant up --provision
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: chef-repo_default_1434619019668_69242
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
...
ssh접속을 해보자
% vagrant ssh
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)
* Documentation: https://help.ubuntu.com/
New release '14.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
...
git이 다운로드 되었는지 확인이 되면
vagrant@precise64:~$ git
usage: git [--version] [--exec-path[=]] [--html-path] [--man-path] [--info-path]
[-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
[--git-dir=] [--work-tree=] [--namespace=]
[-c name=value] [--help]
[]
일단 내가 생각한 흐름대로 진행되었다는 뜻이 된다.
이상! 다음에는 recipe를 통한 서버의 세세한 설정에 대해서 쓰겠습니다! 언제가 될진 모르겠지만....