Contents

Chef 명령어!

   Jul 23, 2017     8 min read     - Comments

셰프는(Chef, http://www.opscode.com/chef)는 OPSCODE(http://www.opscode.com)에서 만든 오픈 소스 시스템 관리 프레임워크다. 루비(Ruby)로 작성된 프레임워크를 이용한다.

셰프(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 명령어로 생성할 수 있다.

cd chef-repo
mkdir cookbooks 
chef generate cookbook cookbooks/cookbookname

기본 수정은 default.rb 에서 작성하면된다. Edit default.rb

/chef-repo/cookbooks/cookbookname/recipes/default.rb

Upload cookbook

Upload 는 knife 를 이용한다.

knife cookbook upload cookbookname
knife cookbook list

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 인증오류로 정상적으로 접근이 안됨. 설치한 서버에서 인증서를 다운받아 접속해보아야함.

  1. ssl 파일을 다운받고
    knife ssl fetch
    
  2. 정상적으로 설치되었는지 확인.
    knife ssh check
    
  3. 리스트 정상적으로 받아오는지 확인
    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