Role – 노드를 역활별로 그루핑 해서 관리하고 싶을 때

Node Object

chef solo로 관리하는 서버가 늘면, Node Object를 정의하는 JSON파일 수가 서버수만큼 늘게 되는데, Node Object에 정의한 run_list에 실행할 레시피를 일일이 JSON파일에 적어주는게 귀찮아진다.

예를 들어 같은 레시피를 적용할 5개의 노드가 있는 경우 새로운 레시피를 추가하고 싶은경우 5번을 복사 붙이기를 하는건 DRY법칙에 어긋나고 귀찮기도 하다. 그래서 run_list와 Attribute를 노드의 역활별로 그루핑 할 수 있는 Role을 사용하면 된다.

Chef solo의 경우 Role은 roles디렉토리의 아래에 Role별로 파일을 만들고, 그안에 Rolo에 필요한 내용을 JSON으로 적는다.

웹서버용 노드의 Role을 rolos/webserver.json으로 작성해보자.

json
{
"name":"webserver",
"default_attributes": {},
"override_attributes": {},
"json_class":"Chef::Role",
"description":"",
"chef_type":"role",
"run_list":[
"recipe[yum::epel]",
"recipe[nginx]",
"recipe[sysstat]"
]
}

배포하려는 서버의 Node Object에는 아래와 같이 적으면 됨

json
{
"run_list":[
"role[webserver]"
]
}

여러개 섞어서 적는것도 가능

“`json
{
“run_list”:[
“recipe[nginx]”,
“role[webserver]”,
“role[db]”
]

}
“`

Role에 어트리뷰트를 정의하는 것도 가능

json
default_attributes "apache2" => {
"listen_ports" => ["80", "443"]
}

chef정리

chef 정리

knife가지고 놀기

cookbook 만들기

shell
$ knife cookbook craete [쿡북이름] -o [디렉토리명]
$ knife cookbook craete hello -o site-cookbooks

knife solo

knife-solo의 설치

knife-solo는 rubygem이므로 아래의 커맨드로 설치가능
shell
$ gem install knife-solo

설치하는 것 만으로도 knife커맨드에 chef-solo를 위한 커맨드가 추가 됨.

knife solo를 파라메터 없이 실행해 보면 사용가능한 커맨드의 리스트가 출력 됨.

knife-solo의 문서

https://github.com/matschaffer/knife-solo/blob/master/README.rdoc

레시피 전송 & 실행 knife solo cook

shell
$ knife solo cook 유저@호스트명

cook 커맨드는 키친(리포지토리)를 대상 서버에 업로드하고, chef-solo를 실행시킨다.

knife-solo를 이용한 chef-solo 실행환경 준비

shell
$ knife solo prepare 유저@호스트
$ knife solo prepare -p 포트 유저@호스트

리포지토리 작성

shell
$ knife solo init 리포지토리 명

디렉토리 구성은 아래와 같다.

├── .chef
│ └── knife.rb
├── cookbooks #다운로드한 쿡북을 저장
├── data_bags #노드간에 공유할 수 있는 변수 저장
├── nodes #노드별로 JSON파일을 저장
├── roles
└── site-cookbooks #자신이 만든 쿡북을 저장

prepare + cook = bootstrap

shell
knife solo bootstrap 유저@호스트

knife solo prepare 를 호출하고 나서 knife solo cook을 호출.

clean

shell
$ knife solo clean 유저@호스트

대상 호스트에 있는 키친(레포지토리)을 완전히 삭제