🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名(剩余11个优惠名额) →

自动化配置服务器 — 配置管理系统( Configuration Management System )

在计划 Drupal 从头到尾这个系列课程的时候,我觉得我们的问题是,不仅仅是要把东西做出来,怎么去做,用什么方法,这个流程对不对,能不能简化,自动化,团队化,这些也非常重要。首先我想的是,能不能找一种自动化的方法,去在本地配置一个开发 Drupal 的环境,并且直接就把 Drupal 安装好了,甚至可以自动去安装一些常用的模块。

我经常跟大伙说,您要在本地电脑上,用虚拟机手工去搭建一个开发环境,这个虚拟机用 Vagrant 去管理。按照 Web 开发环境这个学习手册,你应该可以做到手工去搭建这个环境。我推荐先亲自动手去搭建这个环境,是因为,您需要了解自己都做了什么,每一个步骤是什么意思,熟悉在命令行界面下工作。这些都了解了以后 ,我们就要用一种自动化的方式去做这些事了,重复的工作一点也不美。

学过 Shell 的朋友,会觉得自动化搭建一个环境,简直是小菜,写一些 Shell 代码,然后让服务器去执行就行了。用过阿里云的朋友,也会有印象,他们提供了一键安装环境的小工具,那应该就是用 Shell 写的。Shell 当然很厉害,不过对于一般的用户,是不太友好的,您可能先要去学习这门语言。一个简单的 Shell 程序,也可以是我们平时操纵服务器执行的命令的列表,把它们放到一个 Shell 文件里,然后去执行它。

继续寻找解决方案,应该就会遇见配置管理系统(Configuration Management System),以后简称为 CM。一般就是,您在自己电脑上,按照 CM 提供的方式,去创建一些脚本,也就是用特定的方法去描述一下配置环境的整个过程。这些脚本就像是剧本,把它交给服务器,服务器会按照剧本的要求,调出不同的演员(包管理工具,用户,文件 ... ),去完成你写的剧本。

可以选择的 CM 工具有挺多的,Chef,Puppet,Salt,Ansible ...  我有个习惯,如果一个工具有多个选择,我开始又不知道到底哪个适合我,我会去对比这些工具的官方网站,还有他们写的文档。看网站的设计,大概就能猜到,Chef 跟 Puppet 一定是老牌的工具,从它们的网站设计的风格可以看出来。Salt 跟 Ansible 的官方网站比较现代,所以应该比较新。从直觉上,我想我应该选择 Salt 或者 Ansible,我觉得它们应该是我喜欢的工具。不过早就听过 Chef 的大名,所以,就先试了一下它,没能成。后来又试了下 Ansible ,觉得这个是我想要的 。

Chef

这些 CM ,有些会要求你把剧本上传到一个中央配置服务器,再由这台服务器去分配让哪一种服务器去演出你写好的剧本,同样, 你修改了剧本以后,配置服务器也会收到,然后再去分配让某些服务器去执行修改之后的剧本。Chef 用的就是这种方法,它的剧本叫 Cookbooks(烹饪书),剧本里的不同情节叫 Recipes(配方),这些 Recipes 就是配置你的服务器的一些步骤。挺形象,因为 Chef 就是大厨的意思。

Chef 也有不需要中央配置服务器的,叫 Chef Solo ,就是把写好的剧本,直接放到服务器上去执行。不管怎么样,Chef 都要求你必须在要配置的服务器上安装 Chef 的客户端软件。Chef 是 Ruby 写的,所以你要安装 Ruby,然后用 gem 去安装 Chef。

例子

来看一个简单的 Chef 的配方,在服务器上创建一个文件,文件里的内容是一句问候语。把下面的内容放到一个叫 hello.rb 的文件里:

file "#{ENV['HOME']}/example.txt" do
  action :create
  content "您好 #{ENV['USER']}!"
end

学过 Ruby 语言的朋友一看就知道,上面是一段 Ruby 代码。最开始的 file ,在 Chef 里面叫做资源,file 就是跟文件相关的资源,后面的 #{ENV['HOME']} ,表示当前登录用户的主目录,example.txt 是要处理的文件的名字。具体要做的事,是在 do 与 end 之间,action :create ,表示我要去创建一个文件,文件里的内容就是在 content 后面的东西。

执行它:

chef-apply hello.rb

返回:

Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * file[/home/vagrant/example.txt] action create
    - create new file /home/vagrant/example.txt
    - update content in file /home/vagrant/example.txt from none to b4b23f
    --- /home/vagrant/example.txt	2015-02-27 02:20:26.630982470 +0000
    +++ /home/vagrant/.example.txt20150227-2366-1hx9lnp	2015-02-27 02:20:26.630982470 +0000
    @@ -1 +1,2 @@
    +您好 vagrant!
    - restore selinux security context

结果:

在当前登录的用户的主目录下,会有一个文件叫 example.txt,因为我当前登录到系统上的用户的名字是 vagrant,所以文件里的内容是:“ 您好 vagrant! ” 。

再看一个 Chef 的 Recipe,比如我们要去安装一个包叫 Vim ,这个配方看起来像这样:

package "vim" do 
  action :install
  package_name "vim"
end

上面的 package ,就是要使用的资源的名字,package 这个资源就是跟软件包相关的,action 是 :install,表示我们要去安装一个包,要安装的这个包的名字是 vim 。这个 package 有点像是一个抽象层,Chef 会根据运行的操作系统的类型,去使用不同的包管理工具来安装 vim 这个包,比如在 Ubuntu 上,会用 apt,在 CentOS 上会用 yum

把上面的代码放到一个叫 vim.rb 的文件里,然后执行:

sudo chef-apply vim.rb

返回:

Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * yum_package[vim] action install

    - install version 7.4.160-1.el7 of package vim-enhanced

Ansible

Ansible 是我选择要用的 CM,它用的是一种推送方式,也就是你不需要在要配置的服务器上安装 Ansible 的客户端软件,它是用 Python 语言写的,所以只需要你的服务器上安装 Python  就行了。你写的剧本在 Ansible 这里叫 Playbooks,然后用 SSH  的方式,把剧本推送到服务器上去执行。Ansible 做的就是把你写的剧本先转换成 Python 代码,然后在服务器上执行的就是 Python 代码。对于一般的用户来说,我们不需要了解 Python,可以用一种非常友好的 YAML 格式去写这个剧本。

在剧本里,可以创建一些任务,比如我想去安装一下 nginx ,这个任务看起来像这样:

    - name: 安装 nginx
      yum: name=nginx

非常简洁!name 的后面是这个任务的名字,这里就是 “安装 nginx”。第二行,用了一个 yum,这在 Ansible 里面叫模块,不同的模块可以做不同的事情,yum 这个模块的作用就是用 yum 包管理工具去安装指定的包,这里要安装的包就是 nginx 。

如果你想在 Playbook 里面,再添加一个任务,去启动 nginx 服务,并且让这个服务可以开机自动运行,这个任务可以这样:

    - name: 启动 nginx
      service: name=nginx state=started enabled=yes

任务的名字叫 “启动 nginx”,这个任务用到了 service 这个模块,它个模块可以去启动,停止,或者启用,禁用系统的服务。name=nginx,表示我们要处理的是 nginx 这个服务, state=started,意思是要启动服务,enabled=yes,表示要开机自动运行 nginx 这个服务。

镜像与配置文件

阿里云提供了一个镜像市场,这很方便,您可以根据自己的需求,为服务器选择不同的镜像,服务器实例被创建好以后,你就已经有了一个可以运行应用的环境了。我不知道这些镜像是怎么创建的,是手工配置,然后打包成镜像的吗?如果是这样,就会有个挺大的问题,比如这个镜像怎么升级呢,如果我有 100 台服务器,要去升级它们怎么办?我觉得更好的方法是去使用一些配置管理工具,把配置写成代码,然后让服务器去执行。

不管用什么样的 CM 工具,就是先去用特定的方式写好一些配置,然后拿到服务器上去执行。这样做的好处是,你可以把这些配置的代码放到版本控制里,而且你可以批量的去控制服务器。大部分的 CM 都支持你把服务器分组,你可以很方便的去管理它们,比如去更换所有的 Web Server 的 php 的版本,或者某个特别的设置等等。

配置管理系统 Chef Ansible

评论

不知道会不会有phonegap类似hybrid app之类的课程,毕竟移动App是趋势,建议课程可以通过用户投票决定

以后咱们把网站做成 Web App。

使用drupal 做底层吗?

使用drupal 做底层吗?

嗯。后台用 Drupal 试试看。

希望老师介绍一下 服务器 网站 备份的 脚本

嗯,需要的时候咱们一块儿学一下。

剧本?不是脚本吗?

我以为是一样的东西,呵呵。

微信好友

用微信扫描二维码,
加我好友。

微信公众号

用微信扫描二维码,
订阅宁皓网公众号。

240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点