Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

chef

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

시스템 인프라도 정보의 조합이다. 시스템/네트워크 관리자는 인프라를 체계적으로 정리할 수 있다는 것을 알고 있다. 체계적으로 정리할 수 있다는 것은 이를 코드화 할 수 있다는 의미다. Chef는 인프라 정보를 코드화 할 수 있다는데 착안해서 만든 인프라 관리소프트웨어다. chef는 인프라를 구성하는 데이터들을 변수에 저장하고, 프로비저닝 하고 설치하는 과정을 코드 해서 관리한다. 프로그램이라는게 별건가 변수 + 코드다.

코드화를 하는 이유는 프로그램을 이용해서 데이터를 관리하는 이유와 동일하다. Chef를 이용하면, 인프라의 자동화를 위해서 필요한 정보를 recipes라는 재사용가능 한 코드로 정의 할 수 있다. 예를 들어서 웹 서버와 데이터베이스, 로드밸런서로 구성된 웹 서비스가 있다면, 이들을 recipes로 만들수 있다. 재사용 가능한 프로그램이라고 생각하자.

레시피는 리소스(resource)라고 부르는 블록으로 만들어진다. 리소스는 유저관리, 파일, 템플릿, 패키지 설치와 같은 인프라를 관리하기 위해서 필요한 기능들의 모음이다. 일종의 함수인 셈이다. Chef에는 유용한 많은 수의 리소스를 가지고 있으며, 자신만의 리소스를 만들어서 사용할 수도 있다.

chef 구조

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

Chef Server

Chef 서버는 레시피와 다른 설정 데이터를 저장하는 중앙 저장소다. Chef로 관리하기 원하는 노드(node)에는 Chef 클라이언트가 설치되는데, Chef 클라이언트가 chef 서버로 부터 레시피와 설정 데이터를 가져와서 실행하는 방식으로 작동한다.

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

Chef Client

Chef로 관리하려는 노드에는 chef client가 설치된다. 노드는 물리적인 서버나 인스턴스가 될 수 있다. Chef 클라이언트는 주기적으로 Chef 서버에 연결해서, 최신의 레시피를 확인하고 레시피 코드를 실행한다.

Workstation

개발자는 Chef server에 접근할 수 있는 권한을 획득 한뒤, 노드 관리, 레시피 개발과 같은 DevOps 업무를 수행하게 된다. 이 작업이 이루어지는 노드(개인 PC 혹은 인스턴스)를 Workstation이라고 한다. 개발자는 knife와 웹 콘솔을 이용해서 이들 작업을 수행한다.

Chef 구성요소들

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는 recpie, 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에서 전역변수처럼 사용할 수 있다. 인프라스트럭쳐 전체에서 사용되는 데이터를 저장하기 위해서 사용한다. JSON 형태로 사용한다.