Chef Server & Knife 實作

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

Ming-der Wang

ming@log4analytics.com

TurboTeam 集先鋒科技

回顧 chef solo

chef solo 跟 chef server 比較

  • chef solo 沒有 authentication 管理
  • chef solo 沒有 cookbooks 集中管理
  • chef solo 沒有 API 提供互動

Recall cookbooks 放在哪裡?

用 Git 來管理 chef-repo

chef 有哪些重要元件?

用 Git 來管理

Chef Server 安裝

Download Page

但基本上, 我們不再手動安裝任何東西, 改用自動部署

但我們用 chef-solo 來安裝 chef server

VM 至少要 1.5GB RAM

安裝 Chef DK

  • chef DK -> https://downloads.chef.io/chef-dk/
  • 還需安裝 knife solo

chef gem install knife-solo

gem install knife-solo

Windows  或 Mac 環境需安裝

  • git
  • Oracle VM VirtualBox
  • WINGM64 bash 環境

安裝一些基本工具

安裝 docker toolbox (click image)

實作一:安裝 Chef server 

(用 chef solo 安裝 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]"
  ]
}

prepare and cook it

$ cd TaipeiDevOpsMeetup-chef/chef-repo

$ knife solo prepare username@nodenameorip

$ knife solo cook username@nodenameorip

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

安裝成功

實作二:

knife 連上 chef server

$ knife node list <- 確定連線

$ knife ssh check

$ knife status

參考 https://www.linode.com/docs/applications/chef/beginners-guide-chef

check your ~/.chef

.chef
├── cache
├── client.pem
├── knife.rb
├── mwang.pem
└── syntax_check_cache

check your ~/.chef/knife.rb

log_level                :info
log_location             STDOUT
node_name                'mwang'
client_key               '/Users/mingderwang/.chef/mwang.pem'
validation_client_name   'chef-validator'
validation_key           '/Users/mingderwang/.chef/client.pem'
chef_server_url          'https://chef-server.log4analytics.com:443'
syntax_check_cache_path  '/Users/mingderwang/.chef/syntax_check_cache'
cookbook_path [
  "/Users/mingderwang/src/chef-repo3/cookbooks"
]

client.pem

mwang.pem

create a new users

連上自己的或我的 chef-server

  • 要先在 https://chef-server.log4analytics.com 開帳號
  • $ cd /tmp

接下來大家實作看看

30 mins
  • $ git clone https://github.com/mingderwang/sample_chef_workstation_config.git
  • $ wget https://gist.githubusercontent.com/mingderwang/bf28f74b768927dfd72ebac855ca0bc9/raw/3be6e0ec516cd70fc4fe665fe45d8d7d36691a3c/demo123456.pem

實作三:

knife bootstrap a node

$ knife bootstrap 104.236.11.146 -N do1 -x mwang --sudo

knife bootstrap 目的是幫你 node 安裝 chef-client,

跟 chef solo 的 prepare 功能類似

 

// 這裡 mwang user 必須有 sudo 能力.

大家挑自己 node 的名字, 不要跟別人重複 (例如 mingdo1)

create your repo-chef

$ chef generate repo chef-repo

$ cd chef-repo

$ git init

$ git add -A

$ git commit -m 'init from chef-repo create'

 

// git push to your git server.

// to share with your IT admins.

 

chef-repo內容跟 chef solo 類似

  • vi chef-repo/nodes/do1.json
  • $ knife node from file do1.json

{ "name": "do1",
  "chef_type": "node",
  "json_class": "Chef::Node",
  "chef_environment": "_default",
  "run_list": [
    "recipe[ntp]"
  ]
}

do1.json 範例

大家挑自己 node 的名字, 不要跟別人重複 (例如 mingdo1.json)

在 do1 node 上執行 chef-client

  • ssh do1
  • $ sudo chef-client

接下來大家實作看看

30 mins

大家挑自己 node 的名字, 不要跟別人重複 (例如 mingdo1)

註解: cookbook 更新 server, 指令為

$ knife cookbook upload log4-chef-server

Q & A

ming@log4analytics.com

DevOpsTaiwan.slack.com

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

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

By Ming-der Wang

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

  • 1,632