简介

Chef

Chef
提供了一套自动化安装和陈设软件的工具。它同意开荒者以模块化的法子(cookbook)来定义软件的安装和配置流程(recipe),以及流程中的可定制参数(attribute)。当要求在一定的条件中制造软件服务时,用户钦赐模块名称以及相应的参数值,Chef
会担当在目的情状中试行预约义的设置和陈设流程。

动用 Chef 供给安装 Chef Server 以及 Chef Development Kit(ChefDK)。Chef
Server
负担保存开荒者提供的软件设置和配置流程定义,并在对象机器上实行。ChefDK
则是开辟者用来定义软件设置和计划流程的工具。

Mariadb Galera Cluster

Mariadb Galera Cluster 是 Mariadb
提供的一种共同多主节点的集群方式。这种情势与历史观的 Maraidb Replication
功用的区分首要在于:

  • Galera Cluster 中的全数节点都在提供数据库服务。而 Replication
    情势下只有多少个主节点在提供数据库服务,其他的 Slave
    节点就算与主节点进行多少同步,但在其成为主节点从前并不提供数据库服务。
  • Galera Cluster
    下的数据库操作都是一起的,也正是当三个事情甘休时,全部节点上都曾经富含了这一事务所做的退换。换言之,在另外贰个时时,集群中各种节点上的数额都以同步的。而在价值观的
    Replication
    方式下,主从节点的多少同步是单独于修改数据的事体,同步平常存在必然的时间推迟。

在 Chef Workstation 上创设了二个 cookbook
之后,大家实行以下命令来进展测试:

cookbook 概述

Chef 意为“厨房”,我们要做“菜”,自然须求有“美食指南”。事实上在 Chef
中散发到各服务器节点的不是“菜”,而是“美食指南”,服务器自个儿“做菜”,本身管理本身。

Cookbook 规定了在 Chef
中实践的操作顺序,决定了动用的创设步骤。能够从商场中搜索二个cookbook,市集地址:
使用如下命令:

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
内或者带有的目录及效果与利益参见文书档案:

接下去,大家创制二个布署 nginx 的 cookbook,在此地以 tengine 为例:

配备谋算

企图工作任重先生而道远归纳:

  • 忧盛危明至少三台机械并设置 奥迪Q5HEL(Red
    Hat Enterprise
    Linux)操作系统。这里的机械能够是物理机也得以是设想机。本文所选择的
    翼虎HEL 版本为 7.0,若选用 6.x
    及以下版本,所使用的指令会略有差异。能够到Redhat
    官网下载安装介质。
  • 下载 Mariadb Galera Cluster 的装置介质。推荐使用 Mariadb10.1
    以上的本子,因为从这一本子开首,Galera Cluster 已经被含有在 Mariadb
    Server
    的安装介质中,而在原先的本子中则是作为单身的设置包下载的。能够从Mariadb
    官网下载。
  • 在一台机器上安装 Chef Server 以及 ChefDK,提议选用 Chef Server 12.6
    和 ChefDK 0.14 及以上版本,安装介质能够从Chef
    官网下载。
  • 在 Chef Server 所在的机械上配置 yum 源以及 HTTP
    Server。那重大是针对性在不恐怕访谈 Internet 的情况下,能运用协和设立的
    yum 源方便的装置软件。HTTP Server 可以使用 GL450HEL 自带的 Apache HTTP
    Server,或任何同类软件。
chef-client --local-mode --override-runlist first_cookbook

Ironfan介绍

在Serengeti中,有二个最首要最要紧的效果:一是虚构机管理,即在vCenter中为贰个Hadoop集群创设和管理所要求的虚构机;另一个是集群软件设置配备管理,即在已设置好操作系统的虚构机上安装Hadoop相关组件(包含Zookeeper,Hadoop,Hive,Pig等),更新配备文件(举个例子Namenode/Jobtracker/Zookeeper结点的IP等音信),然后运行Hadoop服务。Ironfan就是在Serengeti中顶住集群软件设置配备处理的机件。

Ironfan是依附Chef本领开采的集群软件陈设布置管理工科具。Chef是三个临近于Puppet和CFEngine的开源的系统铺排管理工科具,它定义了一套轻便易用的DSL(Domain
Specific
language)语言用于在一台已安装好宗旨操作系统的机器上设置配备任性软件和配置体系本人。Ironfan基于Chef的框架和API提供了大致易用的自动化布置和治本集群的命令行工具。Ironfan协理安插Zookeeper,Hadoop和HBase集群,也能够编写新的cookbook以布置任性其余非Hadoop集群。

Ironfan最初由美利坚合众国一家Big
Data初创公司Infochimps使用Ruby语言开采,并在github.com上以Apache
Licensev2开源。最开首Ironfan只帮忙在亚马逊EC2的Ubuntu设想机上安插Hadoop集群。VMwareProject Serengeti团队精选了依靠Ironfan来开荒Big
Data集群众工作具,并贯彻了一多级重大革新,让Ironfan可以在VMware
vCenter中的CentOS 5.x虚构机上创建布局Hadoop集群。ProjectSerengeti立异后的Ironfan一样以Apache License v2在github.com上开源,供用户无需付费下载和改造。

第一个 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
会思念到这点,这里不详细张开,能够参谋文书档案:

设置完依赖后,就供给下载 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
文件的开始和结果能够自己去定义,也能够参见如下概念(来自
):

#!/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
的管住,参见:

同样地,使用 Chef 内置的语法来治本
service,可避防除平台差距,何况可以支撑越多的逻辑判别操作,对服务的管制更加灵活。

现行反革命就归纳的姣好了三个 cookbook,将来来测量检验一下运转结果,在 chef-repo
文件夹下运营:

chef-client --local-mode --override-runlist first_cookbook

能够看到一群命令输出,若有报错会中止!

一声令下甘休后,验证:

service nginx status
Tengine(nginx) pid 23776 running!!

自动化运维,配置管理中的应用。能够见到,已经打响选用 cookbook 计划运营了 nginx。

机动安装流程

本文所描述的机关安装流程的靶子是在至少两台机器上安装 Mariadb Galera
Cluster,首要含有如下多少个步骤:

  1. 增多 Chef Server 上提供的 yum 源并安装 Mariadb。
  2. 敞开 Cluster
    节点之间的互相通讯,首如果在操作系统上配置域名深入分析以及开放相应的防火墙端口。
  3. 开启 Galera Cluster。
  4. 修改操作系统上的 Mariadb 服务运转情势。注意即使 Galera Cluster
    里全体节点都足以何况提供数据库服务,但依据它们被投入 Cluster
    的时光各类,第一个节点的开发银行格局和别的节点有所不一致。

那就要本机实践 cookbook,现在来将 first_cookbook 分发到节点上。

Ironfan架构

下图描绘了Ironfan的架构。Ironfan首要总结Cluster
OrchestrationEngine,VM Provision Engine,SoftwareProvision
Engine和用于存款和储蓄数据的Chef Server 和Package Server。

·ClusterOrchestration Engine:Ironfan的总调控器,肩负加载深入分析集群概念文件,成立虚构机,在ChefServer中保存集群的布署音信,并调用Chef
REST API为各样设想机创制对应的ChefNode和Chef Client,
并设定各样虚构机的ChefRole。

·VMProvision Engine:创立cluster中的全部虚构机,并等候虚构机获得IP。VM Provision
Engine提供了接口以支撑在各个设想机云际遇中开创虚构机,这几天兑现了亚马逊(Amazon) EC2和VMware
vCenter的支撑。在Serengeti中,全体虚构机由Ironfan的调用者在VMware vCenter中开创,并将IP保存在cluster spec文件中,传递给Ironfan的VM Provision Engine。

·SoftwareProvision Engine: 使用设想机中先行成立好的缺省用户名和密码,SSH远程登陆到独具设想机中而且开动chef-client来安装软件。chef-client是Chef框架中的代理程序,负担在其运营的结点上施行预先由Chef
Role内定的设置配置脚本。chef-client也会将施行进程数据保存在Chef
Server中。

·ChefServer:用于存款和储蓄Chef  Nodes,Chef Clients, Chef Roles, Chef
库克books, 提供Chef RESTAPI, 是Chef框架的机要组成都部队件。

·PackageServer:用于存储所需的Hadoop和别的Hadoop所注重的安装包。

Ironfan对外提供了Knife CLI命令行接口,其调用者即SerengetiWeb Service 组件)创制单独进程调用Knife
CLI,通过进程退出状态值判断成功也许战败。具体的集群结点数据和实施进程音讯由调用者随时从ChefServer获取。

澳门金沙国际 1

不足

大家简要的创设了叁个 nginx 的
cookbook,况且在配置后兑现了劳动的全自动运维。然则再三在切切实实中会有例外的布署,轻便的选拔默许配置当然无法知足需要。那时,cookbook
中的 templateattributes
就派上用场了。下篇小说会动用模板变量结合自然的逻辑,来促成各类化的安顿管理必要。

-EOF-

详见完毕

率先创立三个名称叫 mariadb-galera-cluster 的 cookbook 和名字为 test.json 的
environment 文件,如清单 1 所示。创设 cookbook
会在当前目录下生成三个同名的目录,后续定义的大部文书都位居这些目录下。environment
文件将含有全数针对当下条件的参数值,比如当前情形下节点的 IP
地址和域名。创制落成后的目录结构如清单 2 所示。

上传 cookbook

Chef Workstation 举行 cookbook 的编纂测量试验之后,须求将其上传到 Chef
Server 技能散发到各种节点,奉行以下命令将 cookbook 上传:

knife cookbook upload first_cookbook

上传之后来查阅服务器的 cookbook 列表,列出 cookbook:

first_cookbook   0.1.0

能够见见 cookbook 已经打响上传,今后在服务器配置节点的运作。

IronfanKnife CLI

每三个SerengetiCLI
cluster命令都对应三个IronfanKnife CLI命令,满含create
(成立集群)、list(查看集群)、config(配置集群)、stop(甘休集群)、start(运维集群)、delete(删除集群)。

clustercreate => knife cluster create
<cluster_name>
-f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json–yes
–bootstrap

clusterlist => knife cluster show
<cluster_name>
-f/opt/serengeti/logs/task/<task_澳门金沙国际 ,id>/<step_id>/<cluster_name>.json–yes

clusterconfig => knife cluster bootstrap
<cluster_name>
-f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json–yes

clusterstop => knife cluster stop
<cluster_name>
-f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json–yes

clusterstart => knife cluster start
<cluster_name>
-f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json–yes
–bootstrap

clusterdelete => knife cluster kill
<cluster_name>
-f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json–yes

其间参数/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json是Serengeti
Web 瑟维斯传递给Ironfan的cluster
spec文件,那是八个JSON格式的文书,包括了集群的结点分组、结点个数、结点软件定义描述、集群的布署、PackageServer和享有设想机的称号和IP等音讯。Ironfan会解析cluster
spec文件,生成Ironfan所须求的cluster定义文件并保存在/opt/serengeti/tmp/.ironfan-clusters/<cluster_name>.rb。

清单 1. 创建 cookbook 和 environment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
knife cookbook create mariadb-galera-cluster
cat environments/test.json <<EOF
{
  "name": "test",
  "description": "",
  "cookbook_versions": {
 
  },
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
 
  },
  "override_attributes": {
 
  }
}
EOF

服务器前台管理

在 Chef Server
安装搭建好之后,默许不提供图形分界面的前台管理职能,若要使用前台管理大家的
cookbook 以及节点音信,供给设置 Chef Server 的前台分界面。执行安装:

chef-server-ctl install chef-manage

重新配置:

跟着安顿:

chef-manage-ctl reconfigure

Ironfancluster定义文件 (DSL, roles)

接下去,大家看看Ironfan是怎么定义集群的。下图是二个名叫demo的cluster的定义文件demo.rb,它是四个Ruby文件,用Ironfan所定义的DSL语言描述集群的结缘结构,定义了3个虚构机组。个中每二个facet定义了一个设想机组,包涵若干个安装同样软件的设想机。每一种分组中结点个数由instance钦赐,虚构机上要设置的软件由role钦定。这几个role便是Chef中所定义的role。

澳门金沙国际 2

清单 2. 目录结构

1
2
3
4
5
6
7
8
9
10
11
..
environments/
    test.json
cookbooks/
    mariadb-galera-cluster/
        recipes/
            default.rb
        templates/
            default/
        attributes/
            default.rb

管理 Run List

伸开前台,私下认可启用 ssl,所以开放了 Chef Server 的 443 端口。

打开
https://192.168.221.89,能够观看登入页面,使用管理员登入。登入后得以见到节点消息:

{% imgurl chef-tutorial-3/chef-server-manage-1.png %}

接下来来编排节点,配置节点的 Run List:

找到节点配置:

{% imgurl chef-tutorial-3/chef-server-manage-2.png %}

配置 Run List:

{% imgurl chef-tutorial-3/chef-server-manage-3.png %}

将大家的 cookbook 从 Avaliable Recipes 拖到 Current Run List 内。

在 Chef Workstation 中实行命令:

knife ssh chef-client.geekrainy.local 'chef-client' -m -x root -P passowrd

能够见见输出:

[root@chef-dk chef-repo]# knife ssh chef-client.geekrainy.local 'chef-client' -m -x root -P 940911
chef-client.geekrainy.local Starting Chef Client, version 13.6.4
chef-client.geekrainy.local resolving cookbooks for run list: ["first_cookbook"]
chef-client.geekrainy.local Synchronizing Cookbooks:
chef-client.geekrainy.local   - first_cookbook (0.1.0)
chef-client.geekrainy.local Installing Cookbook Gems:
chef-client.geekrainy.local Compiling Cookbooks...
chef-client.geekrainy.local Converging 7 resources
chef-client.geekrainy.local Recipe: first_cookbook::default
chef-client.geekrainy.local   * file[/root/test.txt] action create
chef-client.geekrainy.local     - create new file /root/test.txt
chef-client.geekrainy.local     - update content in file /root/test.txt from none to 48a12b
chef-client.geekrainy.local     --- /root/test.txt  2017-12-27 17:33:34.259758283 +0800
chef-client.geekrainy.local     +++ /root/.chef-test20171227-8105-1u3f11.txt    2017-12-27 17:33:34.258758279 +0800
chef-client.geekrainy.local     @@ -1 +1,2 @@
chef-client.geekrainy.local     +This file was created by Chef!
chef-client.geekrainy.local     - restore selinux security context
chef-client.geekrainy.local   * yum_package[pcre-devel] action install
chef-client.geekrainy.local     - install version 8.32-17.el7 of package pcre-devel
chef-client.geekrainy.local   * yum_package[openssl] action install (up to date)
chef-client.geekrainy.local   * yum_package[openssl-devel] action install
chef-client.geekrainy.local     - install version 1.0.2k-8.el7 of package openssl-devel
chef-client.geekrainy.local   * cookbook_file[/etc/init.d/nginx] action create
chef-client.geekrainy.local     - create new file /etc/init.d/nginx
chef-client.geekrainy.local     - update content in file /etc/init.d/nginx from none to 0bc460
chef-client.geekrainy.local     --- /etc/init.d/nginx   2017-12-27 17:35:32.489219470 +0800
chef-client.geekrainy.local     +++ /etc/init.d/.chef-nginx20171227-8105-19448uh    2017-12-27 17:35:32.488219466 +0800
chef-client.geekrainy.local     @@ -1 +1,56 @@
chef-client.geekrainy.local     +#!/bin/bash
chef-client.geekrainy.local     +#chkconfig: 345 86 16
chef-client.geekrainy.local     +start(){
chef-client.geekrainy.local     +if [ -f /var/lock/subsys/tengine.lock ];then
chef-client.geekrainy.local     +  echo "Tengine is already running: [ FAILED ]"
chef-client.geekrainy.local     +else
chef-client.geekrainy.local     +  if /usr/local/nginx/sbin/nginx ;then
chef-client.geekrainy.local     +    echo "Starting tengine: [ OK ]" 
chef-client.geekrainy.local     +    touch /var/lock/subsys/tengine.lock
chef-client.geekrainy.local     +  else
chef-client.geekrainy.local     +    echo "Starting tengine: [ FAILED ]"
chef-client.geekrainy.local     +  fi
chef-client.geekrainy.local     +fi
chef-client.geekrainy.local     +}
chef-client.geekrainy.local     +stop(){
chef-client.geekrainy.local     +if [ -f /var/lock/subsys/tengine.lock  ];then
chef-client.geekrainy.local     + if /usr/local/nginx/sbin/nginx -s quit ;then
chef-client.geekrainy.local     +   echo "Stopping tengine: [ OK ]"
chef-client.geekrainy.local     +   rm -rf /var/lock/subsys/tengine.lock
chef-client.geekrainy.local     + else
chef-client.geekrainy.local     +   echo "Stopping tengine: [ FAILED ]"
chef-client.geekrainy.local     + fi
chef-client.geekrainy.local     +else
chef-client.geekrainy.local     + echo "Tengine not runing: [ FAILED ]"
chef-client.geekrainy.local     +fi
chef-client.geekrainy.local     +}
chef-client.geekrainy.local     +reload(){
chef-client.geekrainy.local     +if /usr/local/nginx/sbin/nginx -s reload ;then
chef-client.geekrainy.local     +  echo "Reload tengine: [ OK ]"
chef-client.geekrainy.local     +else
chef-client.geekrainy.local     +  echo "Reload tengine: [ FAILED ]"
chef-client.geekrainy.local     +fi
chef-client.geekrainy.local     +}
chef-client.geekrainy.local     +case $1 in
chef-client.geekrainy.local     +"start")
chef-client.geekrainy.local     + start
chef-client.geekrainy.local     +;;
chef-client.geekrainy.local     +"stop")
chef-client.geekrainy.local     + stop
chef-client.geekrainy.local     +;;
chef-client.geekrainy.local     +"restart")
chef-client.geekrainy.local     + stop
chef-client.geekrainy.local     + sleep 1
chef-client.geekrainy.local     + start
chef-client.geekrainy.local     +;;
chef-client.geekrainy.local     +"reload")
chef-client.geekrainy.local     + reload
chef-client.geekrainy.local     +;;
chef-client.geekrainy.local     +"status")
chef-client.geekrainy.local     + s=`pidof -s nginx`
chef-client.geekrainy.local     + [ "$s" ] && echo "Tengine(nginx) pid $s running!!" || echo "Tengine(nginx) not runging!"
chef-client.geekrainy.local     +;;
chef-client.geekrainy.local     +*)
chef-client.geekrainy.local     +echo "usage: $0 start|stop|restart|reload|status"
chef-client.geekrainy.local     +esac
chef-client.geekrainy.local     - change mode from '' to '0755'
chef-client.geekrainy.local     - change owner from '' to 'root'
chef-client.geekrainy.local     - change group from '' to 'root'
chef-client.geekrainy.local     - restore selinux security context
chef-client.geekrainy.local   * script[install_tengine] action run
chef-client.geekrainy.local     - execute "bash"  "/tmp/chef-script20171227-8105-irvw5g"
chef-client.geekrainy.local   * service[nginx] action start
chef-client.geekrainy.local     - start service service[nginx]
chef-client.geekrainy.local 
chef-client.geekrainy.local Running handlers:
chef-client.geekrainy.local Running handlers complete
chef-client.geekrainy.local Chef Client finished, 6/7 resources updated in 03 minutes 21 seconds

实施到位就可以创制作而成功,在 Chef Client 中实践验证:

service nginx status

来看输出:

Tengine(nginx) pid 23776 running!!

证实已经布置成功。

Chef Roles和 Cookbooks

在Serengeti中持有Chef Role文件寄存于/opt/serengeti/cookbooks/roles/*.rb,所有

Chef Cookbook 文件寄存于/opt/serengeti/cookbooks/cookbooks/

以hadoop_namenode
role为例,/opt/serengeti/cookbooks/roles/hadoop_namenode.rb
内容如下:

name ‘hadoop_namenode’

description ‘runs a namenode infully-distributed mode. There should be
exactly one of these per cluster.’

run_list %w[

  role[hadoop]   # 贰个role能够分包引用另三个role

  hadoop_cluster::namenode   # hadoop_cluster 是三个cookbook, namenode是此cookbook中的三个recipe

]

只要开垦者必要修改调试 role和cookbook,可在更改role和cookbook
文件后,运转以下命令上传role和cookbook:

knife role from
file/opt/serengeti/cookbooks/roles/<role_name>.rb –V

knifecookbook upload
<cookbook_name> -V

安装 Mariadb

应用在 Chef Server 机器上配备的 yum 源来安装
Mariadb,供给在对象机器的/etc/yum.repos.d
目录下进入相应的安顿文件。将该配置文件的内容预先定义在
mariadb-galera-cluster/templates/default/chef_server.repo.erb
中,如清单 2 所示。同不时候,在 mariadb-galera-cluster/recipes/default.rb
中定义这一有些的安装流程,如清单 3 所示。配置好 yum 源后,即可通过 yum
命令安装预先下载好的 Mariadb 安装介质。

设置到位后,能够实行一些主干的数据库先河化职务,比如设置 root
用户的密码和权力,那一个职务能够定义在二个 sql
文件中。另外也得以经过编辑/etc/my.cnf 对 Mariadb
举办一些骨干的布置。全部到位后重启 Mariadb 的劳动。

命令行运行

除开在 Chef Server 前台管理外,还可在 Chef Workstation
内使用命令行来保管 Run List。

查看 Node 的状态:

[root@chef-dk chef-repo]# knife node show chef-client.geekrainy.local
Node Name:   chef-client.geekrainy.local
Environment: _default
FQDN:        chef-client.geekrainy.local
IP:          192.168.221.91
Run List:    
Roles:       
Recipes:     first_cookbook, first_cookbook::default
Platform:    centos 7.3.1611
Tags:        

此间看到 Run List 为空,接下去将大家的 cookbook 增多到 Run
List,大家定义了默许的 Recipes: default,由此增加 cookbook
实际上实践的正是 cookbook 中的 default recipes。

[root@chef-dk chef-repo]# knife node run_list add chef-client.geekrainy.local recipe[first_cookbook]
chef-client.geekrainy.local:
  run_list: recipe[first_cookbook]

重复翻开景况:

[root@chef-dk chef-repo]# knife node show chef-client.geekrainy.local
Node Name:   chef-client.geekrainy.local
Environment: _default
FQDN:        chef-client.geekrainy.local
IP:          192.168.221.91
Run List:    recipe[first_cookbook]
Roles:       
Recipes:     first_cookbook, first_cookbook::default
Platform:    centos 7.3.1611
Tags:        

就马到功成增多了七个 Run List。

Cluster Service Discovery

在集群安排进度之中,有个别组件的安装和劳动的运行顺序是井然有序注重的,比如Datanode服务须求在Namenode服务运转将来再开发银行,Tasktracker服务要求在Jobtracker服务运营之后再起步,何况这个劳动普通不在同二个设想机上。由此Ironfan在配备进程中须求调控不一致结点上服务的设置和开发银行顺序,让有依附关系的结点同步。Ironfan是使用一个名叫cluster_service_discovery的cookbook实现相关结点之间联合。

cluster_service_discoverycookbook定义了provide_service,provider_fqdn,provider_fqdn_for_role,all_providers_for_service等等方式,用于落到实处结点同步。大家以datanode服务必要拭目以俟namenode服务运维为例讲明怎么样促成联机:

·在namenoderecipe中,运转namenode服务之后,调用provide_service(node[:hadoop][:namenode_service_name]),向Chef
Server把此结点注册为namenode 服务的提供者;

·在datanoderecipe中,运维datanode服务在此以前,调用provider_fqdn(node[:hadoop][:namenode_service_name])向Chef
Server查询namenode服务提供者的FQDN(或IP);
provider_fqdn方法会每隔5秒种向Chef
Server查询一回,直到询问到结果,恐怕30分钟后超时报错。

别的相关结点的联手也与此机制相似,举个例子Zookeeper结点之间的交互等待,HBase结点等待Zookeeper结点,具体方法调用可查阅cluster_service_discovery,zookeeper,hadoop, 和hbase cookbook的源代码。

关于vSphere
Big Data Extensions:

VMware
vSphere Big Data Extensions简称BDE)基于vSphere平台扶助大数量和Apache
Hadoop作业。BDE以开源Serengeti项目为底蕴,为公司级用户提供一密密麻麻整合的管理工科具,通过在vSphere上虚构化Apache
Hadoop,帮忙用户在基础设备上贯彻灵活、弹性、安全和高速的大数量陈设、运营和处理专门的工作。明白越来越多关于VMware
vSphere Big Data Extensions的音信,请参见

小编介绍

澳门金沙国际 3

胡辉 (Jesse Hu)

VMware高档开辟技术员

担负VMware大数据产品vSphere
BDE和Serengeti开源项指标技能首领之一,是Serengeti开源项目最开始时期的开荒者,并促成了第贰个原型系统,是Serengeti集群软件安装配置管理模块Ironfan的设计者。在加盟VMware以前,曾就职于Yahoo,IBM,Oracle等多家IT公司,对开源社区,云计算,
Mobile, SNS, Web 2.0, Ruby都有打探和钻研。

介 绍 在 Serengeti中,有一个最要紧最关 键
的作用:一是设想机管理,即在
vCenter中为多少个Hadoop集群创设和管理所须求的虚构机;另一…

清单 3. templates/default/chef_server.repo.erb,定义 yum 配置

1
2
3
4
5
6
[chef_server_repo]
name=chef_server_repo
baseurl=http://chefserver:80/yum_repo
enabled=1
gpgcheck=0
sslverify=0

编写 node 配置文件

通过编写制定 node 配置文件,也足以编写制定 Run List。

knife node edit chef-client.geekrainy.local

实践后恐怕报错:

ERROR: You must set your EDITOR environment variable or configure your
editor via knife.rb

配置情状变量能够消除:

export "EDITOR=vim"

再也实践后能够编写 JSON 格式的节点新闻:

{
  "name": "chef-client.geekrainy.local",
  "chef_environment": "_default",
  "normal": {
    "tags": [

    ]
  },
  "policy_name": null,
  "policy_group": null,
  "run_list": [
  "recipe[first_cookbook]"
]

}

至于 Knife 和 Run List 的更加的多音信方可参见:

  • Run List:
  • Knife

清单 4. recipes/default.rb,安装 Mariadb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template "/etc/yum.repos.d" do
        source "chef_server.repo.erb"
        owner 'root'
        mode 0755
        action :create
end
 
...
execute "Install Mariadb" do
        command "yum clean metadata && yum -y install mariadb-server"
end
...
bash "Config database settings..." do
        cwd "#{CWD}"
        user "root"
        group "root"
        code <<-EOF
       printf "\n[mysqld]\nlower_case_table_names=1" >> /etc/my.cnf
        systemctl enable mariadb.service
        systemctl start mariadb.service
        mysql < init.sql
        systemctl restart mariadb.service
        EOF
end

扩展

上文介绍了通过 Chef Server 的前台分界面和命令行对节点的 Run List
举办管理,而且能够成功实行大家的
“烹饪”操作,但那三种格局皆有好些个不便之处。用前台分界面管理就算直观但管理越来越多节点时功效低,命令行也显得繁琐而且轻便开始展览误操作。在施行
kinfe bootstrap 的长河中,也能够用编辑好的 json 文件实行节点的发轫化:

knife bootstrap localhost -p 2200 -N ubuntu-12.04 -r 'role[group1]' --ssh-user vagrant --sudo --bootstrap-vault-file sea-power-bootstrap-vault-file.json

上述为官方网址示例,在 json 中去定义和编排,是一种较为可信赖的概念节点的方式。

到那边,就大约的到位了从创设节点,到开创
cookbook,到测量试验公布的经过。不过,这里的演示存在好多相差,不抱有较强的普适性,增加和保管都很拮据。接下来将配置一个较为完善的
cookbook,来讨论一些相比优雅的实践方法。

-EOF-

开启 Cluster 节点的交互通信

要使得 Mariadb Galera Cluster
的节点能够进行数量同步,各节点之间必须能够相互通信。那要求各节点能够深入分析互相的域名并能访谈相应的网络端口。因为
cluster 中节点的域名和 IP 地址是因现实意况而异的,因而将那些音讯定义在
environment 文件里。

清单 5. environments/test.json,定义 cluster 成员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "name": "test",
  "description": "",
  "cookbook_versions": {
    },
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
    "mariadb-galera-cluster": {
        "cluster": {
                "members": {
                        "nodeA": "10.0.0.11",
                        "nodeB": "10.0.0.12"
                },
                "master": "nodeA"
        }
}
}

清单 6. recipes/default.rb,域名解析和开启端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
node['mariadbp4']['cluster']['members'].each_pair do |name, ip|
        bash "Resolve #{name} to #{ip}." do
                user "root"
                group "root"
                code <<-EOF
                name=#{name}
                echo "#{ip} ${name%%.*} $name" >> /etc/hosts
                EOF
                not_if "[ #{name} == `hostname -s` ]"
        end
end
 
bash "Open ports on OS firewall"
    user "root"
    group "root"
    code <<-EOF
    firewall-cmd --zone=public --add-service=mariadb --permanent
    firewall-cmd --zone=public --add-port=3306/tcp --permanent
    firewall-cmd --zone=public --add-port=4567/tcp --permanent
    firewall-cmd --zone=public --add-port=4568/tcp --permanent
    firewall-cmd --zone=public --add-port=4444/tcp --permanent
    firewall-cmd --zone=public --add-port=4567/udp --permanent
    firewall-cmd --reload
     EOF
end

配置 Mariadb Galera Cluster

在 Mariadb 中打开 Galera Cluster
须求修改相应的布局文件,日常是/etc/my.cnf.d/server.cnf。这里将所需安顿优先定义为
template,然后用它覆盖原本的配置文件,如清单 7、清单 8 所示。

清单 7. templates/default/server.cnf.erb,Mariadb 配置文件

1
2
3
4
5
6
7
8
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://<%= @node.mariadbp4.cluster.members.keys.join(',') %>
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

清单 8. recipes/default.rb,修改 Mariadb 配置文件

1
2
3
4
5
6
7
template "/etc/my.cnf.d/server.cnf" do
        source "server.cnf.erb"
        owner "root"
        mode 0644
        action :create
        not_if "grep '^wsrep_on=ON' /etc/my.cnf.d/server.cnf"
end

修改操作系统服务

在 TucsonHEL7 的中,操作系统服务是通过 systemd 来保管的,因为 Mariadb Galera
Cluster 需求修改启动 Mariadb 时的参数,因而要求对 systemd 运行 Mariadb
时所利用的授命举办改动。因为 Mariadb Galera Cluster
对第二个运转的节点(又叫做 master
节点)必要动用一定的起步命令,由此这里计划两份 systemd
的计划文件,如清单 9、清单 10 所示。在 recipe 中,首先推断当前节点是或不是master 节点,然后用相应的布置文件作为当下节点的 systemd 的 玛丽亚db
服务运行配置文件。最终重启 Mariadb 服务。

清单 9. templates/default/systemd.master.conf.erb,master 节点的配置文件

1
2
3
[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --wsrep-new-cluster

清单 10. templates/default/systemd.master.conf.erb,slave 节点的布置文件

1
2
3
[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --wsrep_cluster_address=gcomm://<%= node.mariadbp4.cluster.master =%>

清单 11. recipes/default.rb,修改 systemd 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
master=node['mariadbp4']['cluster']['master']
bash "Add cluster conf for mariadb service in systemd and restart service..." do
        cwd "/etc/systemd/system"
        user "root"
        code <<-EOF
        if [ ! -d "$service_name.d" ]; then
                mkdir "mariadb.service.d"
        fi
 
        if [ `hostname -s` == #{master} ]; then
                mv /tmp/master.conf mariadb.service.d/cluster.conf
        else
                mv /tmp/slave.conf mariadb.service.d/cluster.conf
        fi
        systemctl daemon-reload
        systemctl restart $service_name
        EOF
        not_if "[[ -f mysql.service.d/cluster.conf || -f mariadb.service.d/cluster.conf ]]"
end

安装

率先将上边所定义计划流程上传出 Chef Server,满含 cookbook 和
environment。然后告诉 Chef Server 在指标机器上实践相应的配置流程,如清单
12 所示。这里 10.0.0.11 和 10.0.0.12 为组合 Cluster 的两台机械的
IP,注意推行命令时请确认保证当前目录为 mariadb-galera-cluster 的上面目录,

清单 12. 装置 Mariadb Galera Cluster 所需命令

1
2
3
4
knife cookbook upload -a -o .
knife environment from file environments/test.json
knife bootstrap 10.0.0.11 -x root -P password -r "recipe[mariadb-galera-cluster]" -E test
knife bootstrap 10.0.0.12 -x root -P password -r "recipe[mariadb-galera-cluster]" -E test

验证

要证实 玛丽亚db Galera Cluster 的运维情状,能够透过推行如清单 13
所示的授命来落到实处。如果一切不荒谬,能够看看如图 1 所示的结果。

清单 13. 翻看 Mariadb Galera Cluster 的周转意况

1
2
mysql --user=root --password=xxx
show status like 'wsrep_%'

图 1. Mariadb Galera Cluster 的运市场价格况

澳门金沙国际 4

小结

在店堂级的利用中,数据库的高可用性是不可缺少的,而 Mariadb Galera
Cluster 作为 Mariadb 自带的 Cluster
作用,从效能上能够满足用户的这一需求。而本文所描述的自动化布置步骤,能够极快的支持用户在多少个节点上配备
Mariadb Galera Cluster,相当的大的节约了创办 Mariadb Galera Cluster
所需的日子。

参考财富

  • Chef 官网:介绍了 Chef
    的功效、使用方法和 API。
  • 玛丽亚db
    官方网站:周详介绍了
    Galera Cluster,并提供下载。
  • Yum
    介绍:介绍了怎么着安插yum 源。
  • Systemd
    官网:介绍了
    systemd 是何许被用来处理操作系统的。
  • Firewalld 官网:介绍了怎么利用
    firewalld 配置防火墙。

正文永世更新链接地址:http://www.linuxidc.com/Linux/2016-12/137786.htm

澳门金沙国际 5

相关文章