运维目标有三个阶段,第一是追求稳定性,第二是追求标准化,第三是追求自动化。对于第三阶段来讲,什么是运维自动化呢?简单地讲,运维自动化就是将平常重复性工做按照事先设定好的规则,在必定时间范围内自动化运行,而不须要人工参与。接下来简单介绍运维自动化工具,要了解运维平时用到的自动化工具,就须要了解运维人员的平常工做有哪些。web
1、运维的平常工做ubuntu
运维的平常工做能够总结为如下四个部分,分别是:安全
(1) 系统安装(OS Provision)服务器
(2) 应用程序配置(Configuration)网络
(3) 命令执行与控制(Command and Control)app
(4) 程序发布(Deployment)框架
接下来一一拆解。less
1.1 系统安装(OS Provision)(批量系统部署)运维
运维的工做是运行和维护,那首先就须要有服务器主机。当一批服务器采购回来时,首先要作的是为这批主机安装操做系统。若是只是为一两台主机安装系统,那还可使用手动的方式安装,但若是是安装一批主机的话那效率就过低了,所以须要有便于同时安装多台操做系统的安装工具,也就是支持批量部署系统操做。批量系统部署有两种方式,一种是在裸机(bare metal)上使用安装工具部署系统,另外一种是在虚拟机(virtual machine)经过虚拟机实例安装系统,如下分别介绍这两种部署方式的安装工具。webapp
① 在裸机上安装(bare metal)
在裸机上安装时使用的安装工具经常使用的有 pxe 和 cobbler。
安装工具 | 介绍 |
pxe | 预执行环境/预引导环境,pxe 技术能在主机未安装操做系统时,借助于网卡自身的 ROM 中的代码功能扮演成 DHCP 服务器的客户端并本身经过网络获取一个 IP 地址;还能够扮演成文件服务器的客户端来获取 bootloader 程序文件。pxe 的缺陷是只能预引导一种操做系统,例如不能同时预引导 CentOS 6/CentOS 7/ubuntu/... 中的其中两种操做系统。 |
cobbler | cobbler 是 pxe 的二次封装,cobbler 可以整合多个预引导环境(操做系统环境)到一个镜面下。使用 cobbler 工具时须要硬件设备支持 pxe 技术。 |
②在虚拟机上安装(virtual machine)
在虚拟机上安装就更加方便,须要安装系统时只须要建立虚拟机实例,而后下载一个模板文件就能够安装完操做系统了,在这个模板文件包含了操做系统的配置。
1.2 应用程序部署(Configuration)(批量程序部署)
服务器是用来提供服务的,因此为服务器装完了操做系统后,首先要作的是的部署应用程序并提供服务,这一步骤称为应用程序部署(Configuration),包括了应用程序的安装、配置和启动。在这一步骤中经常使用的运维工具备 Puppet、Saltstack、Chef、Cfengine、Ansible 等。其中 Puppet 是由 Ruby 研发,SaltStack、Ansible 是由 Python 研发。
其中,Puppet 和 Saltstack 更适用于管理大规模主机的场景,最好是管理的主机数量超过 100 台,不然难以发挥出 Puppet 和 Saltstack 的优点,并且可能使用成本大于收益。对于管理小规模主机的场景,则简单轻量级的 Ansible 更适用。另外,Puppet 学习曲线较陡峭,而 Ansible 入门很是简单。
这一部分的运维工具都支持幂等性,即前一次命令的执行不会影响后一次命令的执行。
1.3 命令执行与控制(Command and Contorl)(批量执行命令)
在平时的运维工做中,须要手动完成一些管理和控制操做时,可能须要在一批服务器的每台服务器上都执行一批命令。所以为了简化运维工做,就有了一些运维工具能够帮助同时控制多台主机,并在每台主机上执行运维人员指定的一批命令操做。在这一部分中经常使用的运维工具备 Fabric、Func 和 Ansible 等。其中 Fabric 是由 Python 开发的轻量级工具。相比于 Fabric,Func 是一个重量级的运维工具。
1.4 程序发布(Deployment)
程序发布,就是在主机上用新版本的程序替换旧版本的程序,简而言之是给服务程序换版本。在程序发布这一环节上,因为各个公司的应用业务不一样,致使程序的发布流程、发布模式和发布过程当中须要注意的细节是不同的。因此程序发布几乎没有一个通用的工具来实现,发布工具基本都是各个公司自行研发的。
1.4.1 程序发布的方式
程序发布的方式能够总结为如下三种。
(1) 手动发布 ==> 人工发布
(2) 经过脚本发布 ==> 使用脚本也能够发布程序,但使用脚本时有如下两个缺陷。
① 程序环境发生变化时,脚本可能也须要随之灵活修改。若是脚本没有修改完善,可能会出现问题。
② 脚本自身可以提供的功能比较有限。例如在跨主机进行通讯时,须要借助于外部服务程序并基于 SSH 协议进行通讯,而脚本自身很难开发出基于网络通讯的组件。
(3) 经过发布程序发布 ==> 又称运维程序,是公司内部专门研发出来的运维框架。
1.4.2 程序发布的三个要求
合格的脚本发布的整个流程须要知足三个要求,这三个要求能够类比于在飞机上换发动机的场景。这三个要求以下。
(1) 不能影响用户体验。
(2) 系统不能停机。
(3) 不能致使系统故障或形成系统彻底不可用。
1.4.3 灰度模型
程序发布过程当中须要基于灰度模型发布。灰度模型就是让一批主机下线,其它主机仍然向外提供服务,当这一批下线的主机更换程序版本完毕后,若是没有问题就开始上线提供服务,接着换另外一批主机下线,以此类推。灰度模型有两种方式:
(1) 基于主机 ==> 例如先让 20% 的主机下线更换程序,上线后再换另外一批 20% 的主机,以此类推。
(2) 基于用户 ==> 例如部分提供会员服务的网站中,能够在保障会员用户的用户体验、不保障免费用户体验的前提下进行程序发布。
1.4.4 程序发布路径
在程序发布过程当中,能够为程序目录建立一个连接目录,这样便于管理程序版本。例如,在程序发布前,程序版本是 tuangou-1.1,而程序目录 /webapps/tuangou-1.1 的连接目录是 /webapps/tuangou。在执行程序版本更换时(假设更换为 tuangou-1.2),只须要将连接目录的连接路径修改成 /webapps/tuangou-1.2 便可。
建立连接目录的好处,是能够方便更换程序版本,而且在高版本程序出现bug时,能够快速“回滚”,把对用户的影响降到最低。
1.4.5 程序发布流程
程序发布流程能够总结以下。
在调度器上下线一批主机(标记为维护模式) --> 关闭服务 --> 部署新版本 --> 启动服务 --> 在调度器上启用这一批主机。
以上在运维平常中提到的运维工具均可以称为自动化运维工具,而自动化运维工具备 agent 和 agentless 类,接下来分别介绍。
2、运维工具的分类
运维工具根据在被管理端上是否装有 agent 程序,将运维工具分为 agent 和 agentless 两种类别。什么是 agent 程序呢?agent 的中文为“代理”之意,对于拥有 agent 程序的运维工具而言,当管理端(管理节点)经过网络管理被管理的主机时,被管理端主机上须要运行一个代理程序(agent 程序),并以管理员身份运行。当管理端向被管理端发送一个或多个要执行的命令时,被管理端的代理程序(agent 程序)负责代替管理端执行命令(由于 agent 程序是以管理员身份执行,因此以管理员身份代为执行其它命令)。这就是 agent 程序。
因此,运维工具的分类可总结以下。
① agent:在被管理端上装有管理程序(在管理端上运行)的代理程序(agent 程序,以管理员身份运行),在管理端和被管理端之间基于安全的认证进行通讯。常见的拥有 agent 程序的运维工具备 Puppet、Func 等。
② agentless:在被管理端上无需任何配置,由管理端配置好后便可使用。管理端和被管理端之间一般基于 SSH 协议进行通讯(基于 OpenSSH),也就是二者之间的底层通讯依赖于系统软件。虽然基于 SSH 协议进行通讯较为简单,但容易成为安全漏洞(一旦管理端被劫持,则被管理的主机的信息也会遭到泄露)。