一些背景

Chef是什么?

Automation for Web-Scale IT.Chef delivers fast, scalable, flexible IT automation.

简单来说Chef就是IT自动化工具。它对服务器的环境(软件、依赖库、网络等)进行抽象,以特有的配置语法(Ruby语言,Chef是由Ruby开发的)对其进行管理,可以自动的进行服务器环境的初始化工作。

为什么会有Chef

想象一下,当我们需要搭建一个站点,需要安装服务器, 一台服务器没啥,花点时间就能装好。随着网站的发展,需要多加几台服务器, 也没啥,再多花点时间,但是,要做集群的话,要保证几台服务器的环境是完全一样的,所以很多人用shell写了自动安装脚本。但是写过shell脚本的人,都知道有多痛苦了。 随着站点的发展,可能要维护上百台服务器,这个时候如果还用shell脚本、人工安装的方式初始化服务器环境,那工作量简直不可想象。

在Chef出现之前,已经有CFEngine、Puppet等自动化运维等工具了。从2008年开始,互联网时代逐渐进入了云时代,运维工程师面临的问题是,从以前的几台、几百台服务器发展到几千、几万、几十万台服务器,所以,使用一个可预见、可测试的基础架构是非常重要的,而CFengine、Puppet提供的方案,却是缺乏这种可预见性并且也无法完全测试。

而Chef将用户写的系统管理脚本称作“菜谱”(recipe),允许用户定义服务器角色(例如网页服务器、数据库服务器),用户可以把“菜谱”按需加入角色,Chef以用户规定的顺序来执行菜谱中定义的任务,默认情况下,如果出现问题导致任务无法完成,Chef报错并退出运行。这样工程师可以更容易地了解到脚本有错误,加以修改、测试,节省生产时间,提高效率 (然而也可以配置Chef作为一个daemon来运行,来达到convergence的效果)。

此外,Chef使用基于Ruby的DSL(Domain Specific Language)来作为“菜谱”脚本中的语言,对于更加倾向于运维的工程师,这种DSL通俗易懂,而对于更加倾向于软件开发的工程师,则可以使用Ruby来扩展“菜谱”的功能。同时,Chef可以作为程序库被包含在软件项目中,真正鼓励和让开发者能在设计、开发阶段考虑部属、扩张(scale)、维护和计划容量(capacity planning),并将系统配置级别的代码融入内部网络服务的代码中。

通过Chef的“菜谱”,工程师们可以将整个的基础架构用简单易懂的代码来记录和保存。如果使用的数据中心或间接的云服务商数据中心在霎那间被龙卷风毁灭,Chef可以迅速通过这些“菜谱”和角色来让你建立一个全新的基础架构,最小化生产环境下的服务停顿时间。

并且,使用Chef配置的基础架构是100%可预见、可测试的。

打个比方,Chef就像一个制作玩具的工厂,它可以把一些原材料做成漂亮的玩具, 它有一些模板,你把原材料放进去,选择一个模板(比如怪物史莱克),它就会制造出这个玩具 服务器的配置也是这样,一台还没有配置的服务器,你给它指定一个模板(role或recipe), Chef就会把它配置成你想要的线上服务器

这个只是Chef的一方面,因为可以安装好系统后执行一个脚本也达到同样的目的,Chef还有另一方面 是脚本达不到的,那就是Chef对经过配置的服务器有远程控制的能力,它可以随时对系统进行进一步的配置或修改 就像前面的玩具工厂可以随时改变它的玩具的颜色,大小(好像现实中不太可能) 你也可以通过手动的方式达到目的, 但是当服务器比较多的时候,可能手动的方法就不是那么欢乐了。Chef提供了更方便统一的方法。