Chef 서버 설치하고 테스트해보기

Chef 서버 설치하고 테스트해보기

vagrant + virtualbox로 5대의 멀티 인스턴스 올리기

Chef 서버의 환경을 이해해 보려면 3개이상 가상머신을 설치해서 해보는게 좋다.
Vagrant로 5대의 가상머신을 올려보자.
Vagrant를 설치하고 VagrantFile에 아래와 같이 설정한 후

vagrant up을 실행하면 된다.

vagrant 사용법은 아래의 링크를 참고 하자.

Chef의 테스트 환경을 만드는데 매우 적합한 툴 – Vagrant (http://gyus.me/?p=326)

 

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define :chef_server do |cfg|
cfg.vm.box = "base"
cfg.vm.network :private_network, ip: "192.168.30.10"
cfg.vm.host_name = "chef-server"
end
config.vm.define :workstation do |cfg|
cfg.vm.box = "base"
cfg.vm.network :private_network, ip: "192.168.30.20"
cfg.vm.host_name = "workstation"
end
config.vm.define :node01 do |cfg|
cfg.vm.box = "base"
cfg.vm.network :private_network, ip: "192.168.30.21"
cfg.vm.host_name = "node01"
end
config.vm.define :node02 do |cfg|
cfg.vm.box = "base"
cfg.vm.network :private_network, ip: "192.168.30.22"
cfg.vm.host_name = "node02"
end
config.vm.define :node03 do |cfg|
cfg.vm.box = "base"
cfg.vm.network :private_network, ip: "192.168.30.23"
cfg.vm.host_name = "node03"
end
end

 

chef server 설치

아래 사이트에서 패키지를 다운 받아서 설치

http://www.getchef.com/chef/install/

[code lang=text]
wget https://opscode-omnitruck-release.s3.amazonaws.com/ubuntu/12.04/x86_64/chef-server_11.0.6-1.ubuntu.12.04_amd64.deb
[/code]

[code lang=text]
sudo dpkg -i chef-server.deb
[/code]

설치 완료후 chef-server-ctl로 Chef Server를 설정함

[code lang=text]
sudo chef-server-ctl reconfigure
[/code]

위 커맨드를 실행하면 서버를 기동시키고, nginx가 HTTPS 443포트를 바인드한다.

Chef의 각종 파일은 /opt 디렉토리에 인스톨된다.

knife 설정

[code lang=text]
knife configure
[/code]

실행하면 아래와 같은 설정 항목들이 나옴 걍 엔터.

[code lang=text]
Where should I put the config file? [/home/vagrant/.chef/knife.rb]
Please enter the chef server URL: [https://chef-server:443]
Please enter an existing username or clientname for the API: [vagrant]
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem]
Please enter the path to a chef repository (or leave blank):
[/code]

임의의 클라이언트가 처음 Chef Server와 통신을 할경우, 디지털서명이 없기 때문에,
최초 한번, chef-validator라는 Client등록작업만을 전문으로 하는 클라이언트 에서 인증서를 빌려서 Chef Client의 등록작업을 하게됨. 이 작업이 완료되면 이후는 클라이언트 쪽에서 작성한 디지털서명에 의해 통신이 이루어지도록 된다.

dep패키지로 Chef Server를 설치하면 /etc/chef-server 디렉토리에 아래와 같은 파일이 있음. knife configure로 knife에게 이러한 인증서의 패스를 정확히 설정할 필요가 있다.
우선은 서버와 같은 호스트의 knife가 잘동작하도록 하고, 후에 workstation에 인증서를 전송하는 순서로 설치를 하겠음.
일단은 /etc/chef-server이하의 pem파일을 홈디렉토리로 카피함.

  • chef-validator.pem : chef-validator용의 디지털 인증서 파일
  • admin.pem : 관리자용의 클라이언트 인증서 파일(이 것을 사용하는 클라이언트 만 chef-validator를 통하지 않고 미리 작성되어 있음)

[code lang=text]
vagrant@chef-server:/$ sudo knife configure
Please enter the chef server URL: [https://chef-server:443] https://192.168.30.10
Please enter an existing username or clientname for the API: [vagrant] admin
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] ~/.chef/validation.pem
Please enter the path to a chef repository (or leave blank):
[/code]

위의 설정에서
* server URL : https://192.168.30.10
* clientname : admin
* validation key : /etc/chef-server/chef-validation.pem
을 설정함. 이것으로 해당 서버의 knife는 클라이언트의 인증서가 있는 ~/.chef/admin.pem을 이용해서 통신을 하게끔 된다. 한번 시험해봅시다.

[code lang=text]
$ knife client list
[/code]

Work Station의 셋업

새로운 Chef Client를 셋업 할 경우, 인증서의 생성과 클라이언트를 서버에 등록하는 것이 필요하다. 이것도 knife로 하게됨. 서버에 설치한 knfie를 사용해 보도록 하자.

knife client create를 실행하면 에디터에서 메타데이터의 편집을 요구하기때문에, EDITOR의 환경변수를 미리 설정해둠. knife client create 옵션의 -a 는 관리권한을 가진 클라이언트의 작성, -f는 인증파일의 저장소 지정. Vagrant를 사용하는 경우는 가상머신의 /vagrant는 공유 디렉토리로 마운트되어 있어서 다른 가상서버로의 파일전송이 편리하다. 거기에 저장을 하도록 해보자.

[code lang=text]
$ export EDITOR=vi
$ knife client create workstation -a -f /vagrant/workstation.pem
[/code]

Work Station의 knife에도 validation.pem을 저장해두면 나중에 편하니 거기에도 카피해두자.

그리고 여기서 부터는 Work Station에서 작업해야한다. 우선은 Work Station에 Chef Solo를 설치할때 사용한 Opscode Omnibug Packaging의 인스톨스크립트를 실행해서 Chef를 설치한다.

[code lang=text]
$ vagrant ssh workstation
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
$ chef-client -v
Chef: 11.8.2
[/code]

이 다음으로는 서버에서 한것과 동일하게 knife를 설정해야한다.

[code lang=text]
$ cp /vagrant/workstation.pem ~/.chef/
$ cp /vagrant/validation.pem ~/.chef/
$ knife configure
WARNING: No knife configuration file found
Where should I put the config file? [/home/vagrant/.chef/knife.rb]
Please enter the chef server URL: [https://workstation:443] https://192.168.30.10
Please enter an existing username or clientname for the API: [vagrant] workstation
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] ~/.chef/validation.pem
Please enter the path to a chef repository (or leave blank):
[/code]

서버의 URL과 방금 설정한 인승키의 패스를 설정.
제대로 설정을 했다면 knife client list로 출력이 되고 새로운 Client로 workstation이 등록된다.

[code lang=text]
### Chef Server에서 작업
$ knife client list
chef-validator
chef-webui
workstation
[/code]

<h3>Chef Client의 설치</h3>
Chef Server와 Work Station이 완료된 후에는 Client를 작업하자.
관리 대상이 되는 노드를 Chef Client로 셋업하자.

클라이언트측의 Chef인스톨도 Opscode Omnibus Packaging의 인스톨 스크립트를 실행하면 된다.

우분투를 클린상태로 설치했다면, 몇가지 패키지를 설치해야하니 다음 순서로 설치해보자.

[code lang=text]
### Chef Client에서 실행함.
$ sudo apt-get update
$ sudo apt-get install curl vim -y
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
$ chef-client -v
$ sudo mkdir -p /etc/chef
$ sudo cp /vagrant/validation.pem /etc/chef/validation.pem
[/code]

위의 스크립트를 한줄 한줄 실행해도 되고 귀찮은 사람은 파일로 만들어서 한방에 실행해도 된다.

노드에서 chef-client를 실행해서 해당 노드를 서버에 등록하자. –server로 서버의 URL을 지정하고, -N으로 노드명을 지정할 수 있다.(생략하려면 /etc/chef/client.rb를 설정하면 된다. 자세히 알고 싶으면 매뉴얼을 보도록 하자.)

[code lang=text]
$ sudo chef-client –server https://192.168.30.10 -N node01
[/code]

최초의 Client실행 때에 /etc/chef/client.pem에 클라이언트용 인증서가 생성되고, 이후의 통신은 validation.pem이 아닌 클라이언트용 인증서를 사용하게 된다.

Chef Server에 노드가 등록되었는지 Work Station의 knife에서 확인가능하다.

[code lang=text]
### Work Station에서 실행
$ knife client list
chef-validator
chef-webui
node01
workstation
[/code]

node02, node03에는 추후에 따로 세팅을 할테니 우선 두자.

헉헉헉…길다…
<h3>레시피 실행하기</h3>
잘동작하는지 테스트용 레시피를 작성후 실행해보자.
테스트로는 해당노드에 대한 각종 정보를 가지고 있는 ohai를 확인해 보는 레시피를 작성하도록 하자.
Work Station에서 쿡북을 작성하고 Server에 업로드 한 뒤 클라이언트에 적용해보자.
<h4>쿡북의 작성</h4>

[code lang=text]
$ knife cookbook create sample -o ~/chef-repo/cookbooks
[/code]

<h4>
레시피의 작성</h4>

[code lang=text]
$ vi ~/chef-repo/cookbooks/recipes/default.rb

bash "print ohai info" do
user 'vagrant'
group 'vagrant'
cwd '/home/vagrant'
environment "HOME" => '/home/vagrant'
code < /tmp/ohai.txt
EOC
creates "/tmp/ohai.txt"
end
[/code]

<h4>쿡북의 업로드</h4>

[code lang=text]
$ knife cookbook upload -a -o ~/chef-repo/cookbooks
[/code]

<h4>Node Object의 run_list 레시피 추가</h4>

[code lang=text]
$ knife node run_list add node01 'recipe[sample]'
[/code]

<h4>Node Object를 에디터에서 편집하고 싶은 경우</h4>

[code lang=text]
$ knife node edit node01
[/code]

이제 서버에 필요한 정보의 등록은 완료됐다.
노드 쪽에서 chef-client를 실행하고 생성된 파일을 확인해 보자.

[code lang=text]
$ sudo chef-client –server https://192.168.30.10 -N node01
$ cat /tmp/ohai.txt | head
{
"languages": {
"ruby": {
"platform": "x86_64-linux",
"version": "1.8.7",
"release_date": "2012-02-08",
"target": "x86_64-unknown-linux-gnu",
"target_cpu": "x86_64",
"target_vendor": "unknown",
"target_os": "linux",

[/code]

knife bootstrap 으로 노드 설정하기

가상머신으로 실행중인 경우 Work Station에서 knife bootstrap 명령을 원격으로 실행 가능하도록, 몇가지 선행되어야하는 작업이 있는데 다음과 같다.

  • 가상서버에 ssh로그인 가능하도록 호스트 OS의 ~/.vagrant.d/insecure_private_key를 Work Station의 ~/.ssh/id_rsa에 카피

[code lang=text]
### 호스트 OS에서 작업
$ scp ~/.vagrant.d/insecure_private_key worksstation:~/.ssh/id_rsa
[/code]

  • 가상서버에 설치되어 있는 옛날 버젼의 Chef가 설치시 에러를 일으킬 수 있으므로 제거. /usr/bin 디렉토리의 chef-* 파일을 어딘가로 이동해두면 된다.

[code lang=text]
### Work Station에서 작업
$ mv /usr/bin/chef-* /tmp/
[/code]

  • Work Station의 /etc/hosts에 각 노드의 IP주소를 등록해둔다.

[code lang=text]
# /etc/hosts

192.168.30.21 node01
192.168.30.22 node02
192.168.30.23 node03
[/code]

위의 설정은 knife ssh가 호스트로의 통신을 FQDN(Fully Qualified Domain Name)으로 실행하기 위한 것이다.

정리

설치와 실행이 매우 길고 좀 복잡해 보이는데, 차근차근 따라해보면 그렇지도 않다. 관리하는 서버가 10대를 넘어가면 Chef Server를 고려해 보는 것이 좋은 것 같다.

Rsync 정리

회사에서 Rsync를 적극적으로 사용하고 있기에 정리해봤습니다.
조만간 Rsync란 녀석으로 만들어야 되는것도 있고요.
잘 알아두면 프로그래머 인생에 도움이 많이 될 것 같아요.

옵션이나 사용법은 우선 제가 필요로 한 만큼 정리했습니다.

필요에 따라서 문서가 업데이트 될 수도 있습니다.

Rsync란?

2개의 디렉토리를 동기화 시키는 명령어입니다.
하나의 머신의 다른 디렉토리뿐만아니라, 원격에 있는 머신에 있는 디렉토리와도 동기화를 할수 있습니다.
보통사용하는 cp, ftp, rcp이런 카피계열 명령어보다는 동기화 기능이 월등히 좋습니다.
변경됐거나 추가된 파일만 카피한다던지, 소스디렉토리에서 파일을 삭제하면
원격에 있는 머신쪽도 파일을 삭제하는 기능도 있습니다.

Rsync는 동기화할 대상을 가려내는 작업에 “quick check”알고리즘을 사용하고있습니다. quick check알고리즘은 파일사이즈, 최근 변경시간으로 파일들을 찾습니다.

Rsync의 몇가지 추가기능은 아래와 같습니다.

  • 심볼릭링크, 디바이스, 소유자, 그룹 그리고 퍼미션의 복사를 지원
  • GNU tar와 비슷한 exclude와 exclude-from 옵션을 제공
  • CVS exclude모드 – CVS에서 무시하는 파일들을 무시함.
  • 어떠한 리모트 전송쉘이라도 사용가능, rsh, ssh포함
  • 루트권한이 없어도 됨.
  • 파일전송에 파이프라인을 사용하여 레이턴시 비용을 최소화.
  • 익명사용자 혹은 rsync서버인증 지원 (미러링에 최적임)

위와같은 기능을 가지고 있기에, 디렉토리의 백업이나 서버간 파일을 최신파일로 동기화 할때 사용하면 편리합니다.

구문

rsync [-v] [-q] [-a] [-r] [-b] [-u] [-l] [-p] [-o] [-g] [-D] [-t] [-n] [-e=Command] [–del|–delete] [-z] [–exclude] [–stats] [–progress] Source [[USER@]HOST:]DIST 

rsync –version

rsync -h | –help

옵션

-v | –verbose 동기화시 상세정보를 표시함. 해당 옵션은 3개까지 설정가능. 2,3개동시에 설정하면, 더욱 상세한 정보를 표시함
-q | –quiet 동기화 정보를 표시하지 않음. cron등에 의한 배치처리등에서 사용함.
-c | –checksum 전송전에 128비트 MD4의 체크섬을 사용하여, 송신서버의 모든 파일의 체크섬을 만든다. 그 체크섬은 수신서버에서 확인함. 그리고 송신서버와 같은 체크섬, 같은 사이즈, 같은 이름인 파일은 스킵. 해당 옵션을 사용하면 매우 느려짐.
-a | –archive 아카이브 모드로 실행함. [-rlptgoD]옵션을 지정하면 같은 동작을 하나, 해당 옵션 하나로 대부분의 디렉토리, 파일의 정보를 유지하며 동기화가 가능하므로 편리함.
-r | –recursive 재귀적으로 디렉토리를 카피함. 해당 옵션을 지정하지 않으면, rsync명령어로는 디렉토리를 동기화 하지 않음.
-b | –backup 동기화할 디렉토리에 이미 파일이 존재하는 경우, 동기화할 디렉토리에 백업. 이 경우 디폴트로 [~]이 붙는다.
-u | –update 동기화할 디렉토리에 원본소스보다 최신인 파일이 있을경우, 해당 파일은 동기화하지 않음.
–inplace 데이터를 업데이트 해야하는경우, rsync가 파일을 전송하는 방법을 변경한다. 디폴트로는 새로운 복사본을 만들어서 전송하는데, 해당 옵션을 설정하면 동기화 대상 파일에 rsync가 직접 업데이트된 데이터를 쓴다.
이 명령어는 몇가지 영향 끼치는 것이 있다.
1) 바이너리 파일에 사용하면 업데이트 되지 않음.
2) 파일 전송중에는 해당파일은 불일치 상태가 됨.
3) 파일 전송중 실패 혹은 중단이 되면, 해당 파일은 불일치 상태로 남겨짐.
4) 해당파일에 쓰기권한이 없으면 업데이트되지 않음. 그리고
5) rsync의 델타-전송 알고리즘의 효능이 떨어짐.
주의! : 다른 곳에서 해당파일에 접근한다면 사용하지말라, 그리고 복사용으로 사용할경우는 충분히 주의를 기울여서 사용하라.
해당옵션은 큰파일의 블록단위 변화나 데이터의 추가, 그리고 시스템 디스크의 용량이 제한된 상황에서는 유용하다. (네트워크 트래픽 제한은 관계없다.)

또한 해당 옵션은 –partial을 적용시킨다. (전송중 실패한경우 파일을 삭제하지 않기위해서), 그러나 –partial-dir 과 –delay-updates와 같이 사용하면 충돌(conflict)이 일어날 것이다.
rsync 2.6.4에서 –inplace는 –compare-dest, –link-dest와 같이 사용하는건 적절하지 않다.

-l | –links 동기화할 서버에 심볼릭 링크를 작성함. 해당옵션을 지정하지 않을경우에는 심볼릭 링크 파일은 동기화하지 않음
-p | –perms 퍼미션 정보를 유지하면서 동기화를 함.
-o | –owner 소유자 정보를 유지하면서 동기화를 함. root권한을 가진 유저만 실행가능.
-g |–group 그룹 정보를 유지하면서 동기화를함.
-D | –devices 동기화할 디바이스를 재작성함. root권한을 가진 유저만이 실행가능.
-t | –times 파일의 타임 스탬프를 유지하면서 파일을 동기화함. 해당옵션을 지정하지 않는경우는, 모든 파일에 대해 비교 작업을 실행함.
-n | –dry-run 실제로 동기화를 실행하지는 않고, 동기화 하게될 때의 동작을 표시해줌
-e | –rsh=커맨드 rsync커맨드로 사용할 리모트 쉘 프로그램(ssh같은거)를 지정함. 디폴트로는 rsh를 사용
–del|–delete 동기화 소스에 없는 파일이 동기화할 곳에 있는 경우, 그 파일을 삭제함.
–partial 부분적으로 전송된 파일을 유지시킴
–partial-dir=DIR 부분적으로 전송된 파일을 지정한 DIR에 둠.
–delay-updates 업데이트할 파일들을 가장마지막에 둠.
-z | –compress 동기파일을 압축함.
–exclude=패턴 지정한 패턴에 일치하는 파일을 동기대상에서 제외시킴.
–exclude-from=FILE 파일에 기술된 패턴과 일치하는 파일을 제외.
–deamon rsync를 데몬 모드로 실행함.
–config=FILE 별도의 rsyncd.conf파일을 지정
–stats rsync알고리즘의 송신효율을 표시함.
-h | –human-readable 결과의 수치들을 사람이 읽기편한 포맷으로 출력
–progress 전송의 진행 상황을 표시
-P –partial –progress 와 동일
-i | –itemize-changes 모든 업데이트에 대한 요약을 출력
–log-file=FILE 무슨 작업을 했는지에 대한 상세로그를 파일로 남김
동기화 소스 디렉토리 동기화 소스 디렉토리를 지정함.
[[유저명@]호스트명:]동기화할디렉토리 동기화할 서버와 디렉토리를 지정함. 리모트 호스트를 (동기화)타겟으로 할 경우는, 반드시 호스트와 유저명을 같이 지정해야한다.
–version 커맨드의 버전을 표시함.
–help 커맨드의 도움말을 표시함.

사용법

rsync [OPTION]... SRC [SRC]... DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
rsync [OPTION]... [USER@]HOST:SRC [DEST]
rsync [OPTION]... [USER@]HOST::SRC [DEST]
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

리모트쉘을 사용하는 경우는 ‘:’을 사용하고, rsync 데몬에 접속하는 경우는 ‘::’이나 ‘rsync://’을 사용한다.
SRC또는 DEST는 모듈명으로 시작해야한다.

동일 호스트내에서 백업하기

rsync -a SRC DIST
rsync -av /home/user/html/ /home/user/backup/

리모트 호스트에 백업하기

rsync -a SRC 유저명@호스트명:DIST디렉토리
rsync -av -e ssh /home/user/html/ www@remotehost.com:/home/user/backup/
rsync -av -e ssh /home/user/html/ www@remotehost.com:/home/user/backup/

참고 URL
http://ftp.wayne.edu/rsync/rsync.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20070822/280151/
http://www.infoscience.co.jp/technical/rsync/rsync.html

참고
rsync -help

Rsync를 처음 만든사람의 논문
http://www.samba.org/~tridge/phd_thesis.pdf