解析自动化部署工具-chef

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中读写。



Previous     Next
zhing /
Published under (CC) BY-NC-SA in categories chef  tagged with chef