Chef 101 - Knife Solo

Image

Knife

https://docs.chef.io/knife.html

Knife 是一个命令行工具,为本地开发环境中的 Chef 仓库和远程服务器之间提供交互接口。

它提供了很多命令,用来管理服务器上Chef,但因为我们主要是用来进行单机管理,所以这里的功能都用不到,而是要借助另一个工具:

knife-solo

http://matschaffer.github.io/knife-solo/

knife-Solo 是 Knife 的一个扩展插件,用来进行单机Knife操作,直接在开发设备上和要配置的服务器交互,而无需通过Chef 中央服务器。它给了5个新的二级命令,用来直接和需要配置的服务器交互:

  • knife solo init 用来快速创建目录结构,(称之为 Kitchen)。这是Chef的标准目录结构,可以方便的构建存储recipes。
  • knife solo prepare 在给定的远程VPS上安装Chef。它会自动的根据服务器类型安装对应的Chef程序。
  • knife solo cook 上传当前Kitchen 到 VPS 上,然后执行 chef-solo。
  • knife solo bootstrap prepare + cook 的组合。
  • knife solo clean 从 VPS 删除所有已上传的Kitchen

Installing knife-solo

knife-solo 一般都会结合 berkshelf 同时使用,当然你也可以使用librarian-chef。创建一个新的目录,执行bundle init,在生成的Gemfil中加入以下内容。

1
2
3
4
5
6
source 'http://ruby.taobao.org'
gem 'knife-solo'
gem "chef"
gem 'chef-zero'
gem "berkshelf"

执行 bundle install 完成安装。

Preparing the Chef kitchen with Berkshelf

在刚才新建的目录下,执行下面命令,完成 Kitchef 的新建。(chef-solo 会自动检测 berkshelf / Librarian 是否安装,如果安装,则为其创建配置文件,如时都安装了,默认 Berkshelf

1
2
3
4
5
$ knife solo init .
# Creating kitchen...
# Creating knife.rb in kitchen...
# Creating cupboards...

这样就建好了一个chef solo的项目目录,

1
2
3
4
5
6
7
8
9
10
chef_rails
├── .chef
│ └── knife.rb
├── Berksfile
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
└── site-cookbooks
  • knife.rb - chef-solo 的唯一配置文件,一般情况下不需要改动。
  • Berksfile - Berkshelf的配置文件
  • cookbooks - Berkshelf 用来存放第三方(Vendor) cookbook目录。
  • data_bags - 用于放置配置数据文件 doc
  • environments - environment 配置 (optional).
  • nodes - node configuration, knife-solo will automatically create files here for each server you provision.
  • roles - Role 用来把多个Cookbook/Recepie组合起来,形成一个场影。(像nginx / mysql), 它除了安装软件之处,还会有一些其它的配置,像monit。
  • site-cookbooks - 自定义的cookbooks。

更多目录说明见这里:: http://docs.opscode.io/essentials_repository.html

Preparing a server

在能对服务器进行安装配置之前,需要在服务器上先安装Chef。你可以手工SSH到Server上,进行安装,也可以用knife-solo提供的prepare命令来进行安装。会自动安装Ruby和最新版的Chef。

1
$ knife solo prepare root@10.0.0.1

添加一个测试 cookbook

为了测试,先建一个cookbook,打开Berksfile,写入:

1
2
3
source 'https://api.berkshelf.com'
cookbook 'nginx'

通过 Berkshelf 下载依赖 cookbook,默认下载到 ~/.berkshelf/cookbooks

1
$ berks install

配置 node

Cookbook配好后,再试着添加一个node文件。 run_list 部分包含着要执行的recipe。
nginx::package recipe 会在 Server上通过系统默认的包管理工具进行安装。

Cookbooks通常会有一些配置选荐,Nginx cookbook中也提供了一些属性,像版本,Work Process数量。

1
2
3
4
5
6
7
8
9
10
11
{
"run_list": [
"recipe[nginx::package]"
],
"nginx": {
"version": "1.4.4",
"default_site_enabled": false,
"worker_processes": 4,
"gzip_comp_level": 5
}
}

Cooking

有了测试用的cookbook和node后,就可以对Server进行配置安装了。

1
2
3
4
5
6
7
# knife solo cook root@10.0.0.1
Running Chef on host...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...

Clean

该命令可以将Server上的cookbooks进行删除。

1
$ knife solo clean root@10.0.0.1

REF::