OPScode측의 설치 과정 간소화와 업데이트로 하기 내용이 틀린것은 아니지만, 비효율적이라 판단되어 폐기 합니다. 참고만 하고 권장하지는 않음....

신규로 작성된 글 참조 하길 바람.  
http://call518.tistory.com/122


Chef Server/Client 구조를 설치하고 히스토리 남긴다... 3초머리를 가진탓에 어디든 메모를 해둬야 찝찝하지 않다.
최근 Chef Server/Client를  설치 하는 도중 opscode의 설치 가이드 문서가 확~바꼈다...
설치 초기에는 RPM기반으로 설치를 지원했었는데, 가이드 문서를 참조해서 설치를 조금씩 진행중이었는데, 중간에, 애네들이 RPM이나 Repo를 관리하기 귀찮았는지, 아래와 같은 공지와 함께, rubygem으로만 설치를 지원하고, RPM위주의 기존 방식은 폐기한다고 하는것 같다. 뭐 어떻게든 이용하는데는 문제 없겠으나, 좀 아쉽다.
바뀐 문서의 개략적인 절차는 Chef-Solo를 먼저 설치해서, 이 Chef-Solo와 Bootstrap를 이용해 다시, Server나 Client를 설치 하는것 같다.

http://wiki.opscode.com/display/chef/Installation+on+RHEL+and+CentOS+5+with+RPMs

RPM Package Support Deprecated

RPM installation via ELFF has been deprecated, as the RPM based approach has proved difficult to maintain with the fast moving nature of the rubygems ecosystem. Please refer to Install Chef Server From Rubygems, or Install Chef Client with Rubygems for an Opscode supported approach.

 



본 설치문서는, 갱신된 아래 문서를 참조로 작성되었으니, 본 자료가 불충분하다면, 원본 가이드 문서를 참조 하길....


가이드 문서가 지원하는 플랫폼

Chef-Server

  • Ubuntu 8.10 through 10.04
  • Debian 5.0 (stable, testing, unstable)
  • CentOS 5.x (should work on RHEL 5.x, too)



Chef-Client
(문서는 공식적으로 CentOS 5.3을 기준으로 작성되었다. 진행해보면 약간의 버전차로 에러가 다소 발생한다.)

  • Ubuntu 8.04+
  • Debian 5.0+
  • CentOS 5.3+
  • Red Hat 5.3+
  • Fedora 10+
  • OpenBSD 4.6+
  • FreeBSD 7.1+
  • Gentoo 1.12.11.1+



* 설치 작업은 root권한으로 진행
* 대부분의 Source 저장이나 작업 위치는 /usr/local/src에서 진행
* IP

- Sercer : 192.168.100.102
- Client : 192.168.100.101 , hostname : foo.bar (/etc/hosts 에 eth0 아이피와 함께 반드시 등록)




[Chef-Server]

Server IP : 192.168.100.102

설치전 조건으로 hostname은 반드시 FQDN이어야 한다. 각자가 알아서 이부분은 처리한다. /etc/hosts파일을 이용해서 속임수를 쓰던지 어쩌던지....아무튼 아래와 같이 hostname -f 결과값이 에러 없이 처리 되면 된다.

# hostname -f

localhost.localdomain


 
초반부에 RPM지원은 안하는것으로 바꼈다고 했는데, 그래도 EPEL이나,  ELFF같은 기존의 Repo는 여전히 필요하다...(ㅡㅡ??) 설치 해주자. (ELFF은 Ruby 1.8.6 설치를 위해 필요)

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
# rpm -Uvh http://download.elff.bravenet.com/5/i386/elff-release-5-3.noarch.rpm


Ruby와 부가적으로 필요한 개발도구를 설치

# yum -y install ruby ruby-shadow ruby-ri ruby-rdoc gcc gcc-c++ ruby-devel ruby-static git



RubyGems 설치 (from Source)

# cd /usr/local/src

# wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz

# tar zxf rubygems-1.3.7.tgz

# cd rubygems-1.3.7

# ruby setup.rb --no-format-executable

RubyGems 1.3.7 installed


=== 1.3.7 / 2010-05-13


NOTE:


http://rubygems.org is now the default source for downloading gems.


You may have sources set via ~/.gemrc, so you should replace

http://gems.rubyforge.org with http://rubygems.org


http://gems.rubyforge.org will continue to work for the forseeable future.


New features:


* `gem` commands

  * `gem install` and `gem fetch` now report alternate platforms when a

    matching one couldn't be found.

  * `gem contents` --prefix is now the default as specified in --help.  Bug

    #27211 by Mamoru Tasaka.

  * `gem fetch` can fetch of old versions again.  Bug #27960 by Eric Hankins.

  * `gem query` and friends output now lists platforms.  Bug #27856 by Greg

    Hazel.

  * `gem server` now allows specification of multiple gem dirs for

    documentation.  Bug #27573 by Yuki Sonoda.

  * `gem unpack` can unpack gems again.  Bug #27872 by Timothy Jones.

  * `gem unpack` now unpacks remote gems.

  * --user-install is no longer the default.  If you really liked it, see

    Gem::ConfigFile to learn how to set it by default.  (This change was made

    in 1.3.6)

* RubyGems now has platform support for IronRuby.  Patch #27951 by Will Green.


Bug fixes:


* Require rubygems/custom_require if --disable-gem was set.  Bug #27700 by

  Roger Pack.

* RubyGems now protects against exceptions being raised by plugins.

* rubygems/builder now requires user_interaction.  Ruby Bug #1040 by Phillip

  Toland.

* Gem::Dependency support #version_requirements= with a warning.  Fix for old

  Rails versions.  Bug #27868 by Wei Jen Lu.

* Gem::PackageTask depends on the package dir like the other rake package

  tasks so dependencies can be hooked up correctly.



------------------------------------------------------------------------------


RubyGems installed the following executables:

/usr/bin/gem

rubygems는 눈깜짝하게 설치가 끝난다. 재대로 설치 되었으면 /usr/bin/gem 이 있어야 한다.


설치된 gem을 이용해, chef를 설치 한다.

# gem install chef

Building native extensions.  This could take a while...

Building native extensions.  This could take a while...

Successfully installed mixlib-config-1.1.2

Successfully installed mixlib-cli-1.2.0

Successfully installed mixlib-log-1.3.0

Successfully installed mixlib-authentication-1.1.4

Successfully installed yajl-ruby-0.8.2

Successfully installed systemu-2.2.0

Successfully installed ohai-0.6.2

Successfully installed mime-types-1.16

Successfully installed rest-client-1.6.1

Successfully installed bunny-0.6.0

Successfully installed json-1.4.6

Successfully installed erubis-2.7.0

Successfully installed extlib-0.9.15

Successfully installed moneta-0.6.0

Successfully installed highline-1.6.1

Successfully installed uuidtools-2.1.2

Successfully installed chef-0.9.16

17 gems installed

Installing ri documentation for mixlib-config-1.1.2...

Installing ri documentation for mixlib-cli-1.2.0...

Unrecognized directive 'short' in README.rdoc

Unrecognized directive 'long' in README.rdoc

Unrecognized directive 'description' in README.rdoc

Unrecognized directive 'default' in README.rdoc

Unrecognized directive 'required' in README.rdoc

Unrecognized directive 'on' in README.rdoc

Unrecognized directive 'boolean' in README.rdoc

Unrecognized directive 'show_options' in README.rdoc

Unrecognized directive 'exit' in README.rdoc

Unrecognized directive 'proc' in README.rdoc

Installing ri documentation for mixlib-log-1.3.0...

Installing ri documentation for mixlib-authentication-1.1.4...

Installing ri documentation for yajl-ruby-0.8.2...

Installing ri documentation for systemu-2.2.0...

Installing ri documentation for ohai-0.6.2...

Installing ri documentation for mime-types-1.16...

Installing ri documentation for rest-client-1.6.1...

Installing ri documentation for bunny-0.6.0...

Installing ri documentation for json-1.4.6...

Installing ri documentation for erubis-2.7.0...

Installing ri documentation for extlib-0.9.15...

Installing ri documentation for moneta-0.6.0...

Installing ri documentation for highline-1.6.1...

Installing ri documentation for uuidtools-2.1.2...

Installing ri documentation for chef-0.9.16...

Installing RDoc documentation for mixlib-config-1.1.2...

Installing RDoc documentation for mixlib-cli-1.2.0...

Unrecognized directive 'short' in README.rdoc

Unrecognized directive 'long' in README.rdoc

Unrecognized directive 'description' in README.rdoc

Unrecognized directive 'default' in README.rdoc

Unrecognized directive 'required' in README.rdoc

Unrecognized directive 'on' in README.rdoc

Unrecognized directive 'boolean' in README.rdoc

Unrecognized directive 'show_options' in README.rdoc

Unrecognized directive 'exit' in README.rdoc

Unrecognized directive 'proc' in README.rdoc

Installing RDoc documentation for mixlib-log-1.3.0...

Installing RDoc documentation for mixlib-authentication-1.1.4...

Installing RDoc documentation for yajl-ruby-0.8.2...

Installing RDoc documentation for systemu-2.2.0...

Installing RDoc documentation for ohai-0.6.2...

Installing RDoc documentation for mime-types-1.16...

Installing RDoc documentation for rest-client-1.6.1...

Installing RDoc documentation for bunny-0.6.0...

Installing RDoc documentation for json-1.4.6...

Installing RDoc documentation for erubis-2.7.0...

Installing RDoc documentation for extlib-0.9.15...

Installing RDoc documentation for moneta-0.6.0...

Installing RDoc documentation for highline-1.6.1...

Installing RDoc documentation for uuidtools-2.1.2...

Installing RDoc documentation for chef-0.9.16... 


설치 내역 확인

# gem list


*** LOCAL GEMS ***


bunny (0.6.0)

chef (0.9.16)

erubis (2.7.0)

extlib (0.9.15)

highline (1.6.1)

json (1.4.6)

mime-types (1.16)

mixlib-authentication (1.1.4)

mixlib-cli (1.2.0)

mixlib-config (1.1.2)

mixlib-log (1.3.0)

moneta (0.6.0)

ohai (0.6.2)

rest-client (1.6.1)

systemu (2.2.0)

uuidtools (2.1.2)

yajl-ruby (0.8.2) 


Ohai 설치

# gem install ohai

Successfully installed ohai-0.6.2

1 gem installed

Installing ri documentation for ohai-0.6.2...

Installing RDoc documentation for ohai-0.6.2... 

 
Ohai 테스트
(시스템 관련 정보 제공. 시간 많으신 분은 어떤 정보들이 있는지 확인해두는 것도 나중에 도움이 많이 된다.)

# ohai
(중략)
.
.
.

    "perl": {

      "archname": "x86_64-linux-thread-multi",

      "version": "5.8.8"

    },

    "ruby": {

      "gems_dir": "/usr/lib64/ruby/gems/1.8",

      "target_os": "linux",

      "platform": "x86_64-linux",

      "host_vendor": "redhat",

      "bin_dir": "/usr/bin",

      "target_vendor": "redhat",

      "target_cpu": "x86_64",

      "host_os": "linux-gnu",

      "version": "1.8.6",

      "host_cpu": "x86_64",

      "ruby_bin": "/usr/bin/ruby",

      "host": "x86_64-redhat-linux-gnu",

      "target": "x86_64-redhat-linux-gnu",

      "release_date": "2010-02-05"

    }

  } 

 
의존성 있는 gem 패키지 추가 설치
(가이드 문서에는 없음....)

# gem install abstract ParseTree rspec ruby2ruby ruby_parser RubyInline sexp_processor term-ansicolor thor ZenTest



Chef-Server 설치를 워힌 Chef-Solo 설정 (Chef-Solo's Default Configuration File Path : /etc/chef/solo.rg)

# mkdir -p /etc/chef
# vi /etc/chef/solo.rb

file_cache_path "/root/chef-solo"

cookbook_path "/root/chef-solo/cookbooks"


 
Chef-Solo 속성(JSON Attribute) 설정 (init 스타일 포함)
- File Path : /root/chef.json
- 가이드 문서상으로는 Chef-Server파트에서 WebUI 사용유무에 따라 2가지를 제시 하는데, 여기서는 WebUI가 지원되는 설정을 사용했음.
- (현재 webui가 작동하질 않는다. 역시,,, 한방에 거저먹는건 없다.... 이건 좀더 파악해봐야 겠다. 허나 webui는 편의 도구일뿐이고, Chef Server/Client를 사용한데는 문제가 없다.)

# vi /root/chef.json

{

  "chef": {

    "server_url": "http://localhost:4000",

    "webui_enabled": true,

    "init_style": "init"

  },

  "run_list": [ "recipe[chef::bootstrap_server]" ]

}

- init 스타일 정의

RHEL, CentOS, and related distros don't have a runit package. Use the "init" init style for these systems

가이드 문서 내용대로, "init"을 이용하면 되겠다.


Chef-Solo와 Bootstrap을 이용해, Chef-Server를 설치/설정

# chef-solo -c /etc/chef/solo.rb -j ~/chef.json -r http://s3.amazonaws.com/chef-solo/bootstrap-latest.tar.gz

설치에 시간이 다소 소요된다. 에러 없이 끝나기만 바랄뿐~~
(이부분에서 꽤나 삽질했다. 아직 원인은 못찾았는데, 한방에 성공하지 못하면 계속 실패한다;; 어딘가 찌꺼기가 남아 있는듯 한데....)


Chef-Server 설치가 성공적으로 끝났다면, 아래와 같은 것들로 구성된다.

  • Bootstrap the system as a Client (see section below for what this entails).
  • Install RabbitMQ if possible (see below).
  • Install CouchDB if possible (see below).
  • Install development libraries zlib and xml, for chef-solr.
  • Install the chef-serverchef-server-apichef-solr gems.
  • Optionally (if webui_enabled) install chef-server-webui gem.
  • Create the server configuration file, /etc/chef/server.rb.
  • Create some directories the server needs.
  • If init_style is "runit", set up chef-solr-indexerchef-solrchef-server (API) as runit services. If webui_enabled, it chef-server-webui will be added as a runit service as well. If "init", copy the init scripts for these services from the installed Chef gem for the current platform (Debian and Red Hat families supported). If "bsd", display a hint about startup commands. Otherwise, display a message about manual setup.



또, Chef-Server가 정상적으로 작동된다면, 아래와 같은 서비스 포트들이 운영되고 있을 것이다. 한번씩 확인 필수.
ServicePort
chef-server (api) 4000
chef-server-webui 4040
couchdb 5984
rabbitmq 5672,4369,47762
chef-solr 8983


Chef-Client 설정 (Cookbook을 제작하거나, node등의 관리 기능을 하는 관리용 Client라 생각하면 될듯..)
- File Path : /root/.chef

# mkdir -p /root/.chef
# cp /etc/chef/validation.pem /etc/chef/webui.pem ~/.chef
# chown -R $USER ~/.chef 



이제 knife라는 도구를 이용할 순서다. knife...ㅡㅡ;;; 한마디로, 요리를 준비하는데 필수 도구인 "칼"로 생각하면 될듯한다. cookbook이나 recipe들로 맛있는 요리를 하기 위해, 여러가지 사전작업이나 준비를 하는데 필요한 도구....


knife를 이용해, Chef-Server를 설정한다.
- Permission 맞추는 부분도 가이드 문서에는 없다. 이것때문에 한참을 해맸다...;;;
아래 과정을 거치면, Chef의 Cookbook이나 Node관리를 할 수 있는 root라는 이름의 Chef Client(Account)가 생성되고, Client Key가 /root/.chef/root.pem이라는 파일로 생성되어 있어야 한다.

# chmod 777 /etc/chef/certificates
# chown chef.chef /etc/chef/certificates/key.pem
# knife configure -i
Where should I put the config file? [~/.chef/knife.rb] 

Please enter the chef server URL: [http://localhost:4000] 

Please enter a clientname for the new client: [root] 

Please enter the existing admin clientname: [chef-webui] 

Please enter the location of the existing admin client's private key: [/etc/chef/webui.pem] /root/.chef/webui.pem

Please enter the validation clientname: [chef-validator] 

Please enter the location of the validation key: [/etc/chef/validation.pem] /root/.chef/validation.pem

Please enter the path to a chef repository (or leave blank):

WARN: Creating initial API user...

INFO: Created (or updated) client[root]

WARN: Configuration file written to /root/.chef/knife.rb



chef-repo 다운로드 및 Server 설정파일(/root/.chef/knife.rb) 확인
(cookbook 경로 정보도 추가함)

# git clone http://github.com/opscode/chef-repo.git /var/chef

(Chef-Server가 chef유저로 실행되므로, git로 다운로드한 repo 디렉토리 소유권을 chef로 변경한다.)
# chown chef:chef /var/chef

# echo "cookbook_path ['/var/chef/cookbooks']" >> /root/.chef/knife.rb
# cat /root/.chef/knife.rb 

log_level                :info

log_location             STDOUT

node_name                'root'

client_key               '/root/.chef/root.pem'

validation_client_name   'chef-validator'

validation_key           '/root/.chef/validation.pem'

chef_server_url          'http://localhost:4000'

cache_type               'BasicFile'

cache_options( :path => '/root/.chef/checksums' )
cookbook_path ['/var/chef/cookbooks']
 


knife를 이용한 작업이 정상인지 테스트 (이부분이 잘된다면 인증부분은 정상적으로 진행된 것임)
- 가이드 문서에 역시 없는 내용인데,.. 아마도 OS버전이 상이해서 그런지.. gem list 중에서 rest-client버전을 Downgrade해주어야 했다. 아래와 같이 진행....(필요한 버전은 1.3.1이며, 제거해야할 버전은 각자 알아서 확인..)

# gem install rest-client -v=1.3.1
# gem uninstall rest-client -v=1.6.1


[knife 테스트]

# knife client list

[

  "chef-validator",

  "chef-webui",

  "root"

]


# knife client show root

/usr/lib64/ruby/gems/1.8/gems/rest-client-1.6.1/lib/restclient/abstract_response.rb:50: warning: parenthesize argument(s) for future version

{

  "name": "root",

  "chef_type": "client",

  "json_class": "Chef::ApiClient",

  "public_key": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEA0Zu+th1IncW19rYvpbnYOxaE/YSvzbwoo4MDYSEMSbYtsXCldDQe\nw9PWqdrBFfo9ArhMqyLXvSgxsGbhQ3cZNUEnBNYJsTYwR7ZHAe1dYoyAxOCGFB8g\nLRT2JaCe7Sc0SqEouJ5pxjTvConYiEi2FxQDwQ1KwGz3tMDr7SbU4MyPf2RiRgEj\nrEAuejLMIXQbcg+o7mG6HBw89mCg45hADx4CvlEfjbVeePMIsFuRQgo9a+jl5atm\nUzsl0QahakOaOf/usRruZvmAlBJ8sAEo/xfbp3IiHKvY1x8AfdhOwVqvVhxcziXy\n6LHl+CVjGTJDeeq1upqa2X5RTC5nqWYJtwIDAQAB\n-----END RSA PUBLIC KEY-----\n",

  "_rev": "1-bc3e4e80d14fd973d4d9ecd7e68b851f",

  "admin": true

}


# knife node list

[


Client 목록에 이전 단계에서 만든 root라는 사용자가 있고 속성에 admin이 있으므로 관리자이다. 그리고 현재 Chef-Client로 등록된 Node가 없기 때문에, Node List에는 아무것도 없다.


이제, Client Node용 일반 Account(Client)를 만들고, Client용 Key-Set도 만들어 보자.

# mkdir /root/chef-key-set
# cp /etc/chef/validation.pem /root/chef-key-set/
# knife client create chef-users -n -f /root/chef-key-set/chef-users.pem

/usr/lib64/ruby/gems/1.8/gems/rest-client-1.6.1/lib/restclient/abstract_response.rb:50: warning: parenthesize argument(s) for future version

WARN: HTTP Request Returned 409 Conflict: Client already exists

INFO: Created (or updated) client[chef-users]

INFO: Created (or updated) client[chef-users

# knife client show chef-users

/usr/lib64/ruby/gems/1.8/gems/rest-client-1.6.1/lib/restclient/abstract_response.rb:50: warning: parenthesize argument(s) for future version

{

  "name": "chef-users",

  "chef_type": "client",

  "json_class": "Chef::ApiClient",

  "public_key": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAoYHIoMUEbTEC/rfqulS/8WYsN5hc1u2zua0Dr909k+Thmh+kouFz\ngkzUab5yYYHv7Cm0Yhm1Q2ELfipADuTqUeNOfD9QCUZjfLjRocI1s4uUu4khWyNl\n+C5eRQqwNQ3fiKLNYh+bHhZoLBr4kUOm3lsApjS64ADrNltjt3uFYE8/37qAr5k6\nMHseQuTSgEnrWLAFJj2GPBKrmO7rlIh7fiLKWHCJvhBryNpbxxXRijn9AZV1klXV\ncLgvXM0ayyu5+sQ2cq2utmD3lSR9m+dt0LDs1Bhw8yNeM0SZCro6e5VULlu6rTeN\nnRKorrACXyErd6Kbns4AT6zDZIa26Xm49QIDAQAB\n-----END RSA PUBLIC KEY-----\n",

  "_rev": "2-de3808f869ce0fbb137773563f3062a0",

  "admin": false




[Chef-Client]

Client IP : 192.168.100.101
hostname : foo.bar (/etc/hosts 에 eth0 아이피와 함께 반드시 등록) 

이제 Chef-Client를 설치할 단계다. Client장비로 가서 아래 과정을 따르자. Chef-Server설치 과정에서 진행했던 부분이 대부분이고 훨씬 간단하므로, 심플하게 작성한다.

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
# rpm -Uvh http://download.elff.bravenet.com/5/i386/elff-release-5-3.noarch.rpm
# yum -y install ruby ruby-shadow ruby-ri ruby-rdoc gcc gcc-c++ ruby-devel ruby-static git

# cd /usr/local/src

# wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz

# tar zxf rubygems-1.3.7.tgz

# cd rubygems-1.3.7

# ruby setup.rb --no-format-executable
# gem install chef
# gem install ohai
# gem install rest-client -v=1.3.1
# gem uninstall rest-client -v=1.6.1 


Servre때와 마찬가지로 Chef-Solo를 이용해 Boostrap방식으로 Client가 설치 된다. 다만 Bootstracp가 Client역할이라는 점 이외에는....

# vi /root/chef.json

{

  "chef": {

    "server_url": "http://192.168.100.102:4000",

    "init_style": "init"

  },

  "run_list": [ "recipe[chef::bootstrap_client]" ]

}


# chef-solo -c /etc/chef/solo.rb -j ~/chef.json -r http://s3.amazonaws.com/chef-solo/bootstrap-latest.tar.gz

[Mon, 25 Apr 2011 04:01:24 +0900] WARN: *****************************************

[Mon, 25 Apr 2011 04:01:24 +0900] WARN: Can not find config file: /etc/chef/solo.rb, using defaults.

[Mon, 25 Apr 2011 04:01:24 +0900] WARN: No such file or directory - /etc/chef/solo.rb

[Mon, 25 Apr 2011 04:01:24 +0900] WARN: *****************************************

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting the run_list to ["recipe[chef::bootstrap_client]"] from JSON

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Starting Chef Run (Version 0.9.16)

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Creating directory[/var/log/chef] at /var/log/chef

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting owner to 0 for directory[/var/log/chef]

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting group to 0 for directory[/var/log/chef]

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting mode to 755 for directory[/var/log/chef]

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Creating directory[/srv/chef] at /srv/chef

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting owner to 0 for directory[/srv/chef]

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting group to 0 for directory[/srv/chef]

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting mode to 755 for directory[/srv/chef]

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Writing updated content for template[/etc/chef/client.rb] to /etc/chef/client.rb

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Creating directory[/srv/chef/run] at /srv/chef/run

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting owner to 0 for directory[/srv/chef/run]

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting group to 0 for directory[/srv/chef/run]

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting mode to 755 for directory[/srv/chef/run]

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Creating file[/etc/init.d/chef-client] at /etc/init.d/chef-client

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting mode to 755 for file[/etc/init.d/chef-client]

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Creating file[/etc/sysconfig/chef-client] at /etc/sysconfig/chef-client

[Mon, 25 Apr 2011 04:01:26 +0900] INFO: Setting mode to 644 for file[/etc/sysconfig/chef-client]

[Mon, 25 Apr 2011 04:01:27 +0900] INFO: service[chef-client]: enabled successfully

[Mon, 25 Apr 2011 04:01:27 +0900] INFO: Chef Run complete in 0.696633 seconds

[Mon, 25 Apr 2011 04:01:27 +0900] INFO: cleaning the checksum cache

[Mon, 25 Apr 2011 04:01:27 +0900] INFO: Running report handlers

[Mon, 25 Apr 2011 04:01:27 +0900] INFO: Report handlers complete



Chef-Server 설치 과정 마지막에 생성한 chef-users.pem 키를 Server로부터 복사해온다.

# mkdir /root/.chef
# mkdir /etc/chef
# scp root@192.168.100.102:/root/chef-key-set/chef-users.pem /root/.chef/
# scp root@192.168.100.102:/root/chef-key-set/validation.pem /root/.chef/


knife툴을 이용해 Chef-Clinet 설정

# knife configure

/usr/lib/ruby/gems/1.8/gems/rest-client-1.6.1/lib/restclient/abstract_response.rb:50: warning: parenthesize argument(s) for future version

No knife configuration file found

Where should I put the config file? [~/.chef/knife.rb] 

Please enter the chef server URL: [http://localhost:4000] http://192.168.100.102:4000

Please enter an existing username or clientname for the API: [root] chef-users 

Please enter the validation clientname: [chef-validator] 

Please enter the location of the validation key: [/etc/chef/validation.pem] /root/.chef/validation.pem

Please enter the path to a chef repository (or leave blank): 

WARN: *****

WARN: 

WARN: You must place your client key in:

WARN:   /root/.chef/chef-users.pem

WARN: Before running commands with Knife!

WARN: 

WARN: *****

WARN: 

WARN: You must place your validation key in:

WARN:   /root/.chef/validation.pem

WARN: Before generating instance data with Knife!

WARN: 

WARN: *****

WARN: Configuration file written to /root/.chef/knife.rb

# ll /root/.chef/chef-users.pem /root/.chef/validation.pem /root/.chef/knife.rb

-rw-r--r-- 1 root root 1675 Apr 25 02:35 /root/.chef/chef-users.pem

-rw-r--r-- 1 root root  393 Apr 25 04:20 /root/.chef/knife.rb

-rw------- 1 root root 1675 Apr 25 02:26 /root/.chef/validation.pem

안내문대로, /root/.chef/knife.rb, /root/.chef/chef-users.pem, /etc/chef/validation.pem 3개 파일이 준비되어야 한다. (앞 단계에서 scp로 복사해왔으니, 확인해둘 것)

/root/.chef/knife.rb 파일 내용

log_level                :info

log_location             STDOUT

node_name                'chef-users'

client_key               '/root/.chef/chef-users.pem'

validation_client_name   'chef-validator'

validation_key           '/root/.chef/validation.pem'

chef_server_url          'http://192.168.100.102:4000'

cache_type               'BasicFile'

cache_options( :path => '/root/.chef/checksums' )



이제까지 에러 없이 진행되었다면 아래와 같이, Server로의 접속 및 정보를 볼수 있을 것이다. 물론 Client의 Key는 일반유저 권한이므로, 제한적인 접근만 가능하다.

# knife node list

[


]

# knife client list

WARN: HTTP Request Returned 403 Forbidden: You are not allowed to take this action.

/usr/lib/ruby/1.8/net/http.rb:2097:in `error!': 403 "Forbidden" (Net::HTTPServerException)

from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/lib/chef/rest.rb:234:in `api_request'

from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/lib/chef/rest.rb:285:in `retriable_rest_request'

from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/lib/chef/rest.rb:215:in `api_request'

from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/lib/chef/rest.rb:111:in `get_rest'

from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/lib/chef/api_client.rb:185:in `list'

from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/lib/chef/knife/client_list.rb:35:in `run'

from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/lib/chef/knife.rb:131:in `run'

from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/lib/chef/application/knife.rb:120:in `run'

from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/bin/knife:25

from /usr/bin/knife:19:in `load'

from /usr/bin/knife:19

==> 관리자 권한이 없기에 다른 Account(Client) 목록은 볼수 없다.

# knife client show chef-users

{

  "name": "chef-users",

  "chef_type": "client",

  "json_class": "Chef::ApiClient",

  "public_key": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAtsoFCyYl9lMDLQ/V8O2Nw1lTbj4zNutsBT1l1w3Uf78XOg9m5KIm\nCiI+o/9FK+p7R8DY1GGIuRbfYt0fcSE9szBgmamauZxmY3zOJ5Z7WyzWdO8vrxyx\ny8AM+vIhA4LbIdDc6fi4u+fUwS4uPpc16y8jJXdT2VO6zEirFwYv5X90MY4njd/6\nCcSVh0rLI//67EiaEyiXBqjSkuAenlepz2zERgGLVRI9ZWpbfxmtWmoOrDfrazCt\npIasSLH2sZTOubqB31T/ryo982jy7t/GucvZOF4jao+quNVxH+s+KLOHjnjqjx1f\nwF1aSyYXg2Tw9tzVI9eNqCRq7+r8VZjRNQIDAQAB\n-----END RSA PUBLIC KEY-----\n",

  "_rev": "1-5d839e9a44f00e5f0ecf2b6e71fdc34b",

  "admin": false

}

==> 자기 정보는 볼수 있다. 




[Chef Server/Clinet TEST]

이제, Chef Server/Client 구조의 설치는 끝났다. 제대로 작동하는지 아주 심플한 예제로 테스트 해보자.

시나리오 : Cookbook중 테스트용 Recipe인 quick_start를 Server에 업로드 하고, Client에서 자동 적용.



[On Server]
opscode 사이트로부터 이미 제공되고 있는 Cookbook리스트를 한번 확인해보고 본 테스트에서 사용될 quick_start 레시피를 앞서 구축한 Server에 등록한다. 원래는 Chef Server관리용 서버가 따로 있다는 가정하에서 관리서버에서 cookbook을 다운로드 또는 직접 제작해서 Server로 올리게 되는데 본 문서에서는 관리서버(root Account)와 Chef-Server가 동일 장비로 구축된 것이다. 조금 혼란스러울지도 모른다. 이부분은 계속 접하다보면 감이 온다.)
(cookbook을 관리할 것이기때문에, Server에서 작업은 "root" client로 작업이 진행된다. 확인 해보고 싶으면, Server장비에 설치된 /root/.chef/knife.rb 파일내용의 user가 무엇인지 확인해보라)


Server에 등록된 cookbook확인. 지금은 아무 것도 없다...

# knife cookbook list

[


]


opscode 사이트에 등록된 cookbook 목록확인. 누구나 사용 및 수정 가능하다.

# knife cookbook site list

[

  "1password",

  "accounts",

  "ack-grep",

  "activemq",

  "ad",

  "ad-likewise",

  "ant",

  "apache2",

  "apcupsd",

  "apparmor",

  "application",

  "apt",

  "asterisk",

  "atftp",

  "aws",

  "awsclient",

  "backup-manager",

  "bazaar",

  "bluepill",

  "boost",

  "bootstrap",

  "build-essential",

  "bundler",

  "bundler_enterprise",

  "cakephp",

  "capistrano",

  "chef",

  "chef-client",

  "chromium",

  "cloudkick",

  "cobbler",

  "collectd",

  "collectd_plugins",

  "confluence",

  "couchdb",

  "cpan",

  "cron",

  "crontab",

  "crowd",

  "daemontools",

  "database",

  "denyhosts",

  "development_app",

  "diaspora",

  "django",

  "djbdns",

  "dmg",

  "dnsimple",

  "dotdeb",

  "downtime",

  "drbd",

  "dropbox",

  "drupal",

  "drush",

  "dynect",

  "dynomite",

  "eaccelerator",

  "ec2",

  "elasticsearch",

  "emacs",

  "emacs-starter-kit",

  "erlang",

  "fail2ban",

  "ganglia",

  "gearman",

  "gems",

  "getting-started",

  "git",

  "glassfish",

  "gnu_parallel",

  "god",

  "graphite",

  "graylog2",

  "gunicorn",

  "hadoop",

  "hadoop_cluster",

  "hadoop_for_hbase",

  "haproxy",

  "hbase",

  "heartbeat",

  "homebrew",

  "htop",

  "hudson",

  "id3lib",

  "iftop",

  "imagemagick",

  "instiki",

  "iptables",

  "ircd-ratbox",

  "iterm2",

  "java",

  "java_sun",

  "jetty",

  "jira",

  "jpackage",

  "keepalived",

  "kickstart",

  "latex",

  "leiningen",

  "libvirt",

  "loggly",

  "logrotate",

  "logwatch",

  "lvm",

  "magento",

  "man",

  "maradns",

  "maven",

  "memcached",

  "mercurial",

  "mongodb",

  "monit",

  "motd-tail",

  "mpd",

  "munin",

  "mysql",

  "mythtv",

  "nagios",

  "netatalk",

  "networking_basic",

  "nginx",

  "nodejs",

  "nscd",

  "ntp",

  "oh-my-zsh",

  "ohai",

  "openldap",

  "opennebula",

  "openssh",

  "openssl",

  "openvpn",

  "ossec",

  "packages",

  "pacman",

  "passenger",

  "passenger_apache2",

  "passenger_enterprise",

  "pdns",

  "pen",

  "percona",

  "perl",

  "php",

  "php-fpm",

  "postfix",

  "postgresql",

  "powerdns",

  "proftpd",

  "pxe_dust",

  "python",

  "quick_start",

  "rabbitmq",

  "rabbitmq_chef",

  "radiant",

  "rails",

  "rails_enterprise",

  "redis",

  "redis-package",

  "redis2",

  "redmine",

  "reprepro",

  "resolver",

  "riak",

  "rsync",

  "rsyslog",

  "ruby",

  "ruby_enterprise",

  "rubygems",

  "runit",

  "rush",

  "rvm",

  "s3cmd",

  "s3fs",

  "samba",

  "sbuild",

  "screen",

  "server_inventory",

  "shorewall",

  "skype5",

  "snmp",

  "snort",

  "solr",

  "sphinx",

  "sqlite",

  "ssh_known_hosts",

  "ssmtp",

  "stompserver",

  "stunnel",

  "subversion",

  "sudo",

  "sysctl",

  "teamspeak",

  "teamspeak3",

  "thrift",

  "timezone",

  "tmpreaper",

  "tmux",

  "tomcat",

  "tomcat6",

  "tomcat6apr",

  "trac",

  "transmission",

  "tunnelblick",

  "ubuntu",

  "ucspi-tcp",

  "unbound",

  "unicorn",

  "users",

  "varnish",

  "vim",

  "virtualbox",

  "vsftpd",

  "wordpress",

  "xen",

  "xfs",

  "xml",

  "xslt",

  "yum",

  "yumrepo",

  "zenoss",

  "zlib",

  "zookeeper",

  "zsh"



==> 중간즈음, 설치 하려는 quick_start가 있다. 이것을 다운로드 해서 다시 Chef-Server Cookbook에 등록할 것이다.



opscode 사이트로부터 quick_start cookbook 다운로드

# knife cookbook site vendor quick_start

INFO: Downloading quick_start from the cookbooks site at version 0.7.0

INFO: Cookbook saved: /root/chef-repo/cookbooks/quick_start.tar.gz

INFO: Checking out the master branch.

INFO: Checking the status of the vendor branch.

INFO: Creating vendor branch.

INFO: Removing pre-existing version.

INFO: Uncompressing quick_start version 0.7.0.

INFO: Adding changes.

INFO: Committing changes.

INFO: Creating tag chef-vendor-quick_start-0.7.0.

INFO: Checking out the master branch.

INFO: Merging changes from quick_start version 0.7.0.

Updating 9769e69..4492ea0

Fast-forward

 cookbooks/quick_start/attributes/quick_start.rb    |    1 +

 cookbooks/quick_start/metadata.json                |   74 ++++++++++++++++++++

 cookbooks/quick_start/metadata.rb                  |   19 +++++

 cookbooks/quick_start/recipes/default.rb           |   24 ++++++

 .../templates/default/deep_thought.txt.erb         |    1 +

 5 files changed, 119 insertions(+), 0 deletions(-)

 create mode 100644 cookbooks/quick_start/attributes/quick_start.rb

 create mode 100644 cookbooks/quick_start/metadata.json

 create mode 100644 cookbooks/quick_start/metadata.rb

 create mode 100644 cookbooks/quick_start/recipes/default.rb

 create mode 100644 cookbooks/quick_start/templates/default/deep_thought.txt.erb

INFO: Cookbook quick_start version 0.7.0 successfully vendored!



다운로드 cookbook 확인

# ll /var/chef/cookbooks/

total 16

drwxr-xr-x 3 root root  4096 Apr 25 03:33 .

drwxr-xr-x 9 root root  4096 Apr 25 03:29 ..

drwxr-xr-x 5  502 games 4096 Oct 29  2009 quick_start

-rw-r--r-- 1 root root  2930 Apr 25 03:29 README.md
 

# ll /var/chef/cookbooks/quick_start/

total 28

drwxr-xr-x 5  502 games 4096 Oct 29  2009 .

drwxr-xr-x 3 root root  4096 Apr 25 03:33 ..

drwxr-xr-x 2  502 games 4096 Apr 25 03:32 attributes

-rw-r--r-- 1  502 games 1024 Oct 29  2009 metadata.json

-rw-r--r-- 1  502 games  481 Oct 29  2009 metadata.rb

drwxr-xr-x 2  502 games 4096 Apr 25 03:32 recipes

drwxr-xr-x 3  502 games 4096 Oct 29  2009 templates

==> 정상적으로 다운로드되어 있다. Recipe를 수정가능하면 수정하시고, 몰라도 내용들은 한번씩 살펴보자.



# 편집이 끝났다면(할게 없을테니 그냥...) 구축한 Chef-Server에 등록(Upload) 한다.

# knife cookbook upload quick_start

INFO: Saving quick_start

INFO: Validating ruby files

INFO: Validating templates

INFO: Syntax OK

INFO: Generating Metadata

INFO: Uploading files

INFO: Upload complete!

# knife cookbook list

[

  "quick_start"

]

==> 구축한 Chef-Server에 quick_start cookbook이 등록되었다



[On Client]

Client에서는 해줄게 딱 하나다. Server로부터 정보를 전달 받을 Chef-Client 데몬만 뛰워 주면 된다. 이 과정에서 앞서 Client설치 때 위치시켰던 Key들이 사용되어, Chef-Server의 Node 목록에도 등록된다.

방법은 간단하다. 그냥 init 스크립트를 실행해주면 된다.
- 참고로 Chef-Client는 Server에서 정해준 역할이나, 패키지 설정등을 주기적으로 확인하는데, 이 주기(Second)는 init 스크립트(/etc/init.d/chef-client)를 열어보면 등록되어 있다. Default는 1800초(30분)이다. 즉, Server에서 특정 Client의 역할중 http의 mac client 값을 512에서 256으로 수정했다. 그럼 30분 안에 Client에 자동으로 반영된다.
(진행 편의상 임시로 10초 정도로 줄여 주고 테스트가 끝나면 원래대로 복원한다. 아니면 30분을 기다리던지.... 뭐 client로 가서 chef-client 명령을 직접 실행해도 되겠다..... 그러나 그럴거면 chef를 이용하는 의미가....)

client.pem 생성을 위한 validation.pem 파일 위치 정보 수정
==> /etc/chef/client.rb 내용중 아래 부분과 같이 수정한다. (굵게 표시한 부분처럼 정확힌 위치로 수정)

log_level          :info

log_location       STDOUT

ssl_verify_mode    :verify_none

chef_server_url    "http://192.168.100.102:4000"


validation_client_name "chef-validator"

validation_key           "/root/.chef/validation.pem"

client_key               "/etc/chef/client.pem"


file_backup_path   "/srv/chef/backup"

file_cache_path    "/srv/chef/cache"

pid_file           "/srv/chef/run/client.pid"



(Chef Clinet 실행)
# /etc/init.d/chef-client start

Starting chef-client:                                      [  OK  ] 


# cat /etc/init.d/chef-client

#!/bin/bash

# chef-client Startup script for the Chef client

#

# chkconfig: - 98 02

# description: Client component of the Chef systems integration framework.


### BEGIN INIT INFO

# Provides: chef-client

# Required-Start: $local_fs $network $remote_fs

# Required-Stop: $local_fs $network $remote_fs

# Should-Start: $named $time

# Should-Stop: $named $time

# Short-Description: Startup script for the Chef client

# Description: Client component of the Chef systems integration framework.

### END INIT INFO


# Source function library

. /etc/init.d/functions


exec="/usr/bin/chef-client"

prog="chef-client"


[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog


config=${CONFIG-/etc/chef/client.rb}

pidfile=${PIDFILE-/var/run/chef/client.pid}

lockfile=${LOCKFILE-/var/lock/subsys/$prog}

logfile=${LOGFILE-/var/log/chef/client.log}

interval=${INTERVAL-60}

splay=${SPLAY-20}

options=${OPTIONS-}


start() {

    [ -x $exec ] || exit 5

    [ -f $config ] || exit 6

    echo -n $"Starting $prog: "

    daemon chef-client -d -c "$config" -L "$logfile" -i "$interval" -s "$splay" -P "$pidfile" "$options"

    retval=$?

    echo

    [ $retval -eq 0 ] && touch $lockfile

    return $retval

}


stop() {

    echo -n $"Stopping $prog: "

    killproc -p $pidfile chef-client

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

}


restart () {

    stop

    start

}


reload() {

    restart

}


force_reload() {

    restart

}


rh_status() {

    # run checks to determine if the service is running or use generic status

    status -p $pidfile $prog

}


rh_status_q() {

    rh_status >/dev/null 2>&1

}


case "$1" in

    start)

        rh_status_q && exit 0

        $1
         ;;

    stop)

        rh_status_q || exit 0

        $1

        ;;

    restart)

        $1

        ;;

    reload)

        rh_status_q || exit 7

        $1

        ;;

    force-reload)

        force_reload

        ;;

    status)

        rh_status

        ;;

    condrestart|try-restart)

        rh_status_q || exit 0

        restart

        ;;

    *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"

        exit 2

esac

exit $?

 


[On Server]

Server로 돌아와, Client Node가 등록되었는지 확인한다.

# knife node list

[

  "foo.bar",

  "localhost.localdomain"

]

# knife client list

[

  "chef-users",

  "chef-validator",

  "chef-webui",

  "foo.bar",

  "localhost.localdomain",

  "root"

node와 client 모두 정상적으로 등록되었다.

이제 목적인 quick_start를 client에서 작동되도록 해보자.

# knife node show foo.bar
(중략)
.
.
.

  "run_list": [


  ]

}

=> 현재 run_list가 아무것도 없다. (run_list는 각 노드가 수행해야할 역할이다. cookbook이 될수도 있고, cookbook들을 여러개 묶은 role이 될수도 있다.) 


앞서 Server에 등록한 quick_start를 foo.bar 클라이언트의 run_list로 할당해보자.

# knife node run_list add 'foo.bar' 'recipe[quick_start]'

{

  "run_list": [

    "recipe[quick_start]"

  ]

}

==> 아까와는 달리, foo.bar 노드의 run_list에 quick_start 레시피가 추가되었다. 



[On Client]







asfasfdasfff


Posted by 사랑줍는거지
,