<< Python의 디자인 원칙 : PEP 20 | Home | The Ten Commandments of Egoless Programming >>

가상 환경에서 Chef 훅 돌려보기

Chef의 이해

1. Chef 구조
Chef는 Server & Client모델을 따르는 프레임워크로 Chef Server, Workstations, Node로 운영된다.


  • Chef Server는 인프라 (설정)정보를 저장하기 위한 Chef 코드 저장소를 가지고 있어, Chef 코드를 Chef Server에서 집중해서 관리한다. Chef Server로는 REST API를 통해 접근이 가능하며, WebUI를 이용해서도 Chef Server의 인프라를 관리할 수도 있다.
  • Workstation은 Knife가 설치된 서버로, Knife를 가지고 데이터와 코드를 작업하는 공간으로 Node에서 Provisioning 가능한 수준으로 개발해서 Chef Server로 업로드하는 일련의 작업을 한다.
  • Node는 클라이언트라고도 불리며, 서비스를 구성하기 위한 최소의 물리적 서버이며, Chef Server로부터 runlist를 가져와 패키지를 설치하고, 설정도 반영하며, 애플리케이션을 실행하기도 한다.
2. Chef의 구성 요소

  • certificates : SSL 인증서 저장 디렉토리이다.
  • config : rake.rb이 있는데, SSL Certificates 정보, 그외 cookbook 관련된 정보가 기술된다.
  • cookbooks : Chef에서 공유되고 분배(유통)되는 기본 단위이다.
  • data_bags : Chef Server에 저장되는 key/value 형식의 데이터 저장소. data bags의 데이터는 모든 Cookbook에서 전역변수처럼 사용할 수 있다.
  • environments : production, staging, development, testing 등 구조적으로 분리된 다른 공간을 관리하기 위한 매카니즘을 제공한다.
  • roles : Role를 이용해서 같은 특성을 가지는 node들을 그룹으로 묶어서 관리할 수 있다. 예를 들어 웹 서비스 노드라고 하면 apache, java, tomcat 등이 포함되어야 하는 속성을 가진다. 결국 웹서비스 노드들은 같은 Role을 공유하면 되므로, node들은 모두 동일한 설정 과정을 거치게 된다.
3. Cookbook의 구성 요소

  • recipes : Node를 구축하기 위한 설치 지침을 작성하며 Ruby로 작성된다.
  • attributes : Recipe에서 사용할 변수를 기술한다.
  • definitions : 기존 Resource를 결합하여 재사용 가능한 새로운 Resource를 정의 할 수 있다.
  • files : Recipe에서 사용할 파일이 저장되는 곳이다. 설정 파일과 패키지 파일이 있다.
  • libraries : 리소스 기능들을 확장해서 클래스로 만들어 놓으면, 이를 Recipe에서 호출해서 사용한다.
  • templates : File과 비슷하지만, Attribute 등에 따라 내용을 편집하는 전체의 설정 파일 템플릿. erb 형식으로 작성한다.
  • resources : cross-platform의 추상화가 되어 있어, OS와 패키지의 버전의 차이를 신경안써도 되게끔 설계되어 있다.
  • providers : Resource를 받고 Resource와 Node의 현재 상태를 비교하며 Resource의 동작을 수행한다. 즉, Resources의 이행 도구가 된다.
  • metadata : Chef에 Recipe 및 종속성 버전 제약, 지원 플랫폼, Cookbook간의 의존 관계 등을 전달하는 데 사용한다.

4. 기본적인 작성 순서
Community(github)에서 필요한 cookbook tempplate 받아서 -> Attributes 정의하고 -> Templates 파일 생성하며 -> Recipe 작성하고 -> Metadata를 작성한 다음 Cookbook을 Chef Server로 업로드 한다.

5. Recipe 작성시에 알아야 할 정보
  • driectory : 디렉토리 생성, 삭제할 경우 사용한다.
  • template(파일) : 파일의 생성과 대체해야할 경우 사용. template을 많이 사용한다.
  • command : execute, command를 사용해서 커맨드를 실행할 때 사용한다.
  • service 서비스의 실행, 정지, 재실행할 경우 사용한다.
  • package : 패키지 설치 및 업데이트 할 경우 사용한다.
  • platform : OS등 환경을 고려한 설정일 경우 사용한다.

Chef 설치 및 환경 구성

1. 환경 구성
virtual box와 vagrant를 활용한 가상화 환경에서 Chef Server, Workstation, Node를 구성해서 테스트를 진행한다.

- Vagrantfile 정보
 Vagrant.configure("2") do |config| 

 config.vm.define :chef_server do |host|
    host.vm.box = "CentOS-6.4-x86_64"
    host.vm.hostname = "chef-server"
    host.vm.network :private_network, ip: "192.168.33.12"
  end 

  config.vm.define :my_node do |host|
    host.vm.box = "CentOS-6.4-x86_64"
    host.vm.hostname = "my-node"
    host.vm.network :private_network, ip: "192.168.33.13"
  end 
 
  # Set system settings
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
    vb.customize ["modifyvm", :id, "--cpus", "1"]
  end 

end

Vagrant를 통해 Virtualbox를 구동시키는 커맨드는 아래와 같다.
$ vagrant up chef_server
$ vagrant up my_node
$ vagrant status
Current machine states:
chef_server running (virtualbox)
my_node running (virtualbox)

2. Chef Server 구축
Chef Server 구축은 chef_server machine에서 진행한다. 접근 명령어는 아래와 같다.
$ vagrant ssh chef_server

- 패키지 가져오기
$ wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/
  chef-server-11.0.8-1.el6.x86_64.rpm

- 패키지 설치
$ sudo rpm -ihv chef-server-11.0.8-1.el6.x86_64.rpm

- Chef-Server 초기 설정
Nginx이나 PostgreSQL 등 Chef-Server에서 사용되는 응용 프로그램도 설치되므로 그 기본 포트 번호를 사용하는 프로세스가 있는 경우 미리 중지해야 한다.
$ sudo chef-server-ctl reconfigure

- API 동작 테스트 및 상태 체크
$ sudo chef-server-ctl test

- Chef-Server 상태 체크
$ sudo chef-server-ctl status
run: bookshelf: (pid 5397) 397s; run: log: (pid 5396) 397s
run: chef-expander: (pid 5356) 403s; run: log: (pid 5355) 403s
run: chef-server-webui: (pid 5547) 380s; run: log: (pid 5546) 380s
run: chef-solr: (pid 5306) 409s; run: log: (pid 5305) 409s
run: erchef: (pid 5746) 351s; run: log: (pid 5435) 391s
run: nginx: (pid 5727) 353s; run: log: (pid 5726) 353s
run: postgresql: (pid 5217) 415s; run: log: (pid 5216) 415s
run: rabbitmq: (pid 746) 884s; run: log: (pid 744) 884s

- iptables 오픈
80, 443 포트를 개방해 주기위해서 iptables에 다음 행을 추가해 준다.
$ sudo vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

$ sudo service iptables start

- 웹 화면 접속
"https://chef-server"로 접속한 다음, username/password는 오른쪽 사이드에 노출되어 있는데, 이것으로 먼저 로그인해 보면 그 다음엔 비밀번호 변경 화면이 표시되므로 새 암호를 입력하고 저장한다. 이 때 개인키를 다시 생성(Regenerate Private Key 확인)한다.

다음 화면에서 개인키(Private Key)의 내용이 표시되므로 복사하여, /etc/chef-server/admin.pem 파일안에 그 내용으로 붙여넣는다. 그리고 혹시 모를 문제에 대비해 admin.pem을 백업해 둔다.


새 비밀번호로 로그인 되면 OK. 그리고 Node 정보를 hosts에 등록해 준다.
$ vi /etc/hosts
192.168.33.13 my-node


3. Workstation 구축
Chef Server를 조작하는 Client 환경(Node)을 구축하는데, 여기서는 Workstation이 되는 환경을 Chef Server와 같은 chef_server VM에 설치를 한다.

- Chef 클라이언트 설치
$ sudo curl -L https://www.opscode.com/chef/install.sh | bash

- 인증서 파일의 복사
Chef Server에 액세스하기 위한 비밀키(/etc/chef-server/admin.pem)을 Workstation에 복사한다.
$ sudo cp /etc/chef-server/admin.pem /etc/chef/

새 Chef Client(Workstaion/Node)를 Chef Server에 등록할 때 필요한 Chef Server의 chef-validator.pem(/etc/chef-server/chef-validator.pem)라는 키 파일을 Workstation에 복사한다.
$ sudo cp /etc/chef-server/chef-validator.pem /etc/chef/

※ chef-validator는 Chef Server에 새로운 Chef Client(Workstation/Node)를 등록하기 위한 특별한 전용 클라이언트이다.

- Chef 새 유저 생성
knife 명령으로 Chef Server에서 작업하는 사용자를 만드는데, 주로 Workstation에서 Chef-Server에 대해 knife 명령을 사용하는 API를 실행하는 사용자이다.
$ sudo knife configure -i
Overwrite /root/.chef/knife.rb? (Y/N) y
Please enter the chef server URL: [https://chef-server:443] https://chef-server
Please enter a name for the new user: [vagrant] 
Please enter the existing admin name: [admin] 
Please enter the location of the existing admin's private key: [
 /etc/chef-server/admin.pem] 
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): 
Creating initial API user...
Please enter a password for the new user: 
Created user[vagrant]
Configuration file written to /root/.chef/knife.rb

root의 홈 디렉토리 아래에 생성한 사용자의 개인키(/root/.chef/vagrant.pem)가 생성된다. 이제 이 개인키로 Chef Server에 인증 할 수 있게 된다.
$ sudo ls /root/.chef/
knife.rb  vagrant.pem

- vi /root/.chef/knife.rb에서 아래 항목 추가해 줌.
cookbook_path '/home/vagrant/repo/releasex-chef/cookbooks'

이렇게 함으로써 knife 명령어 실행시에 cookbooks의 위치를 지정하지 않아도 자동으로 cookbooks paths를 인식하게 된다.

- 등록된 유저 목록 조회
아래 커맨드를 통해 등록된 유저 정보를 조회할 수 있다.
$ sudo knife user list
admin
vagrant


4. Node 구축
Chef Server에서 설정 파일을 검색하여 구성을 반영시키기 위한 Client 환경(Node)를 구축하는 것이며, Node가 되는 서버는 my_node VM이다.
$ vagrant ssh my_node

- Chef Server에서 Node 등록 준비 먼저 Chef Server에서 knife 명령으로 Node를 등록하기 위한 설정 파일(client.rb)와 키 파일(validation.pem)를 생성한다.
$ sudo knife configure client /tmp
Creating client configuration
Writing client.rb
Writing validation.pem

- Node 등록
my_node VM을 Node로 해 Chef Server에 등록하기 위해 Node(my_node)에 Chef Client 패키지를 설치한다.
$ sudo curl -L https://www.opscode.com/chef/install.sh | bash

Chef Server(chef_server)에서 만든 설정 파일(client.rb)와 키 파일(validation.pem)를 Node 서버(my_node)의 /etc/chef scp로 카피한다.
$ mkdir -p /etc/chef
$ sudo scp /tmp/client.rb vagrant@192.168.33.13:/etc/chef
$ sudo scp /tmp/validation.pem vagrant@192.168.33.13:/etc/chef

Node(my_node)에서 정상 카피되었는지 확인한다.
$ sudo ls /etc/chef
client.rb  validation.pem

Node(my_node)의 호스트 파일에 chef-server IP 등록해 준다.
$vi /etc/hosts
192.168.33.12	chef-server

Node(my_node)에서 chef-client 명령으로 Chef Server(chef-server)로 Node를 등록한다.
$ chef-client
[2013-10-29T02:14:03+00:00] INFO: Forking chef instance to converge...
Starting Chef Client, version 11.6.2
[2013-10-29T02:14:03+00:00] INFO: *** Chef 11.6.2 ***
Creating a new client identity for my-node using the validator key.
[2013-10-29T02:14:04+00:00] INFO: Client key /etc/chef/client.pem is not present
  - registering
[2013-10-29T02:14:05+00:00] INFO: Run List is []
[2013-10-29T02:14:05+00:00] INFO: Run List expands to []
[2013-10-29T02:14:05+00:00] INFO: Starting Chef Run for my-node
[2013-10-29T02:14:05+00:00] INFO: Running start handlers
[2013-10-29T02:14:05+00:00] INFO: Start handlers complete.
resolving cookbooks for run list: []
[2013-10-29T02:14:05+00:00] INFO: Loading cookbooks []
Synchronizing Cookbooks:
Compiling Cookbooks...
[2013-10-29T02:14:05+00:00] WARN: Node my-node has an empty run list.
Converging 0 resources
[2013-10-29T02:14:05+00:00] INFO: Chef Run complete in 0.274710262 seconds
[2013-10-29T02:14:05+00:00] INFO: Running report handlers
[2013-10-29T02:14:05+00:00] INFO: Report handlers complete
Chef Client finished, 0 resources updated

- Workstation에서 등록된 Node 확인
아래 커맨드로 확인할 수 있다.
$ sudo knife node list
my-node

Chef Server 관리 화면에서도 확인할 수 있다.



Node 등록및 Cookbook 만들기, Recipe의 실행 환경 구축

1. Chef 저장소 셋팅
먼저 Workstation(chef_server)에 Chef 저장소를 준비해야 한다. 저장소는 Chef 실행에 필요한 파일(Cookbooks, role, environments 등)이 포함되어 있어 Knife 명령으로 Chef Server로 저장소의 데이터를 업로드하여 Node 관리에 활용된다. 이 저장소는 Git 및 Subversion 같은 버전 관리 시스템에서 관리하는 것이 좋다. 그리고 Chef의 기본 저장소 구성 정보가 Github(opscode)에 공개되어 있으니 다운 받는다.
$ cd /home/vagrant/repo
$ git clone https://github.com/opscode/chef-repo
$ mv chef-repo releasex-chef

2. Cookbook 만들기
Workstation(chef_server)에서 knife 명령을 실행하여 Cookbook을 만든다. 여기서는 ntp를 활용하겠다.
$ sudo knife cookbook create ntp -o /home/vagrant/repo/releasex-chef/cookbooks
** Creating cookbook ntp
** Creating README for cookbook: ntp
** Creating CHANGELOG for cookbook: ntp
** Creating metadata for cookbook: ntp

$ cd /home/vagrant/repo/releasex-chef/cookbooks
$ ls
ntp README.md
ntp 디렉토리가 생성된걸 확인할 수 있다.
기타 cookbook 삭제(cookbook 업로드 시) 등의 커맨드도 있으니 익혀두면 좋다.
$ sudo knife cookbook delete ntp 0.1.0

3. Attribute 만들기
Attribute 디렉토리는 Recipe에서 사용할 변수를 기술하는 곳이다.
$ cd /home/vagrant/repo/releasex-chef/cookbooks
$ cd ntp/attributes/
$ vi default.rb
case platform
  when "ubuntu","debian"
    default[:ntp][:service] = "ntp"
  when "redhat","centos","fedora","scientific"
    default[:ntp][:service] = "ntpd"
end

default[:ntp][:servers] = ["kr.pool.ntp.org", "time.bora.net", "time.windows.com"]

4. Template 만들기
templates 디렉토리는 설정 파일등을 지정하기 위해서 사용되는 디렉토리이고 확장자는 .erb로 만들며, 템플릿 파일 내부에 variables을 매핑해서 설정파일을 동적으로 적용할 수도 있다.
$ cd ../templates/default/
$ vi ntp.conf.erb
driftfile /var/lib/ntp/ntp.drift

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery

restrict 127.0.0.1
restrict ::1

<% node[:ntp][:servers].each do |ntpserver| -%>
server <%= ntpserver %>
<% end -%>

#includefile /etc/ntp/crypto/pw
#keys /etc/ntp/keys

template 파일안의 내용을 보면 알겠지만, 설정 파일에 템플릿 기능을 적용한 것으로 필요할 경우 매개 변수(<%= [variables] %>)를 셋팅할 수 있다.

5. Recipe 만들기
recipes 디렉토리는 Node를 구축하기 위한 설치 지침을 작성하는 곳이다.
$ cd ../../recipes/
$ vi default.rb
#
# Cookbook Name:: ntp
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
case node[:platform]
when "ubuntu","debian"
  package "ntpdate" do
    action :install
  end
end

package "ntp" do
  action [:install]
end

template "/etc/ntp.conf" do
  source "ntp.conf.erb"
  owner "root"
  group "root"
  mode 0644
  notifies :restart, "service[ntp]"
end

service "ntp" do
  service_name node[:ntp][:service]
  action [:enable, :start]
end

6. Metadata 만들기
metadata.rb파일은 Chef에 Recipe 및 종속성 버전 제약, 지원 플랫폼, Cookbook간의 의존 관계 등의 정보를 전달하는 데 사용된다.
$ cd ../
$ vi metadata.rb
name             'ntp'
maintainer       'mimul'
maintainer_email 'hahojingmail.com'
license          'All rights reserved'
description      'Installs/Configures ntp'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'

%w{ ubuntu debian redhat centos fedora scientific }.each do |os|
  supports os
end

recipe "ntp", "Installs and configures ntp"

7. Cookbook 업로드
Workstation(chef-server)에서 Chef Server(chef-server)로 Cookbook을 업로드하여 등록한다. 여기서는 Workstation과, Chef Server는 동일한 서버다.
$ sudo knife cookbook upload ntp
$ sudo knife cookbook list
ntp             0.1.0

8. Node에 Recipe 추가
Chef Server(chef-server)에 등록한 Cookbook의 Recipe를 Node(my-node)에 추가한다.
$ sudo knife node run_list add my-node "recipe[ntp]"
my-node:
run_list:
recipe[ntp]

$ sudo knife node show my-node
Node Name:   my-node
Environment: _default
FQDN:        my-node
IP:          10.0.2.15
Run List:    recipe[ntp]
Roles:       
Recipes:     ntp
Platform:    centos 6.4
Tags:        

9. Node에서 Recipe 실행
Node(my-node)에서 chef-client 명령어를 실행하여 Recipe의 내용을 Node에 반영한다.
$ sudo chef-client

Tags : ,


Re: 가상 환경에서 Chef 훅 돌려보기

<div>이 노가다를 S사 swift 구축할때 지겹게 했죠. 그래서 앞으로 새로 할 기회 생기면 chef 버리고 ansible로 이사갈려고 합니다.</div> <div> </div> <div>같은 결과를 낼거면 어렵고 복잡한 것보다 직관적이고 쉬운 게 장땡. </div> <div> </div> <div> </div>

Re: 가상 환경에서 Chef 훅 돌려보기

ansible도 좀 쓰는거 같아요.. ^^ 


Add a comment Send a TrackBack