#Chef是什么
官方的介绍是这样的:Automation for Web-Scale IT.Chef delivers fast, scalable, flexible IT automation.
简单来说Chef就是IT自动化工具,它把服务器的环境(软件、依赖库、网络等)进行抽象,以特有的配置语法(Ruby语言)对其进行管理,可以自动的进行服务器环境的初始化工作。Chef也是实践DevOps和Continuous Integration的重要工具,同类的工具还有puppet。
#为什么需要Chef
Web开发者肯定对以下的情景熟悉:
以上的问题总结为一句话就是环境管理的混乱,或者说根本没有环境管理。环境管理可能是个不那么太引起开发者重视的一项事情,许多人对环境的要求只是能够跑起来,不管通过什么自虐的方式配置起来都没有问题,如果生产环境发生了变更,而开发环境没有及时变更,那么只能骂娘。其实环境管理和代码的版本控制是一样的重要,你能想象没有版本控制的开发方式吗?有人会说:我照着文档手动配置环境也很快,也不会出错啊。如果这样那么你可以关闭当前网页了。
Chef基本上做两件事:
#Chef环境
Chef环境由三个部分组成:Chef server,Workstation, Node(此Node非Node.js)。
Chef server是Chef环境的中枢,其中存储了基础设施环境的信息。你可以使用开源Chef server,也可以使用Chef官方提供的商业服务:Enterprise Chef。
Workstation是你的工作台,一般情况下就是你的开发机器。你会在Workstation中创建cookbook,并且上传到Chef server,以及其他与Chef相关的工作。
一个Node就是你基础设施环境中的一台服务器,也就是你用Chef来管理的机器。一个Node可以是一台物理机器,一个虚拟机,也可以是cloud环境中的一个instance,甚至是你网络环境中的一个交换机或路由器。如果你想要在Node上部署环境,那么Node会与Chef server进行交互获取信息,并在Node上执行环境初始化操作。
三者之间的关系是这样的:
为了节省时间和资源,本文使用Enterprise Chef作为自己的Chef Server,先注册账号,然后登录并添加自己的ORGANIZATION,这里就不详细说明了,请自行摸索。
##Omnibus installer
我们首先安装omnibus installer,Mac或Ubuntu用户执行如下命令:
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
以上命令会在机器上安装chef-client
,Ruby语言
,Knife
等一系列工具,安装结束后输入以下命令来确认安装没有问题:
$ chef-client -v
Chef: 11.12.8
chef-client安装完成之后,会在/opt
生成如下的目录结构:
/opt
/chef
/bin
/embedded
/bin
/include
/lib
/share
/ssl
注意:如果我们使用的是自行安装的开源Chef server,那么需要安装git,git安装方法这里不再叙述。
以上完成之后,我们需要获取chef-repo,如果使用的是Enterprise Chef,那么你需要下载Starter Kit
之后拷贝到home目录下:
$ cp chef-repo ~/
为了能够与Chef server通讯,我们需要登录到Enterprise Chef上获取三个配置文件:
获取到以上三个文件之后,我们需要把它们拷贝到~/chef-repo/.chef
目录下:
$ cp /path/to/knife.rb /path/to/ORGANIZATION-validator.pem /path/to/USERNAME.pem ~/chef-repo/.chef
由于Chef中的工具都是基于Ruby语言的,所以chef-client中包含了一个稳定版本的Ruby解释器,你需要把它添加到$PATH中,以便通过命令行可以执行Ruby脚本。
$ echo 'export PATH="/opt/chef/embedded/bin:$PATH"' >> ~/.bash_profile && source ~/.bash_profile
如果通过Knife可以和Chef server通信,那么代表Workstation安装成功,接下来需要验证。
进入chef-repo
$ cd ~/chef-repo
执行以下命令
$ knife client list
如果执行成功会返回一个可以访问Chef server的client列表。比如:
workstation
registered_node
一个Node可以是任何可以连接上网络的电脑,你必须是它的管理员,并且拥有sudo或者root权限。官方推荐CentOS 6+,Windows Server 2008+,或者Ubuntu 12.04+。你还需要拥有它的SSH账号、密码以及端口。
虽然你可以自己折腾物理机器,不过如果只是想看看Chef有什么功能的话,Chef官方提供了一些配置好的虚拟机,君请自取:
如果你想在自己的本地折腾,那么Chef官方也提供了Vagrant方案:在你之前下载的Starter Kit
中已经包含了Vagrantfile
文件:
$ ll ~/chef-repo
-rw-r--r-- 1 weizhifeng staff 2405 Jul 18 06:26 README.md
-rw-r--r-- 1 weizhifeng staff 3747 Jul 18 16:24 Vagrantfile
drwxr-xr-x 4 weizhifeng staff 136 Jul 18 06:26 cookbooks
drwxr-xr-x 3 weizhifeng staff 102 Jul 18 06:26 roles
你可以直接执行
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 8080 => 9090 (adapter 1)
default: 22 => 2200 (adapter 1)
来启动VM。
接下来我们需要执行knife bootstrap
命令,这个命令会在VM上安装chef-client,并且chef-client会与Chef server进行交互。
$ knife bootstrap localhost --sudo -x vagrant -P vagrant --ssh-port 2222 -N node1
Connecting to localhost
localhost Starting first Chef Client run...
....
....
localhost Starting Chef Client, version 11.12.8
localhost resolving cookbooks for run list: []
localhost Synchronizing Cookbooks:
localhost Compiling Cookbooks...
localhost [2014-07-19T13:50:55+00:00] WARN: Node node1 has an empty run list.
localhost Converging 0 resources
localhost
localhost Running handlers:
localhost Running handlers complete
localhost
localhost Chef Client finished, 0/0 resources updated in 76.501062463 seconds
注意:如果你运行了N个Vagrant VM,那么--ssh-port 2222
可能不正确,你可以在vagrant up
输出的日志中找到正确的网络转发端口。
为了确认Node是否已经bootstrap成功,访问manage.opscode.com/organizations,在Nodes标签上你应该可以看到刚才bootstrap的node名称。
恭喜,你现在拥有了一个Chef环境,下一篇文章我们开始介绍Chef怎么使用。
#参考