chef简介
在进行大规模部署的时候,比如说cloud foundry云平台的安装与部署,如果一个组件或者节点需要安装 多个甚至几十个(比如说dea+warden),手动安装就不那么愉快了,这么时候必须借助于自动化部署工具 ,比如chef。简单一点说,就是我们将安装部署的过程写成脚本,然后chef帮助我们去自动分发到各个 客户端去执行。
chef部署方式有多种,这里我们只介绍多机集群环境的部署方式-chefserver,这时候chef集群环境的结构 为:
1.chef-server 整个chef集群环境的服务器,也是cookbooks等的存储位置
2.chef-workstation 它其实是一个客户端,是你的开发仓库,你可以在上面开发cookbook
3.chef-client 客户端,也叫node,它就是你要安装配置的目的主机
我们来由简入繁地介绍这三个部分:
chef-client 就是chef集群环境中的节点,比如说cloud foundry平台中需要几个节点就需要开辟出 多少个chef-client,当客户端执行
sudo chef-client
的时候,它会到chef-server上拉取与自己对应 的cookbook,然后执行。chef-workstation chef的开发仓库,它通过knife命令来与chefserver交互,cookbook的指派任务就是 通过knife命令来完成的。可以这么说,chefserver启动以后,就可以通过chef-workstation来接管它, 一切的操作过程都是由knife命令来完成的。
chef-server 这是chef的核心,它由这么几部分构成:
1.chef-server(API)chef-server的Restful API接口,来自客户端所有的请求都由它来接收,客户端的文件也是由它分发出去。 2.WebUI chef提供给用户的web接口,通过它可以了解chef环境的全貌 3.rabbitmq 基于AMQP的消息中间件,当server接收workstation推送过来的更新的时候,数据通过rabbitmq更新到solr中 4.solr chef使用的搜索引擎系统,它可以搜索到客户端需要的文件索引 5.postgres chef11.x版本使用的数据库,所有的节点,role,recipe等都存储在这里,server会通过solr得到的文件索引从数据库中提取数据
由于需要对云平台中的节点进行定制,所以chef环境的搭建是个复杂的过程。
cookbook
上文中都是chef的架构和chef的工作形式,那些在workstation中开发并需要在客户端运行的DSL代码就是 cookbook,所以cookbook的编写是使用chef最重要的一环。
Resource和Provider
file "/tmp/something" do owner "root" group "root" mode "0755" action :create content "just test" end
cookbook的编写实际上就是由这些resource和provider来组成的,何为resource就是需要的资源,这里的
资源就是文件,上面这段代码的意思即为:文件名-/tmp/something,所有者和组都是root,权限为为0755,
动作为创建,文件内容就是"just test"。只要清楚语法规则,写cookbook是一件很轻松的事情。chef文档:http://docs.opscode.com/
但是有时候需要cookbook完成复杂的场景设计,这么时候就需要好好学习chef文档了,甚至自己开发自己 需要的resource和provider,libraries。
- Node和role
所谓node就是一台客户端,role就是一组recipe的串联,有时候我们希望一组cookbook连续执行,我们 可以将这些recipes写入role的run_list中,这样role中的run_list就可以在客户端串联执行。同样的道理 我们可以将多个role写入node的run_list中,这样我们就可以在一个节点-node中执行多个role。例如我 们需要在一台机器chefnode-5上安装UAA,那么chefnode-5的run_list为:
run_list: role[java],role[uaa]
role[java]的run_list为:
run_list:
recipe[java]
recipe[java::maven]
recipe[java::maven_uaa_repository]
- databag
databag是chef环境的全局变量,在cloud foundry部署过程中,一些组件的ip需要在平台中保存起来,并 且让别的节点能够读取,这时候就需要全局变量了。你可以在cookbook中通过data_bag和data_bag_item 来访问databag,我们一般将其设置成json格式的数据,方便在ruby中读写。