服务器管理 回归Shell

笔者接触服务器运维管理工作,至今有10年时间,经历了从数十台到数百、数千甚至上万台服务器的管理。使用过的工具,从Shell、Perl、Cfenging、Puppet到自研管理后台和各种监控备份工具等,服务器运维管理工作真的不轻松。

我们这里说的服务器管理,是包含了从硬件服务器、到操作系统、到各种软件服务器的管理。这就要求Unix系统管理员,不仅仅要深入掌握系统原理和知识,还要对各种常见的软件服务器安装、配置、安全加固、日志管理、备份恢复等都能够有所涉猎。

要做好服务器运维管理,核心是做好三个方面:可视化、可协作、自动化或半自动化。

管理1台机器

我们先来看看如何管理一台机器。

技术人员学习Unix服务器管理,都是从Shell开始。Unix的哲学是尽可能简单,每个命令只完成一件事。Unix通过管道将这些简单的命令串联起来,实现了非常强大的管理功能。

一台服务器的管理工作,大家一定都觉得很容易。是的,确实不难。SSH登录后,通过Shell命令行,所有的管理工作,包括软件安装部署、配置修改、进程启停、安全加固、备份恢复等,都可以在Shell下搞定。

通过Shell交互式命令行,一切看起来都很美好。

管理10台服务器

现在我们来管理10台服务器。

随着业务的发展,我们发现一台服务器满足不了要求,慢慢地我们有了更多的服务器。我们突然发现10台服务器的管理不像1台那样轻松了。我们需要一台台地进行登录,重复地执行各种命令,运行web的三台服务器由于是2个人搞的,还有很多差异。有点头疼?!

技术人员总是爱思考并能克服困难的。我们开始将常见的管理任务都封装成脚本,不论是Bash、Perl或Python,甚至Ruby/PHP。这有了巨大的进步,我们发现我们的各种管理任务都可以对应到一个脚本了。至少我们再要加一台机器,几个脚本一运行,就能搞定。要做数据库恢复了,运行一下脚本,搞定!

哦,感谢上帝,感谢脚本!

接下来

我们的脚本越来越多,脚本的修改变得复杂,我们不知道一台机器该运行哪个脚本了,我们忘记了某台机器上运行过什么样的脚本了,也不知道当时执行的是啥结果,特别是随着服务器增加,又有人员离职新人交接了,文档在哪里呀。感觉一团乱麻,我们觉得很头疼,怎么办?!

我们开始研究各种办法,有朋友推荐说Puppet很强大,去看看。看了2个小时,知道是个自动化的管理工具了。可是这个该怎么用,搞不懂呀搞不懂?!

打电话给Puppet专家朋友,朋友说,你需要深入学习2个星期,然后将你原来的一堆垃圾脚本扔到垃圾桶去!

配置管理工具

上面提到的Puppet就是流行的配置管理工具里的一种。

我不是否定配置管理工具的价值,我曾经是Cfengine、Puppet的长期用户。相反我认为不论是最早期Cfengine、还是后来的Puppet/Chef以及最近的Salt/Ansible,它们都在想方设法去帮助用户更好地管理服务器,做好IT管理。

但是我必须要说,它们真的不好用,你需要去适应它的方法。特别是像Puppet等工具,其体系比较庞大,并且是希望所有的IT管理都可以纳入进去并自动化运行。这些工具基本都有自己的DSL语言。它们都有一个理想,就是自动化一切, automate everything!

它们追求完美,却又产生了很多问题。

基于DSL的配置管理系统的问题不够灵活。现实中,仍然需要配合Shell进行管理。学习成本高 往往需要数周学习和掌握,且体系庞杂。在代码发布、监控、备份、排障等管理领域有效性不明显,关键的作用领域还是配置文件和软件包管理。可视化管理欠佳 可视化是自动化的前提。很多时候Puppet像一个黑盒子在执行,但执行的如何、是否有机器偏离了目标等不够清楚。PuppetLab提供了一个商业的web工具,但用过的人就知道还不如使用终端管理简单一些。Unix哲学 – 尽可能简单

虽然目前流行的配置管理工具都各有一部分拥趸,但毫无疑问的是,使用这些复杂管理工具的只是非常少的一部分人。绝大部分的公司和员工,仍然是使用Shell或者改良版的类Shell的方式在进行服务器的管理工作。原因无它,Shell足够简单,易于理解学习。

解决复杂的问题,只能是简单。

当你的机器规模只有10台时,使用Puppet/Chef这样的配置管理工具,你会有杀鸡用牛刀的感觉,你要掌握它,需要花费很多时间去学习,并且如果一段时间不写DSL,你也会觉得陌生。除了复杂和陡峭的学习曲线外,不够灵活也是这样的配置管理工具的特点,是的,不够灵活,你会发现脚本仍然是不可缺少的,而且是最灵活和强大的。你不仅可以使用Bash,你还可以使用任何你喜欢的脚本进行管理,Perl、Python、PHP、Ruby、Node等,你可以使用任何你所习惯的语言进行管理,管理不仅包含了系统,更包含了对应用的监视和管理。

使用复杂的工具去解决复杂的问题,会带来新的复杂。由于复杂,人们没有欲望去学习它,能使用这种”瑞士军刀”去管理服务器的人总是凤毛麟角,而服务器管理,并不仅仅是自动化。可视化和协作,同样重要且不可缺少!

这并不是说通过Shell脚本做服务器管理,是完美的。恰恰不是。简单比完美重要的多。而像Puppet/Chef虽然趋向完美,但是它偏离了简单原则,因此它们在可视化和协作性方面表现 并不好。

Shell是最简单和灵活的,这一点从它的普及度和顽强的生命力能够得到验证。

是否可以在不损失Shell简单灵活性的前提下,同样可以具有像Puppet这样的CM工具所具有的自动化能力,但又能解决像Puppet这样的CM工具在易用性、可视化和协作性方面的缺陷呢?

我们来看看Puppet、Chef的粉丝,是如何鲜明地指出Shell的弱点

Shell管理的缺陷不能幂等

幂等的好处最核心的是重复执行。但有2个问题

幂等真的如此重要吗?很多时候我们只是需要完成一件简单的事,并不需要过度考虑幂等问题

Shell真的不幂等吗?我们用puppet的核心功能来对比看看

文件 主要是文件的创建删除、属性设置。文件的创建删除在shell中多次执行并无害处,如果要避免报错,也只需简单做个处理,属性设置在Shell中天然就是幂等,多次执行毫无害处如下:

[ -d filepath ] || mkdir filepath[ -f filepath ] || touch filepathchown user:group filepathchmod 600 filepath

软件 Debian/Ubuntu中的apt-get工具和CentOS下的yum工具,执行多次并无影响,不论是安装还是删除,幂等对软件包管理而言不是问题,因为apt-get/yum已经实现了幂等

apt-get install -y nginxapt-get install -y nginxyum -y install nginxyum -y install nginx

用户和组 用户和组的管理,幂等性需求很小。添加删除用户,重复执行其实也是无害,如果有洁癖要避免错误输出,处理也是非常的简单:

id usertest 2>/dev/null || useradd usertestgrep -q usertest /etc/passwd || useradd usertest

进程 进程的监视,其实使用CM工具并不科学。更合理的做法是通过systemd/upstart进行管理。使用类似puppet工具做进程管理,很多时候低效且痛苦,当你需要暂停某台机器上的进程时,必须将该机器从某个分类中摘除才行,这很不方便。相反通过systemd/upstart工具则能更好更灵活地管理进程,同时进程的监视效率也非常高,往往在毫秒级别即可将crashed的进程启动恢复好。同时当我们在该服务器上做处理需要临时关闭进程时,也只需要执行initctl stop命令停止该进程。

重新初始化服务器不够方便

其实使用Shell完全没有问题。之所以说不方便,根本的原因在于通过传统的Shell方法,我们没有标记出一组机器,它应该执行哪些脚本,同步哪些文件。如果有了这些描述,其实更加简单。因为我们可以一目了然地看出原来这组机器都执行了哪些脚本,有哪些配置需要同步。

一致性

我们经常希望同一组机器的配置文件,能够保持其一致性。配置的变更应该在中心修改,然后再统一分发下去。这个其实完全可以通过scp将配置下发到指定机器上。在中心使用git保存配置的历史,更加简洁有效,且可以随时回滚。

NiceScale,不需要学习即可上手使用的服务器管理平台。

NiceScale使用简单的笨办法做服务器的管理。但是大家都熟悉并且接受的方式,基于SSH远程执行命令。

NiceScale的核心思想在于将服务器日常管理的操作脚本化,并做到有记录、可追溯可跟踪,且完全可视化的管理。由于沿袭Shell管理模式,简单易用,又解决了类Puppet配置管理工具在可视化、协作性和文档化方面的缺陷。而且,无论是可视化还是易用性方面,都是远远超过了传统的基于DSL的配置管理工具。

最最关键的是,NiceScale是不需要学习的。

服务器管理  回归Shell

相关文章:

你感兴趣的文章:

标签云: