在计划 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是趋势,建议课程可以通过用户投票决定
9 年 9 个月 以前
以后咱们把网站做成 Web App。
9 年 9 个月 以前
使用drupal 做底层吗?
9 年 9 个月 以前
使用drupal 做底层吗?
9 年 9 个月 以前
嗯。后台用 Drupal 试试看。
9 年 9 个月 以前
希望老师介绍一下 服务器 网站 备份的 脚本
9 年 9 个月 以前
嗯,需要的时候咱们一块儿学一下。
9 年 9 个月 以前
剧本?不是脚本吗?
9 年 5 个月 以前
我以为是一样的东西,呵呵。
9 年 5 个月 以前