Skip to content
Joshua Jung edited this page Jun 2, 2014 · 1 revision

chef는 infrastructure를 자동화 하기 위한 프레임워크다. 전체 시스템 형상을 코드화 하고, 코드를 자동으로 수행함으로써 손쉽게 시스템을 운영, 유지, 확장, 복제할 수 있도록 도와준다.

chef가 하는 일들

chef는 컴퓨팅 리소스를 __provisioning__하고, __설정을 관리__하고 이 것들을 __통합__하는 일을 한다.

Provisioning

Chef는 RESTfule API 혹은 knifeCLI를 이용해서, 시스템을 프로비저닝할 수 있다. Baremetal 호스트의 경우 Chef는 리눅스의 kickstart나 solaris의 jumpstart 혹은 AIX의 NIM과 같은 일을 한다. 가상화 환경의 경우 chef는 libvirt와 XEN, KVM, VMware API를 이용해서 프로비저닝할 수 있다.

클라우드의 경우 chef는 AWS나 vCloud의 cloud API를 직접 호출하는 방식으로 프로비저닝 한다. 또한 Java의 jclouds나 ruby의 fog등의 클라우드 소프트웨어와도 통합할 수 있다.

설정 관리

chef는 설정 관리를 위한 모든 기능을 제공한다. Role과 recipes에는 서버가 어떻게 설정돼야 하는지에 대한 설정 정보와 설정 정보의 수행을 위한 코드를 가지고 있다. 예컨데 mysql, apache, hadoop을 위한 설정을 관리할 수 있다. 단지 설정만을 관리할 뿐만 아니라, 패키지를 검사해서 설치하고, 실행하고, 중단할 수도 있다.

시스템 통합

Chef의 최종 목적은 인프라를 자동으로 구성하고 이를 통합하는 것이다. Chef의 가장 강력한 점 중에 하나는 설정 로직으로 부터 설정 데이터가 분리돼 있다는 점이다. 설정 데이터는 NoSQL 형태로 바로 동적으로 색인되어서 저장되며, search API를 이용해서 인프라 정보를 즉시 확인해서 설정로직에 적용할 수 있다. 다른 말로 Chef recipes는 데이터를 기반으로 시스템과 서버들을 통합할 수 있다. 예를 들어 웹서버는 search api를 이용해서 database와 memcache 서버들을 찾을 수 있으며, 자동으로 웹 서버 설정에 반영 이들을 서로 묶을 수 있다.

chef 구조

chef는 server & client 모델을 따르는 프레임워크로 chef server, workstations, node로 구성된다.

  1. Chef Server:

Chef Server는 인프라 (설정)정보 코드를 저장하기 위한 Chef 코드 저장소를 가지고 있다. 모든 chef 코드는 chef server에 집중해서 관리한다. chef server는 REST API를 이용해서 접근할 수 있다. 추가적으로 WebUI를 이용해서 인프라스트럭쳐를 관리할 수도 있다. 데이터는 couchdb로 관리를 하며, solr을 이용해서 검색 서비스를 제공한다.

  1. Node:

인프라를 구성하는 단위 시스템으로 chef client가 설치된다. Bearmetal 혹은 VM 환경일 수 있다. 노드는 chef-client 프로그램을 실행해서 chef server로 부터 run list를 가져와서 설정을 변경하고 패키지를 설치하고 애플리케이션을 실행한다. 노드는 클라이언트라고 부르기도 한다.

  1. Workstation :

Chef server는 (자동화를 위한)데이터와 로직을 가지고 있다. 데이터와 로직은 knife를 이용해서 개발을 하는데, knife가 설치된 서버를 workstation이라고 한다. 즉 chef 개발 노드라고 할 수 있다. chef 개발자는 workstation에 설치된 knife를 이용해서 데이터와 코드를 개발하고 이 정보를 chef server에 upload 한다.

Chef 구성요소들

Nodes, Run List

노드는 chef client가 설치되는 호스트 컴퓨터다. 노드 자동화는 데이터인 attributes와 로직을 담고 있는 run list에 의해서 이루어진다. Attributes는 노드의 속성 값들이 저장된다. 노드 변수라고 생각하면 이해가 쉽다.

Run list는 자동화를 위한 로직을 담고 있는 코드 조각이다. 하나의 노드는 하나 이상의 run list를 가지고 있는데, run list는 코드와 attributes를 이용해서 자동화를 수행한다. 코드와 변수로 이루어진 실행 가능한 조각 프로그램의 목록이 run list의 정체다..

Roles

Chef는 대량의 노드를 자동화하는 것을 목표로 하고 있다. 이들 노드들은 동일한 속성을 가진 그룹이루 이루어질 것이다. 예컨데, 웹 서비스 노드들이라면 apache, dbms, php를 포함해서 동일한 속성을 가질 것이다.

Role를 이용해서 같은 특성을 가지는 node들을 그룹으로 묶어서 관리할 수 있다. Role는 하나 이상의 run list를 가지고 있는데, 같은 role을 공유하는 node들은 모두 동일한 설정과정을 거치게 된다.

Cookbooks

Cookbooks는 recipe, resource definition, attribute, library, cookbook file 그리고 template 파일, 기타 메타데이터의 모음이다. 일반적으로 Cookbook는 애플리케이션 단위로 개발한다. 즉 mysql cookbook, apache cookbook, DHCP cookbook 형식으로 개발한다.

일반적으로 chef 코드의 개발은 cookbook을 개발하는 것을 의미한다.

Recipes

Recipe는 cookbook의 구성요소로 설정 로직을 담고 있는 코드다. recipe는 ruby 코드로 만들어져 있으며, ruby 코드와 attribute, resource 등을 이용해서 만든다.

Resources

리소스는 자동화를 위해서 많이 사용하는 코드를 라이브러리 형태로 개발해 둔 chef 구성요소다. Chef는 user(유저관리), group, directory, file, cron, service 등 시스템 자동화에 필수적으로 사용하는 기능들을 resource 형태로 제공한다.

리소스는 멀티 플랫폼을 지향한다. 예를 들어 package리소스를 이용하면 패키지를 설치할 수 있는데, apt, yum, BSD ports등의 플렛폼에 맞는 패키징 시스템을 사용한다.

Data Bags

Data bags는 chef server에 저장되는 key - value 형식의 데이터다. data bags의 데이터는 모든 cookbook에서 전역변수처럼 사용할 수 있다. 인프라스트럭쳐 전체에서 사용되는 데이터를 저장하기 위해서 사용한다.

Clone this wiki locally