Chef 實作

#DevOps 系列課程 (五) - 自動部署

Ming-der Wang

ming@log4analytics.com

TurboTeam 集先鋒科技

Chef 簡介

https://www.chef.io  ( 7 year-old)

http://www.rightscale.com/blog/sites/default/files/Cloud%20Computing%20Trends%20DevOps%20Tools%20Use%202015.png

2015 的問卷

"chef engineer average salary"

功能

  • 自動部署環境 (provisioning)
  • 自動部署軟體 (deployment)
  • 沒有 clients 數量的限制
  • 現成 cookbooks 可以用 (in the supermarket)
  • ruby-based
  • chef-server or chef-solo
  • 建議公司用 chef-server

其他類似的工具

  • Puppet (puppet.com)
  • Ansible (ansible.com)
  • Salt (saltstack.com)
  • CFEngine (cfengine.com)
  • RunDesk (rundeck.org)

 

*Docker 算不算?

Chef Server, W/S, Nodes概念

CHEF SERVER

NODES

Workstation

Workstation

Workstation

cookbooks 放在哪裡?

用 Git 來管理 chef-repo

chef 有哪些重要元件?

用 Git 來管理

docker

  • containers 等級
  • Cattle 類
  • ex. ELK? Redis?
  • micro services
  • stateless
  • testing Environment
  • 其他 ...

chef

  • VMs or bare metal 等級
  • Pets 類
  • ex. kubernetes clusters
  • DB?
  • persistence
  • Single Sign On?
  • 其他 ...

哪些該用 Chef ? 哪些該用 docker-compose ?

? <-------------  開發環境  ----------> ?

? <-------------  Production  ----------> ?

? <-------------  gitlab? redmine? jenkins  ----------> ?

Chef 安裝

Download Page

Pricing Page

實作一:Chef solo 

(在沒有 chef server 情況下

cookbook 初體驗)

需安裝

  • git
  • Oracle VM VirtualBox 
  • vagrant -> https://www.vagrantup.com/downloads.html
  • chef DK -> https://downloads.chef.io/chef-dk/
  • 還需安裝 knife solo

chef gem install knife-solo

gem install knife-solo

hello

照這個 Link 做 hands-on (15 分鐘)

Source Tree

$ vagrant init forumone/centos64-64
$ knife solo init chef-repo

vagrant up

 

$ vagrant up

 

$ vagrant ssh-config --host hogege >> ~/.ssh/config

$ ssh hogege

 

// 記得要 prepare your node (chef-server 叫 bootstraping)

$ knife solo prepare hogege

my first cookbook

$ knife solo init chef-repo
$ cd chef-repo
$ knife cookbook create hello -o site-cookbooks/

or $ cd site-cookbooks; chef generate cookbook hello (新方法)

照著 link (http://www.webcyou.com/?p=4776) 修改一下 hello cookbook

my first node

$ cat nodes/hogege.json

 

 

 

 

 

 

$ knife solo cook hogege

{
  "run_list": [
    "recipe[hello]"
  ]
}

實作二:安裝 Chef server 

(用 chef 安裝 chef server)

hands-on

$ git clone https://github.com/mingderwang/TaipeiDevOpsMeetup-chef.git

$ cd TaipeiDevOpsMeetup-chef

$ git checkout v2.0.1-log4-chef-server

$ git checkout -b chef-server

Berksfile

$ cat Berksfile
source "https://api.berkshelf.com"

 

cookbook 'chef-server', '= 2.1.6'

 

$ berks install

node

$ cat  nodes/hogege.json
{
  "run_list": [
    "recipe[chef-server]",
    "recipe[log4-chef-server]"
  ]
}

cook it

$ cd TaipeiDevOpsMeetup-chef/chef-repo

$ knife solo cook hogege

 

(if can't SSH)

$ cd TaipeiDevOpsMeetup-chef/

$ rm -r .vagrant

$ vagrant ssh-config --host hogege >> ~/.ssh/config

troubleshooting

$ cat .chef/knife.rb
cookbook_path    ["cookbooks", "site-cookbooks"]
node_path        "nodes"
role_path        "roles"
environment_path "environments"
data_bag_path    "data_bags"
#encrypted_data_bag_secret "data_bag_key"

knife[:berkshelf_path] = "cookbooks"
Chef::Config[:ssl_verify_mode] = :verify_peer if defined? ::Chef

安裝成功

實作三:

Wrapper Cookbook

參考 https://blog.chef.io/2013/12/03/doing-wrapper-cookbooks-right/

(如何客製化你的 cookbook)

- 也將成為公司規定 -

絕對不要 git clone cookbook, 直接修改

use ntp as an example

Create log4-ntp

$ knife cookbook create log4-ntp -o site-cookbooks

 

or

 

$ cd site-cookbooks

$ berks cookbook log4-ntp

install cookbook in Berksfile

$ cat Berksfile

source "https://api.berkshelf.com"
cookbook 'ntp', '~> 3.2.0'

 

depends in your metadata.rb

$ cat metadata.rb
name             'log4-ntp'
maintainer       'YOUR_COMPANY_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures log4-ntp'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'

depends 'ntp'

in your cookbook

log4-ntp/attributes/default.rb

default['ntp']['peers'] = ['ntp1.acmeco.com', 'ntp2.acmeco.com']

 

log4-ntp/recipes/default.rb

include_recipe 'ntp'

 

change your run_list

$ cat nodes/hogege.json
{
  "run_list":[
             "recipe[log4-ntp::default]"
          ]
 }

 

$ knife solo cook hogege

Sorry

以下new Chef, 我還不會

(會的人, 10/28 可以來分享)

new Chef ECO system

Try Habitat

Try InSpec [start the demo]

Q & A

ming@log4analytics.com

DevOpsTaiwan.slack.com

(進入 slack 方法  -> devopstaiwan.com)

#DevOps 系列課程 (五) - Taipei Meetup

By Ming-der Wang

#DevOps 系列課程 (五) - Taipei Meetup

  • 1,803