Installation

http://www.opscode.com/chef/install/에서 OS에 맞는 서버 패키지 다운 받아서 설치

$ sudo chef-server-ctl reconfigure

Workstation 설정

Workstation은 knife를 이용해서 chef-server의 작업을 하는 머신이다. 개발자의 PC 또는 별도의 서버가 될 수 있다.

사용할 계정에서 chef-server에 있는 validation.pem, admin.pem 파일을 복사한 후에 설정한다.

$ mkdir -p ~/.chef
$ sudo cp /etc/chef/validation.pem /etc/chef/webui.pem ~/.chef
$ sudo chown -R `whoami` ~/.chef

Configuration

$ knife configure -i

설정 확인

$ knife client list
$ knife cookbook list

확인

Chef server

4000

Chef server UI

4040

CouchDB

5984

RabbitMQ

5672

Chef Solr

5672

Chef Expander

--

WebUI로 로그인

Client install

ruby의 의존성이 문제가 생길 수 있다면 all in one package 방법이 아니라면 bootstraping 방법이 좋겠다.

all in one package

위키에 있는 방법은 복잡하고.. http://www.opscode.com/chef/install/ 에 있는 방법은 하나의 패키지로 ruby가 embeded된 패키지로 설치한다. 스크립트를 실행하면 결국은 자동으로 아래의 다운로드 링크로 리다이렉트 되므로 아래 파일을 바로 설치하는 것이 좋다.

https://opscode-omnitruck-release.s3.amazonaws.com/ubuntu/11.04/x86_64/chef_11.4.0-1.ubuntu.11.04_amd64.deb

package

$ apt-get install opscode-keyring
$ apt-get install chef

복사하고 클라이언트를 재시작하면 노드로 등록된다.

$ knife node list

로 확인하든가 아니면, WebUI의 Nodes를 보면 확인할 수 있다.

Bootstrap

위에서 일일이 명령어를 치지 않고 chef server에서 knife를 이용해서 chef client를 설정하고, 해당 chef-server에 자동으로 연결한다.

$ knife bootstrap 10.200.1.5 -d ubuntu10.04-apt --sudo -x <user> -P <pass> --bootstrap-version 0.10

Ubuntu 12.04 Bootstraping

Ubuntu 12.04는 지원하지 않고 있는데, /usr/lib/ruby/vendor_ruby/chef/knife/bootstrap/에 bootstrap 관련 파일이 있고 여기에서 10.04-apt 파일을 12.04-apt로 약간 수정해서 사용하면 된다.

그리고 기본으로 제공되는 12.04-gem은 에러가 나고 있다.

$ diff -ruN ubuntu10.04-apt.erb ubuntu12.04-apt.erb 
--- ubuntu10.04-apt.erb 2012-06-19 09:02:47.000000000 +0900
+++ ubuntu12.04-apt.erb 2012-06-30 03:35:41.770845223 +0900
@@ -4,7 +4,7 @@
 if [ ! -f /usr/bin/chef-client ]; then
   apt-get install -y wget
   echo "chef   chef/chef_server_url    string  <%= @chef_config[:chef_server_url] %>" | debconf-set-selections
-  [ -f /etc/apt/sources.list.d/opscode.list ] || echo "deb http://apt.opscode.com <%= chef_version.to_f == 0.10 ? "lucid-0.10" : "lucid" %> main" > /etc/apt/sources.list.d/opscode.list
+  [ -f /etc/apt/sources.list.d/opscode.list ] || echo "deb http://apt.opscode.com <%= chef_version.to_f == 0.10 ? "precise-0.10" : "precise" %> main" > /etc/apt/sources.list.d/opscode.list
   wget <%= "--proxy=on " if knife_config[:bootstrap_proxy] %>-O- http://apt.opscode.com/packages@opscode.com.gpg.key | apt-key add -
 fi
 apt-get update
@@ -41,6 +41,8 @@
 echo 'https_proxy "knife_config[:bootstrap_proxy]"' >> /etc/chef/client.rb
 <% end -%>
 
+ntpdate -u -b kr.pool.ntp.org
+
 (
 cat <<'EOP'
 <%= first_boot.to_json %>

또한 opscode apt repository가 잘못된건지 0.10이외에는 되지 않는다.

$ knife bootstrap 10.200.1.5 -d ubuntu-12.04-apt --sudo -x choe -Pchoe --bootstrap-version 0.10 -r 'recipe[ntp]'

http://wiki.opscode.com/display/chef/Custom+Knife+Bootstrap+Script

Attriute

knife를 이용해서 attribute 삭제하기

$ knife exec -E 'nodes.find(:hostname => "pxe"){|n| n[:pxe][:ssh_key].nil? ? false : n[:pxe].delete(:ssh_key); n.save; }' --environment dev

Cookbook

레포지토리 구조 만들기

$ git clone git://github.com/opscode/chef-repo.git

community cookbook

$ knife cookbook site search ntp
$ knife cookbook site install ntp -o ./

fast_start cookbook

fast_start cookbook 만들기

$ cd chef-repo
$ knife cookbook create fast_start -o ./

Cookbook 수정

업로드

$ cd cookbooks
$ knife cookbook upload -a -o ./

cookbook 확인

$ knife cookbook list

chef-client로 실행할 노드 run list 등록

$ knife node run_list add <hostname> 'recipe[fast_start]'
$ knife node show <hostname> -r

chef-node에서 강제로 chef-client 실행

$ chef-client

해당 노드에서 실행 결과 확인!

Environment

dev, staging, production고 같은 서로 다른 환경을 관리하기 위한 방법

$ knife environment create dev
$ knife environment show dev -Fj > environment/dev.json

Node의 environment 변경

$ knife exec -E 'nodes.transform("name:control.choe") { |n| n.chef_environment("dev") }'
$ knife exec -E 'nodes.transform("environment:_default") { |n| n.chef_environment("dev") }'

Role

롤 만들기

$ knife role create <role-name>

노드에 롤 추가

$ knife node run_list add sn-compute "role[ROLE_NAME]"

파일에서 롤 가져오기

$ knife role from file FILE

여기서 파일은 roles에 있는 파일로 json, DSL등의 형식을 가진다. DSL을 이용해서 관리하는 것을 권장한다.

Library

cookbook/libraries에 공통으로 사용할 라이브러리 코드를 위치하면 여러 쿡북에서 가져다 사용할 수 있다.

openssl의 secure_password 라이브러리 사용하는 것을 참조하는 것이 가장 좋을 것이고, 간단하게 정리하면

라이브러리 정의:

module Woosum
  module TestModule
    module MyModule
      def my_function
         bla bla
      end
    end
  end
end

라이브러리 사용:

::Chef::Recipe.send(:include, Woosum::TestModule::MyModule)

이렇게하면 해당 함수는 레시피 안에서 사용 가능하다. 어딘가를 보니 이 함수들은 private/protected 형태로 선언된다고 한다.

Search

$ knife search node "role:role-name"

검색에 사용될 키 이름은 knife node show를 이용해서 찾는다.

$ knife node show [node-name] -Fj

cookbook에서 찾는다면...

result, _, _ = Chef::Search::Query.new.search(:node, "roles:#{role}")

search expanded run list

위에 있는 방법으로 node를 찾으면, node에 명시되어 있는 recipe, role만 대상으로 합니다. 그런데 role이 포함하고 있는 role, recipe를 찾으려고 할 때는 방법이 없죠. 그래서 expanded run list를 대상으로 찾는 방법이 있는데 간단합니다.

$ knife search node "recipes:recipe-name"
$ knife search node "roles:role-name"

또한 run list가 expand되는 때는 chef-client가 실행되면서 이므로, 여기에 검색되는 결과는 chef-client가 최소 한번은 정상적으로 동작했다는 것을 보장합니다.

기타

knife ssh

$ knife ssh roles:openstack-base -Pchoe -xroot 'hostname -f'
c-01-02.choe  c-01-02.choe
control.choe  control.choe

Node Attribute 삭제

$ knife exec -E "nodes.transform(:all) {|n| n.normal_attrs[:foo].delete(:bar) rescue nil }"

멀티 chef repository

일반적인 설명을 보면 client.pem, validation.pem 등 chef workstation의 설정 파일들을 /etc/chef 또는 ~/.chef에 넣도록 되어있다. 그런데 chef로 하나의 사이트만 작업할 것이 아니기에 여기다 두면 문제가 발생한다.

knife는 .chef 파일을 현재 디렉토리에서 상위로 올라가면서 검색하기 때문에 간단히 chef_repo/.chef에 클라이언트 설정들을 보관하면 된다.

scripts


SeeAlso ChefSpec RSpec vagrant Brekshelf


CategoryChef

Chef (last edited 2014-01-08 03:35:18 by whitekid)