Chef相关知识

概述

chef是一个自动化部署的工具项目, 类似的有puppet.

官网地址:www.opscode.com 地址

chef主要分为两种方式:

  • 方式一: chef-solo

    1. chef-solo的原理是自己撰写cookbook, role等代码并配置run_list, 然后通过chef-solo命令按照run_list依次执行不同软件的部署

    2. chef-solo的可定制程度相对比较高, 不过由于代码执行是在统一路径下,使得chef-solo主要用于单机环境的部署

    3. 具体的部署方法请见下一节

  • 方式二: chef-server 和 chef-client

    1. chef-server 和 chef-client 顾名思义是经典的CS架构,这使得多机部署成为可能, 准确来说变得非常简单.

    2. 大致流程可以描述为: 通过knife命令, 根据部署规则, 分别连接待部署机器, 植入chef-client进程, chef-client从各个待部署机器上, 向chef-server请求相应的软件包, 并按照特定的配置文件部署自己的机器.

chef-solo入门

这一章节主要讲述如何建立chef的基础环境并使用chef-solo

安装chef

主要有

  1. 安装ruby

    通过rvm安装

  2. 安装chef

    gem install chef

  3. 修改chef配置文件

    mkdir /chef/solo.rb

新建和编辑文件: solo.rb 该文件是会在chef-solo执行时自动读取, 获得cookbook位置等信息

1
2
file_cache_path: "/chef-solo/cache"
cook_book_path: ["chef-solo/cookbooks"]

使用hello world的cookbook

官方的hello world, 地址

cd chef-solo/cookbooks

git clone git://github.com/opscode-cookbooks/getting-started.git

获得相应的cookbook

运行cookbook

chef-solo 命令介绍

-c —config CONFIG文件 # 配置文件位置, 默认是/etc/chef/solo.rb

-j —json-attributes JSON_ATTRIBS # 任务脚本, 控制执行cookbooks中的哪些任务和变量属性 node.json

1
2
3
{
"run_list": ["recipe[getting-started]"]
}

chef-solo -c solo.rb -j node.json -r —recipe-url RECIPE_URL # recipe的位置, 暂未用到

chef-server的搭建

此处主要描述Chef 11 的搭建和基本使用

参考: Chef 11 Server: Up and Running 地址

这篇文章主要描述了如何搭建chef-server 11, 并且介绍了chef-server-ctl管理工具的使用

目前我们的实验环境是Ubuntu 12.04 Server系统

注意 Chef Server强烈推荐有域名绑定和域名解析, 这个暂时没有实践, 通过修改/etc/hosts来进行

安装和启动

Chef Server 11 的安装真的很简单

首先获得安装包, 执行如下命令即可获得:

1
wget -O chef-server-11.deb https://opscode-omnitruck-release.s3.amazonaws.com/ubuntu/12.04/x86_64/chef-server_11.0.6-1.ubuntu.12.04_amd64.deb

在Ubuntu机器上执行, dpkg命令来安装deb的安装包, 命令如下:

1
sudo dpkg -i chef-server-11.deb

下面便是执行启动命令, 命令如下, 该命令会对chef-server进行配置和启动

1
sudo chef-server-ctl reconfigure

这个命令实质上会运行内嵌的chef-solo及其包含的cookbook, 然后设置好所有必需的环境和软件, 比如Erchef, RabbitMQ, PostgreSQL等

同时我们还可以运行测试用例, 这些用例会检测所有的组件是否正常运行, 执行如下命令即可进行

1
sudo chef-server-ctl test

下面便是设置管理员用户

复制默认的管理员的key和校验key到你本地的安装了chef-client的工作系统上, 通过knife为你自己创建一个新用户. Chef Server的密钥文件只能被root用户读取

1
2
3
4
5
mkdir ~/.chef

scp root@chef-server:/etc/chef-server/admin.pem ~/.chef

scp root@chef-server:/etc/chef-server/chef-validator.pem ~/.chef

使用knife configure -i可以创建一个初始化的~/.chef/knife.rb

执行命令

1
knife configure -i

执行结果, 在用户目录下创建一个knife.rb文件

文件并且为你自己新建一个管理员的账号. 请注意在Chef Server的机器上使用FQDN - 全称域名(Fully Qualified Domain Name), 最好可以带上HTTPS. 确认key需要从Chef Server上的/etc/chef-server/chef-validator.pem拷贝到本机的~/.chef. 通过这个key可以使用knife自动化地部署目标节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
% knife configure -i

WARNING: No knife configuration file found

Where should I put the config file? [/home/jtimberman/.chef/knife.rb]

Please enter the chef server URL: [http://chef.example.com:4000] https://chef.example.com

Please enter a name for the new user: [jtimberman]

Please enter the existing admin name: [admin]

Please enter the location of the existing admin's private key: [/etc/chef/admin.pem] .chef/admin.pem

Please enter the validation clientname: [chef-validator]

Please enter the location of the validation key: [/etc/chef/validation.pem] .chef/chef-validator.pem

Please enter the path to a chef repository (or leave blank):

Creating initial API user...

Please enter a password for the new user:

Created user[jtimberman]

Configuration file written to /home/jtimberman/.chef/knife.rb

文件 .chef/knife.rb内配置的格式大致如下:ku

1
2
3
4
5
6
7
8
log_level                :info
log_location STDOUT
node_name 'jtimberman'
client_key '/home/jtimberman/.chef/jtimberman.pem'
validation_client_name 'chef-validator'
validation_key '/home/jtimberman/.chef/chef-validator.pem'
chef_server_url 'https://chef-server.example.com'
syntax_check_cache_path '/home/jtimberman/.chef/syntax_check_cache'

注意 cookbook_path没有设置, 默认设置为空, 如果你需要存储本地的cookbook的时候请注意设置.

这个时候Chef Server已经可以使用了. 可以通过knife测试连通性

执行命令:

1
% knife client list

返回结果:

1
2
chef-validator
chef-webui

执行命令:

1
% knife user list

返回结果:

1
2
admin
jtimberman

在Chef Server以前的版本中,用户是API的客户端. 在Chef 11中, 无论是对于Opscode的公用Server还是自建的私有Server, 用户都是Server上独立的实体

chef-server-ctl

chef-server-ctl命令是被用来做Chef Server系统管理的. 它有内置的help参数可以呈现出很多的子命令. 包括之前执行过的重新配置命令和测试命令. 另外, 还有如下其他命令:

获得Chef Server上所有正在运行的服务的命令为:

1
sudo chef-server-ctl service-list

查看服务的状态, 可以用如下命令:

1
sudo chef-server-ctl status

其他与管理服务有关的命令比如:hup,int,kill,once,start,stop,term等

这些服务的日志可以通过tail命令进行tail方式的查看. 它还可以通过传递一个服务名称来查看仅仅是这个服务的日志.

1
2
sudo chef-server-ctl tail
sudo chef-server-ctl tail erchef

安装完成后, 如果我们重新修改了配置文件, 我们还可以使用reconfigure命令来配置Chef Server. 一旦Chef Server被重新配置后, 我们通过show-config来查看它的配置文件.

1
sudo chef-server-ctl show-config

文件系统位置

我们尝试将Chef Server安装的位置尽可能的集中在一个地方,而不是分散在文件系统的各个位置.下面列出Chef Server常见的几个位置:

1
2
3
4
5
6
7
/opt/chef-server – 安装包解压的位置

/etc/chef-server – 用户API配置文件和密钥文件的位置

/var/opt/chef-server – 相关的服务, 诸如RabbitMQ, Nginx, PostgresQL, SOLR索引和其他等都位于该位置

/var/log/chef-server – 所有的正在运行的服务和它们的日志在位于该位置.

系统设计是自我维护主要通过chef-server-ctl命令, 而不是直接修改组件本身

Chef Server的配置

Chef Server 11中主要的配置文件在/etc/chef-server/chef-server.rb. 类似于其他Chef配置文件, 如/etc/chef/client.rb, ~/.chef/knife.rb, 它也使用了Ruby DSL. 通过chef-server-ctl reconfigure命令, 他们被定义为在cookook中的一个个的属性值. 如下所示:

在配置文件中, 我们可以控制WebUI是否有效:

1
default['chef_server']['chef-server-webui']['enable'] = true

可以在/etc/chef-server/chef-server.rb文件中禁止它:

1
chef_server_webui['enble'] = false

注意chef-server.rb配置文件中, 属性值的名字使用下划线隔开, 而默认是短横线

同时在对/etc/chef-server/chef-server.rb文件做了任何修改后, 都应该重新配置命令:

1
chef-server-ctl reconfigure

chef-workstation的配置

每个chef workstation都必须设置一个chef-repo来跟Chef Server进行交互

设置chef-repo, 可以从github上面clone出来基础代码:

1
git clone https://github.com/opscode/chef-repo.git

执行结果:

1
2
3
4
5
6
Cloning into 'chef-repo'...
remote: Counting objects: 199, done.
remote: Compressing objects: 100% (119/119), done.
remote: Total 199 (delta 71), reused 160 (delta 47)
Receiving objects: 100% (199/199), 30.45 KiB, done.
Resolving deltas: 100% (71/71), done.

chef-repo的目录结构为:

1
2
3
4
5
6
7
8
9
10
11
12
13
|-- chef-repo

|-- certificates

|-- config

|-- cookbooks

|-- data_bags

|-- environments

|-- roles