Chef 自动化运维:初探 cookbook
cookbook 概述
Chef 意为“厨房”,我们要做“菜”,自然需要有“菜谱”。事实上在 Chef 中分发到各服务器节点的不是“菜”,而是“菜谱”,服务器自己“做菜”,自己管理自己。
Cookbook 规定了在 Chef 中执行的操作顺序,决定了应用的构建步骤。可以从市场中寻找一个 cookbook,市场地址:https://supermarket.chef.io/cookbooks/ 使用如下命令:
knife cookbook site install nginx
它会进行版本控制,在提交历史中留下创建记录。
如果不适用版本控制,则可以使用如下命令(不推荐):
knife cookbook site download nginx
在老的版本中,使用 knife 来与 Chef Server 进行交互,创建一个 cookbook 的命令是这样的:
knife cookbook create first_cookbook
而在新版本中,创建的命令变为:
chef generate app first_cookbook
在 repo 的 cookbook 目录下新建时,输入如下命令:
chef generate first_cookbook
执行命令后,可以看到创建的目录:
.
├── Berksfile
├── chefignore
├── LICENSE
├── metadata.rb
├── README.md
├── recipes
│   └── default.rb
├── spec
│   ├── spec_helper.rb
│   └── unit
│       └── recipes
│           └── default_spec.rb
└── test
    └── smoke
        └── default
            └── default_test.rb
在新版本 Chef 中,不会自动生成所有目录,一个 cookbook 内可能包含的目录及作用参见文档:https://docs.chef.io/cookbooks.html
接下来,我们创建一个部署 nginx 的 cookbook,在这里以 tengine 为例:
第一个 cookbook
首先,修改 recipes 目录下的以 .rb 结尾的文件,该文件记录了节点自身进行操作的步骤。
package 'pcre-devel' do
  action :install
end
package 'openssl' do
  action :install
end
package 'openssl-devel' do
  action :install
end
上述脚本安装了可能缺少的依赖包,这里 Chef 可以帮我们抹除平台差异,例如在 Ubuntu 平台使用 apt 和在 CentOS 使用 yum 的差异。
也可以一步安装多个依赖包:
package %w(pcre-devel openssl openssl-devel)
  action :install
end
这里可能产生的问题是,在不同的平台包名可能不同,对不同环境下依赖包的版本不同。当然,Chef 会考虑到这一点,这里不详细展开,可以参阅文档:https://docs.chef.io/resource_package.html
安装完依赖后,就需要下载 tengine 源码,并进行编译操作。这一步用 shell 命令很方便,所以在 recipe 中也是可以定义一组 shell 命令的。在文件后追加如下行:
script 'install_tengine' do
  interpreter 'bash'
  user 'root'
  cwd '/usr/local/src'
  code <<-EOH
  wget 'http://tengine.taobao.org/download/tengine-2.2.1.tar.gz'
  tar -zxvf tengine-2.2.1.tar.gz -C /usr/local/src/
  cd /usr/local/src/tengine-2.2.1/
  ./configure
  make
  make install
  chkconfig nginx on
  EOH
end
interpreter 参数指定了要以何种 shell 去运行,user 定义执行用户,cwd 定义执行路径。
随后下载解压,进行编译安装。
可以看到我们在定义的命令中启用了 nginx 服务:
chkconfig nginx on
这里的问题在于,tengine 编译后并不会生成定义服务的文件,因而需要我们手动添加服务,即:
创建 nginx 服务文件 -> 给定权限 -> 启用服务
所以需要添加一个固定的文件,添加到节点中。在 cookbook 内,可以定义文件,文件中的内容一般是固定不变的。
在 script 'install_tengine' do 块之前添加:
cookbook_file "/etc/init.d/nginx" do
  source "nginx"
  mode '0755'
  owner 'root'
  group 'root'
end
以本地文件 nginx 去添加到节点服务器的 /etc/init.d/nginx 内。其它参数顾名思义,cookbook 文件、权限、所有者及组。
新建一个 files/default 文件夹,在其中建立 nginx 文件,该文件定义了 nginx 服务,会被添加至 /etc/init.d/ 文件夹。nginx 文件的内容可以自己去定义,也可以参考如下定义(来自 http://blog.51cto.com/benpaozhe/1760999):
#!/bin/bash
#writer:gaolixu
#chkconfig: 345 86 16
start(){
if [ -f /var/lock/subsys/tengine.lock ];then
  echo "Tengine is already running: [ FAILED ]"
else
  if /usr/local/nginx/sbin/nginx ;then
    echo "Starting tengine: [ OK ]"
    touch /var/lock/subsys/tengine.lock
  else
    echo "Starting tengine: [ FAILED ]"
  fi
fi
}
stop(){
if [ -f /var/lock/subsys/tengine.lock  ];then
 if /usr/local/nginx/sbin/nginx -s quit ;then
   echo "Stopping tengine: [ OK ]"
   rm -rf /var/lock/subsys/tengine.lock
 else
   echo "Stopping tengine: [ FAILED ]"
 fi
else
 echo "Tengine not runing: [ FAILED ]"
fi
}
reload(){
if /usr/local/nginx/sbin/nginx -s reload ;then
  echo "Reload tengine: [ OK ]"
else
  echo "Reload tengine: [ FAILED ]"
fi
}
case $1 in
"start")
 start
;;
"stop")
 stop
;;
"restart")
 stop
 sleep 1
 start
;;
"reload")
 reload
;;
"status")
 s=`pidof -s nginx`
 [ "$s" ] && echo "Tengine(nginx) pid $s running!!" || echo "Tengine(nginx) not runging!"
;;
*)
echo "usage: $0 start|stop|restart|reload|status"
esac
现在,目录结构应该是这样的:
.
├── Berksfile
├── chefignore
├── files
│   └── default
│       └── nginx
├── LICENSE
├── metadata.rb
├── README.md
├── recipes
│   └── default.rb
├── spec
│   ├── spec_helper.rb
│   └── unit
│       └── recipes
│           └── default_spec.rb
└── test
    └── smoke
        └── default
            └── default_test.rb
当安装完添加服务后,当然希望它启动:
service 'nginx' do
  supports [:enable, :start, :status, :restart, :reload]
  action :start
end
定义了 nginx 服务支持的命令和要执行的操作,对 service 的管理,参见:https://docs.chef.io/resource_service.html
同样地,使用 Chef 内置的语法来管理 service,可以消除平台差异,并且可以支持更多的逻辑判断操作,对服务的管理更加灵活。
现在就简单的完成了一个 cookbook,现在来测试一下运行结果,在 chef-repo 文件夹下运行:
chef-client --local-mode --override-runlist first_cookbook
可以看到一堆命令输出,若有报错会中止!
命令结束后,验证:
service nginx status
Tengine(nginx) pid 23776 running!!
可以看到,已经成功使用 cookbook 部署运行了 nginx。
不足
我们简单的创建了一个 nginx 的 cookbook,并且在部署后实现了服务的自动启动。但是往往在现实中会有不同的配置,简单的使用默认配置当然不能满足需求。这时,cookbook 中的 template 和 attributes 就派上用场了。下篇文章会使用模板变量结合一定的逻辑,来实现多样化的配置管理需求。
-EOF-
Chef 自动化运维:初探 cookbook的更多相关文章
- Chef 自动化运维:Chef 的安装
		
安装准备 准备三台服务器,分别用作 Chef Server.Chef DK.Chef Client 的安装使用. 在三台服务器中,添加以下 hosts: vim /etc/hosts 192.168. ...
 - Chef 自动化运维:开始“烹饪”
		
在 Chef Workstation 上创建了一个 cookbook 之后,我们执行以下命令来进行测试: chef-client --local-mode --override-runlist fir ...
 - linux自动化运维工具Ansible saltstack Puppet、Chef、Fabric之间的对比
		
发现分布式是一个发展的趋势,无论是大型网站的负载均衡架构还是大数据框架部署,以及云存储计算系统搭建都离不开多台服务器的连续部署和环境搭建. 当我们的基础架构是分散式或者基于云的,并且我们经常需要处理在 ...
 - saltstack自动化运维系列⑩SaltStack二次开发初探
		
saltstack自动化运维系列⑩SaltStack二次开发初探 1.当salt运行在公网或者网络环境较差的条件下,需要配置timeout时间vim /etc/salt/master timeout: ...
 - 自动化运维工具Ansible详细部署 (转载)
		
自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...
 - 自动化运维工具之ansible
		
自动化运维工具之ansible 一,ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...
 - 七天学会 SALT STACK 自动化运维 (1)
		
七天学会 SALT STACK 自动化运维 (1) 简单理解 SALTSTACK 安装与配置 基本的使用方法 结束语 引用资源 简单理解 SALT STACK 笔者是初次接触 自动化运维 这一技术领域 ...
 - 自动化运维工具Ansible详细部署
		
本文来源:http://sofar.blog.51cto.com/353572/1579894/ 前言 一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方 ...
 - Ansible_自动化运维《Ansible之初识-1》
		
1.Ansible简介 1.1 Ansible介绍 Ansible 是一个简单的自动化运维管理工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...
 
随机推荐
- [转载] 常用 Java 静态代码分析工具的分析与比较
			
转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...
 - 【python】python的正则表达式 re
			
ps:本文摘自互联网,觉得结构很好,讲的也很清晰.记下,备查. 延伸阅读:python的 内建函数 和 subprocess .此文是本系列的第三篇文章了,和之前一样,内容出自官方文档,但是会有自己的 ...
 - riot.js教程【五】标签嵌套、命名元素、事件、标签条件
			
前文回顾 riot.js教程[四]Mixins.HTML内嵌表达式 riot.js教程[三]访问DOM元素.使用jquery.mount输入参数.riotjs标签的生命周期: riot.js教程[二] ...
 - pyqt5实现打开子窗口
			
# -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * class Fi ...
 - Drools文档(八) 规则语言参考
			
规则语言参考 概述 Drools有一个"本地"的规则语言.这种格式在标点符号上非常轻,并且通过"扩展器"支持自然语言和领域特定的语言,使语言能够变形到您的问题领 ...
 - html5开发学习 html5自学需要怎么学
			
记得很多大鳄都说过一句话:只要站在风口上,猪都能飞起来.而对于如今的IT技术领域来说,无疑这只幸运的"猪"非html5莫属.html5开发技术在16年迎来了一个飞跃的发展,这也让很 ...
 - python学习笔记 函数
			
形式: def function(a,b,c=0,*args,**kw)#a,b必选参数,*args可变参数,**kw关键字参数 1.函数的返回值可以是多个参数.多个参数时,实际上返回的是一个tupl ...
 - 安卓自定义控件(五)触控基础MotionEvent
			
之前去面试,人家说,我这个事件拦截机制写得太少了,还有一个MotionEvent没写,这个确实也很重要,后来我考虑了一下,决定将这篇文章放到自己定义控件里. 先简单再提一下事件分发,事件分发和拦截主要 ...
 - head first python菜鸟学习笔记(第三章)
			
1.os.chdir()切换到指定目录下,os.getcwd(),得到当前目录. >>> import os>>> os.chdir('D:\\CodeDocume ...
 - Python之文件的基本操作
			
在python中,对文件的基本操作一共有如下四种: 1.打开文件 file_obj = open("文件路径","模式") 常用的打开文件模式有: r:以只读方 ...