Chef 명령어!
셰프는(Chef, http://www.opscode.com/chef)는 OPSCODE(http://www.opscode.com)에서 만든 오픈 소스 시스템 관리 프레임워크다. 루비(Ruby)로 작성된 프레임워크를 이용한다.
- Chef
- Knife
- Chef Server 를 Local 에 설치한 경우 해줘야하는 사항
- cookbook의 버전을 확일할때
- role 파일을 upload
- 등록 : 등록된 서버의 ssh 키가 등록되어있을경우에동작함 없을 경우 키를 등록하거나 키를 삽입해서 사용해야함.
- 등록확인
- node 검색
- node 에 레시피 등록
- chef-client 실행 : 원격에서 노드의 클라이언트를 수행
- kitchen
- 쿡북을 생성하고
- .kitchen.yml 수정
- list : 현재 상태를 확인 가능함
- create : VM 이생성되고(kitchen.yml 에서 설정한값으로)
- login : 생성한 VM 에 접속
- converge : Chef의 파일이 적용됨.
- destroy : VM이 삭제됨.
- bash
- remote_file(wget)
- export DEBIAN_FRONTEND=noninteractive
셰프(Chef, http://www.opscode.com/chef)는 OPSCODE(http://www.opscode.com)에서 만든 오픈 소스 시스템 관리 프레임워크다.
셰프는 루비(Ruby)로 작성된 프레임워크를 이용한다. 단점으로는 일부 유닉스/리눅스, Mac OS X 계열만 지원한다는 것이다(윈도우에서도 되기는 하지만 일부 제약이 있는거 같다.)
기타 배경및 및 프레임워크에 대한 자세한 것은 아래내용참고하길
- https://www.ibm.com/developerworks/community/blogs/9e635b49-09e9-4c23-8999-a4d461aeace2/entry/215?lang=en
내가 이해하는 바는 시스템 배포를 자동화하고 손쉽게 관리 할수 있는 것 정도로 이해한다.
간단한 명령어들을 나열해보려고한다.
Chef
Create the cookbook
Cookbook 을 만들수 있다. chef 명령어로 생성할 수 있다.
기본 수정은 default.rb 에서 작성하면된다. Edit default.rb
Upload cookbook
Upload 는 knife 를 이용한다.
Bootstrap your node
identity file 이용
$ knife bootstrap AddressIP -N nodeName--ssh-user root --sudo --identity-file ~/.ssh/my.pem --node-name node1 --run-list 'recipe[cookbookname]'
id/pw 이용
knife bootstrap AddressIP -N nodeName -x userID -P userPassword --sudo
의존cookbook이 있을경우 berks 로
cookbook 함께 upload 가능 cookbook recipe 폴더에서
berks install
berks upload --ssl-verify=false
recipe 추가
chef generate recipe cookbooks/cookbookname recipename
file 추가
chef generate file cookbooks/cookbookname filename
attribute 추가
chef generate attribute cookbooks/cookbookname default
template 추가
chef generate template cookbooks/cookbookname templatename
Knife
Knife 는 Chef 에서 이용할수 있는 툴임.
Chef Server 를 Local 에 설치한 경우 해줘야하는 사항
Chef 서버를 직접 구축해서 운영하면 SSL 인증오류로 정상적으로 접근이 안됨. 설치한 서버에서 인증서를 다운받아 접속해보아야함.
- ssl 파일을 다운받고
knife ssl fetch
- 정상적으로 설치되었는지 확인.
knife ssh check
- 리스트 정상적으로 받아오는지 확인
knife client list
cookbook의 버전을 확일할때
knife cookbook site show cookbookname | grep latest_version
role 파일을 upload
knife role from file test.json
등록 : 등록된 서버의 ssh 키가 등록되어있을경우에동작함 없을 경우 키를 등록하거나 키를 삽입해서 사용해야함.
knife bootstrap <client server ip> -x <user> -N <node name>
등록확인
knife node list
node 검색
knife search node "fqdn:*"
node 에 레시피 등록
knife node run_list add node1 'recipe[hello]'
chef-client 실행 : 원격에서 노드의 클라이언트를 수행
knife ssh "fqdn:*" "sudo chef-client"
kitchen
Chef에서 사용가능한 툴로 Local 에서 테스트 가능하도록 도와줌.
작업은 chef-repo 에서 진행
chef-repo –cookbook |-쿡불들
쿡북을 생성하고
chef generate cookbook cookbooks/cookbookname
.kitchen.yml 수정
생성한 폴더를 보면 cookbookname/.kitchen.yml 폴더에 vagrant 환경설정파일이 존재함.
아래와같은 형식으로사용가능.
---
driver:
name: vagrant
provisioner:
name: chef_zero
platforms:
- name: ubuntu-14.04
driver:
customize:
memory : 256
suites:
- name: default
run_list:
- recipe[recipe name::default]
attributes:
list : 현재 상태를 확인 가능함
kitchen list
결과
Instance Driver Provisioner Verifier Transport Last Action
default-ubuntu-1404 Vagrant ChefZero Busser Ssh <Not Created>
create : VM 이생성되고(kitchen.yml 에서 설정한값으로)
kitchen create
결과
-----> Starting Kitchen (v1.4.2)
C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/httpclient-2.6.0.1/lib/httpclient/webagent-cookie.rb:458: warning: already initialized constant HTTPClient::CookieManager
C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/httpclient-2.6.0.1/lib/httpclient/cookie.rb:8: warning: previous definition of CookieManager was here
-----> Creating <default-ubuntu-1404>...
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'opscode-ubuntu-14.04'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: kitchen-whatap-agent-oregon-default-ubuntu-1404_default_1458803869963_74332
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if it's present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Machine not provisioned because `--no-provision` is specified.
[SSH] Established
Vagrant instance <default-ubuntu-1404> created.
Finished creating <default-ubuntu-1404> (0m44.51s).
-----> Kitchen is finished. (0m49.02s)
zlib(finalizer): the stream was freed prematurely.
login : 생성한 VM 에 접속
kitchen login
converge : Chef의 파일이 적용됨.
kitchen converge
destroy : VM이 삭제됨.
kitchen destroy
#Chef Syntax 개인적으로 쉘스크립트를 작성후 chef 를만든다. 쉘스크립트와 매핑해서 사용가능한 chef Syntax 를 정리.
bash
bash "install zabbix" do
user "root"
cwd "/tmp"
code <<-EOH
wget http://repo.zabbix.com/zabbix/2.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_2.2-1+precise_all.deb
sudo dpkg -i zabbix-release_2.2-1+precise_all.deb
sudo apt-get -qq update < /dev/null
export DEBIAN_FRONTEND=noninteractive
sudo apt-get -y install zabbix-server-mysql zabbix-frontend-php < /dev/null
wget http://whatap-internal.hbox.a3c.co.kr/install%2Fzabbix_server.conf -O /etc/zabbix/zabbix_server.conf
EOH
not_if { ::File.exists?('/usr/share/zabbix') }
end
user : 실행할 User 정보
cwd : 실행할 경로
code : 실행할 스크립트들 EOH안에 해당스크립트를 입력한다.
```shell
<<-EOH
bash 스크립트
EOH
execute 명령어를 이용 할 수도 있음
execute 'apache restart' do
command '/usr/sbin/apachectl restart'
end
remote_file(wget)
wget 과 같이 해당파일을 다운로드 받을때 사용한다.
####
remote_file '/tmp/zabbix-release_2.2-1+precise_all.deb' do
source ' http://repo.zabbix.com/zabbix/2.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_2.2-1+precise_all.deb'
owner 'root'
group 'root'
mode '0644'
action :create
end
remote_file ‘ ‘ : 다운로드될 파일위치 source : 원본 소스파일 owner : 소유자
group : 그룹 mode : 실행권한 action : create 일 경우 존재할경우 생성안하고, 없으면 생성함.
dpkg_package(dpkg)
dpkg_package 'zabbix-release_2.2-1+precise_all.deb' do
source "/tmp/zabbix-release_2.2-1+precise_all.deb"
action :install
end
Apt-get Update
metadata.rb 에 depends 를 추가해준후 사용가능하다.
depends 'apt', '~> 2.9.2'
전문
name 'whatap-zabbix-sh'
maintainer 'Kwangmyung Kim'
maintainer_email 'kwangmyung.kim@gmail.com'
license 'all_rights'
description 'Installs/Configures'
long_description 'Installs/Configures'
version '0.1.0'
## depends
depends 'apt', '~> 2.9.2'
- execute 를 사용할수도 있다.
execute "apt-get-update-periodic" do command "apt-get update" end
package(apt-get install, yum install)
package 설치
package ['zabbix-server-mysql'] do
action :install
end
python pip
python 의 pip 인스톨
pip install Django==1.6.11
describe pip('Django') do
it { should be_installed }
its('version') { should eq '1.6.11' }
end
template 에서 변수설정
변수를 이용하려면 Attributes 에서 설정한 내용을 가지고 사용을 할수 있다.
- attributes
default['mycookbook']['DBHost'] = '192.168.44.12' default['mycookbook']['DBPassword'] = 'password'
- template
ttemplate "/etc/my/test.conf" do source "test.conf.erb" owner 'root' group 'root' mode '0644' variables({ :my_db_url => node['mycookbook']['DBHost'], :my_password => node['mycookbook']['DBPassword'] }) end
변수의 사용은 <%= @my_password %> 형식으로 사용하면된다.
- /sudoers.erb
<database>
<default>mysql://rnd:<%= @my_password %>@<%= @my_db_url %>/</default>
</database>
#link (ln) 링크연결
# cd /etc/apache2/sites-enabled/
# ln -s /etc/hw/apache/public.conf
link('/etc/apache2/sites-enabled/public.conf') do
group 'root'
owner 'root'
to '/etc/hw/apache/public.conf'
end
#디랙토리생성
directory '/etc/hw/' do
owner 'root'
group 'root'
mode '0755'
action :create
end
export DEBIAN_FRONTEND=noninteractive
# Force dpkg to not overwrite configuration files - and don't ask anything
file '/etc/apt/apt.conf.d/force_confdef' do
owner 'root'
group 'root'
mode 00644
content 'Dpkg::Options {
"--force-confdef";
"--force-confold";
}'
action :create
end