随着 DevOps 的流行,愈来愈多的工做被自动化处理。在搭建大规模的 IT 架构时,须要系统管理员夜以继日地安装配置服务器、调整各类参数等工做,直到Chef 的出现,将系统管理员从这种水深火热的工做中解脱了出来,他们只须要编写 Chef 脚本,描述出服务器所须要保持的状态,而后运行脚本,服务器就配置好了。本文以配置一个 Web 服务器为例,对 Chef 的概念和工做流程作一简单介绍。html
0评论: node
2015 年 6 月 23 日web
在 IBM Bluemix 云平台上开发并部署您的下一个应用。bootstrap
“这是一个最好的时代,也是一个最坏的时代。他们都在直奔天堂,而咱们都在直奔相反的方向。”缓存
“90 后霸道总裁” 的超级课程表融资千万美圆、WhatsApp 被 Facebook 以 190 亿美圆收购……这个时代仿佛处处都充满了机会。如今假设咱们也决定放弃朝九晚五的工做,要开发出一款 Web 应用改变这个世界,顺便当上总经理、出任 CEO、赢取白富美、走向人生巅峰。七拼八凑,咱们的应用作出来了。它的架构很是简单,若是非要描述的话,它的架构如图 1 所示:服务器
这么简单的应用,咱们上网浏览一下资料,随便租个服务器,安装一个 Web 服务器,配置一下,应用顺利上线。架构
幸福老是来得太快,很快咱们的应用就火了。随着访问量的增大,咱们须要单独的数据库服务器,一个都不够,得来俩;应用服务器也不够用了,再多添几台,上一个负载均衡;对数据库的访问又成了性能瓶颈,增长些数据库缓存吧,最终,应用的架构变成了以下的样子:
如今问题来了,面对如此复杂的架构,怎么安装和配置这些服务呢?Chef 就是用来解决这个问题的。
让咱们暂且就此打住,先来看看怎么使用 Chef。首先须要在一台 Linux 机器上安装Chef Development Kit。若是您实在找不到一台 Linux 机器也没有关系,可以使用一个用于教学用途的在线虚拟机,该虚拟机上已经预装了 Chef Development Kit,能够直接使用。
Recipe 是 Chef 中主要执行任务的地方,翻译成中文是“菜谱”的意思。咱们的第一份“菜谱”的主要功能是使用 Chef 生成一个文本文件,其内容为:Hello Chef。让咱们先新建一个 chef-repo 目录,用来存放“菜谱”,而后在该目录下建立第一个“菜谱”:hello.rb,其内容以下:
file 'motd' do content 'Hello Chef’ end
在命令行中执行:chef-appy hello.rb,输出以下:
可 以看到,命令执行后生成 motd 文件,该文件的内容为字符串:Hello Chef。这就是咱们的第一份“菜谱”,虽然简单,可是却归纳了 Chef 的基本工做原理:使用一个 Ruby 文件,即“菜谱”描述服务器应有的状态,而后执行 Chef 命令配置服务器。
您可尝试再次执行 chef-appy hello.rb,Chef 会检测到 motd 文件已经存在,且文件内容和“菜谱”中所描述的一致,所以不进行任何操做;您还可尝试手动删除 motd 文件,再次执行 chef-appy hello.rb 后,又从新生成了 motd 文件。这正是配置服务器所须要的,每次配置都能保证状态一致。
固然,咱们的第一份“菜谱”只是一道开胃小菜,下面咱们看看如何使用 Chef 部署一个 Web 服务器。
部署一个 Web 服务器比生成一个文件复杂,但道理倒是相同的,让咱们先来看看代码:
package 'httpd' service 'httpd' do action [:start, :enable] end file '/var/www/html/index.html' do content '<html> <body> <h1>hello world</h1> </body> </html>' end service 'iptables' do action :stop end
这段代码总共分红四部分:第一部分安装 Apache HTTP Server;第二部分启动 HTTP 服务;第三部分生成主页面;第四部分停用 iptables 服务,这一步主要是由于有些 Linux 安装后,默认只打开 22 端口,其余端口是被禁止的,停用 iptables 服务后,就能够顺利访问 80 端口了,即 HTTP 协议所使用的端口。聪明的您朋友们,您能将这四部分和代码对应起来吗?
这里要注意的是,这四部分的顺序很是重要,必须先安装 Apache HTTP Server,而后启动它,这一点也不难想象,咱们手动配置服务器时不也如此吗?
将 文件保存后,让咱们再来运行 sudo chef-appy webserver.rb,由于脚本里包含安装软件包的操做,因此须要 root 权限,若是您不是以 root 帐号登陆(相信您不会真的这样作吧?),务必在命令行前加 sudo,不然,Chef 会报错。若是获得相似下面的输出,就证实服务器配置成功,打开浏览器,输入http://localhost,能够看到刚才定制的主页了吧?
然 而,做为有“洁癖”的程序员,不难发现“菜谱”的第二部分好像混入了什么奇怪的东西:一段 HTML 代码。这段 HTML 代码明显和其余部分不协调,若是网页再变得复杂点,这份“菜谱”会变得很难管理。所以,咱们得想点什么办法,管理“菜谱”。方法就是“烹饪手册” (cookbook)。
和真实的烹饪同样,“烹饪手册”是用来组织“菜谱”的,在“烹饪手册”里,不光能够定义各类“菜谱”,也能够定义一些属性文件或模板,这些属性文件或模板能够在“菜谱”里直接引用。在实际工做中,咱们每每使用的也是“烹饪手册”,而不是一个个单独的“菜谱”。
让咱们在当前目录下新建一个文件夹 cookbooks,而后切换到该目录,调用 chef generate cookbook learn_chef_httpd 会自动为咱们生成一个“烹饪手册”。“烹饪手册”的目录结构以下:
其中 recipes 目录下的 default.rb 是默认的“菜谱”,让咱们将其中内容替换为以前编写的“菜谱”。
现 在咱们要将原来“菜谱”中的 HTML 代码移到一个外部文件中,使用 chef generate template learn_chef_httpd index.html 命令生成模板文件 index.html.erb,该文件被放置在 learn_chef_httpd/templates/default 目录下。而后将该文件内容替换为以前的 HTML,修改 default.rb,引用该模板,最终的“菜谱”变成了下面这个样子:
package 'httpd' service 'httpd' do action [:start, :enable] end template '/var/www/html/index.html' do source 'index.html.erb' end service 'iptables' do action :stop end
在命令中执行 sudo chef-client --local-mode –runlist ‘recipe[learn_chef_httpd]’ ,打开浏览器,访问http://localhost ,若是能正常访问,那么恭喜您完成了本身的第一个“烹饪手册”!
上 面的例子只是为了展现如何编写“菜谱”和“烹饪手册”,真实环境下的 Chef 却不是这样工做的。在真实环境下,系统管理员在一台电脑上编写 Chef 脚本,而后使用上述方式调试,调试成功后,将脚本上传至 Chef 服务器,咱们从控制台向 Chef 服务器发命令,Chef 服务器会将配置下发到各个待配置服务器,在每一个服务器上运行 Chef,完成对服务器的配置。
为此,咱们需作三点准备:一台用于编写 Chef 脚本的电脑、一台 Chef 服务器、不少待配置的服务器。咱们已经有了一台能够编写 Chef 脚本的电脑,为了方便学习,Chef 服务器能够选用Chef 官网提供的托管服务,另外须要几台待配置的服务器,记得不要在服务器上安装 Chef,当咱们配置这些服务器时,Chef 会自动在上面安装所需的工具。
注册成功 Chef 的托管服务后,先建立一个组织,而后下载与之对应的 Starter Kit,解压到当前目录,该工具是用来作认证的,有了它,才能够从本地链接 Chef 服务器。如今让咱们删除之前建立的“烹饪手册”,转而从 Chef 超市上 下载一个现成的手册。Chef 超市是一个开发者交流“烹饪手册”的地方,由于配置服务器的不少操做都是通用的,因此人们把这些配置作成手册,放在一个地方,你们都能使用。咱们编写 Chef 脚本,每每也是先上 Chef 超市去看看有没有可用的手册,若是有,直接拿过来,或者在此基础上修改一下就能用,若是没有,再考虑编写本身的手册。使用以下命令下载前面配置 Web 服务器的手册:
knife cookbook site download learn_chef_httpd
将下载后的手册解压到 cookbooks 目录,删除压缩包:
tar -zxvf learn_chef_httpd-0.1.0.tar.gz -C cookbooks rm learn_chef_httpd*.tar.gz
接下来将该手册上传至 Chef 服务器,即咱们刚才注册的 Chef 托管服务:
knife cookbook upload learn_chef_httpd
打 开托管服务控制台,在 Policy 选项卡下就能看见刚刚上传成功的“烹饪手册”。接下来咱们要作的工做是告诉 Chef 服务器来帮咱们让服务器自举,这一步会经过 SSH 登陆到待配置的服务器,下载并安装 Chef,而后下载执行刚刚上传到 Chef 服务器上的“烹饪手册”。该操做只在第一次配置服务器时须要,自举成功后,之后就再不须要自举了:
knife bootstrap `address` --ssh-user `user` --ssh-password '`password`' \ --sudo --use-sudo-password --node-name node1 \ --run-list 'recipe[learn_chef_httpd]'
将其中的`address`、`user`、`password`替换为待配置服务器的真实地址、用户名和密码。打开浏览器,输入服务器地址,看看是否能访问定制的主页?
Chef 不光能够管理服务器,同时服务器将本身的信息上传至 Chef 服务器。使用以下命令查看当前组织里被管理的服务器:
knife node list
使用以下命令查看服务器信息,包括服务器的 IP 地址、机器名、操做系统等信息:
knife node show node1
有了这些信息后,咱们能够从新修改模板,让其显示给定服务器的信息:
<html> <body> <h1>hello from <%= node['fqdn'] %></h1> </body> </html>
再将“烹饪手册”上传至 Chef 服务器,而后使用以下命令配置服务器:
knife ssh `address` 'sudo chef-client' --manual-list \ --ssh-user `user` --ssh-password '`password`'
同理,将`address`、`user`、`password`替换为待配置服务器的真实地址、用户名和密码。打开浏览器,输入服务器地址,看看改动是否生效?
只要一台服务器配置成功,咱们即可以用一样的方法配置几十台、上百台。并且一旦配置发生变化,咱们只需修改脚本,全部服务器即可以得到相同的更新,这个时候,Chef 的威力就显示出来了。
细 心的您可能会注意到,上面的命令,一些是 chef *****,一些倒是 knife *****。初次接触 Chef,很容易被这些命令搞混。这里有一个简单的规则:本地执行的命令以 chef 打头,须要远程链接到 Chef 服务器或待配置服务器的命令以 knife 打头。
最后,让咱们再复习一遍本文中所使用到的命令:
运行“菜谱”
chef-appy hello.rb
使用 Chef 生成“烹饪手册”
chef generate cookbook learn_chef_httpd
使用 Chef 生成模板
chef generate template learn_chef_httpd index.html
使用 Chef 运行“烹饪手册”
chef-client --local-mode –runlist ‘recipe[learn_chef_httpd]’
从 Chef 超市下载“烹饪手册”
knife cookbook site download learn_chef_httpd
向 Chef 服务器上传“烹饪手册”
knife cookbook upload learn_chef_httpd
服务器自举
knife bootstrap `address` --ssh-user `user` --ssh-password '`password`' \ --sudo --use-sudo-password --node-name node1 \ --run-list 'recipe[learn_chef_httpd]'
获取当前组织下的服务器列表
knife node list
显示服务器信息
knife node show node1
使用 Chef 远程运行“烹饪手册”,配置服务器
knife ssh `address` 'sudo chef-client' --manual-list \ --ssh-user `user` --ssh-password '`password`'
随 着云计算和 DevOps 技术的发展,有人断言系统管理员和 DBA 会面临失业,将来的云计算公司和数据库公司只会雇佣少数系统管理员和 DBA 管理他们的 IT 基础设施和数据库。虽然做者不大同意“机器替代人工”这一观点,但提前下手,学点东西总不是坏事,所谓技多不压身嘛。
Chef 可以实现服务器配置的自动化,在 DevOps 运动中占有重要的位置。本文经过一个配置 Web 服务器的例子,一步步引导你们如何使用 Chef。但愿您读完本文,能编写出本身的第一个“烹饪手册”。