Chef Server Rest API

Chef11 中的核心api用erlang重写了,我们这里暂时不去深入探究erlang的代码,但是我们应该知道,erlang是性能的保证。erlang天生就是处理高并发的高手,chef server使用erlang来开发核心Api,我们几乎不用担心Chef Server的性能问题了。

Chef Server还使用了Rabbitmq来提供消息队列,来处理search服务,更是为了性能所考虑,消息队列有诸多好处,增加请求吞吐量、保证健壮性请求不易丢失等。

我们举个例子来说明下Chef Server Rest API:

res-api res-api

我们可以看得出来, chef server rest api,跟我们Rails基础中讲过的restful概念,是一样的。

调用 Chef 命令

为了实现上层系统调用 Chef 的完全自动化,有时候需要自动化 Chef Client 的配置。将一个非 Chef Client 的普通机器自动注册成 Chef Client,能提高整个系统的自动化程度。Chef 的 REST API 没有提供注册 Chef Client 的功能,而 Chef 的 bootstrap 命令是用来完成这个工作的。所以上层系统需要使用某些机制(如使用 JSch)来在 Chef Workstation 上运行 bootstrap 命令。

通常我们用如下命令来将一个普通机器注册成 Chef Node:

knife bootstrap client_IP -x username -P password

如果客户端已经安装了 chef-client软件,此命令会直接将这个客户端注册成一个 Chef Node;如果客户端没有安装 chef-client软件,此命令会试图从网络上直接下载安装包去安装 chef-client 然后注册。

对于没有外部网络连接的客户端,又没有安装 chef-client软件,我们可以自定义 bootstrap 所用的模板,让其不从网络下载chef-client,而直接从本地服务器下载 chef-client 进行安装(前提是配置一个本地服务器如 HTTP 服务器,将 chef-client 软件预先放到服务器上)。

如果是默认安装,bootstrap 所用的模板位于 Workstation 的/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.10.4/lib/chef/knife/bootstrap/目录下。我们可以在此目录下新建一个模板,命名为 ubuntu12.04-gems-mine,在原有的 ubuntu12.04-gems 模板基础上进行修改,如将安装 chef-client 软件的部分自定义:

if [ ! -f /usr/bin/chef-client ]; then
  mkdir -p /tmp/chef-installer
  cd /tmp/chef-installer
  #Copy chef client rpm from HTTP file server
  wget http://http_server_ip/chef/chef-11.12.2-1.el6.x86_64.rpm
  rpm -ivh chef-*.rpm
  rm -rf /tmp/chef-installer
fi

然后我们使用自定义的模板来运行 bootstrap 命令:

# knife bootstrap client_ip -x username -P password –d ubuntu12.04-gems-mine

这样在 bootstrap 一个普通的没有安装 chef-client 的机器时,Chef 就会从本地的服务器上下载 chef-client 软件(无需外部网络连接),安装在客户机上,然后注册成 Chef Node。 可见,对于没有提供 Chef REST API 的一些特殊 Chef 功能,可以通过调用 Chef 的命令行来完成。

结语

Chef Rest API, 和Rails的restful架构是一样的概念,我们通过调用 Chef 的 REST API,就可以完成对 Chef 资源的管理。而对于Rest Api并没有提供的功能,我们可以直接使用knife来调用chef命令来完成我们的工作。