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-server, chef-server-api, chef-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-indexer, chef-solr, chef-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가 정상적으로 작동된다면, 아래와 같은 서비스 포트들이 운영되고 있을 것이다. 한번씩 확인 필수.
Service | Port |
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