第1章 Ansible架构及特点

IT行业的工作变得越来越有趣了,我们不再是把软件交付给客户,然后安装在单独的服务器上运行,我们都慢慢地变成了系统工程师。

我们现在部署应用软件的方式是通过服务串联起来,运行在一系列分布式的计算资源上并用各种不同的网络协议进行通信。常见的应用包括Web服务、应用服务、基于内存的缓存服务系统、任务队列、消息队列、SQL数据库、NoSQL数据存储、负载均衡等。

我们也需要确保采用合适的冗余,当故障发生时软件系统能够很好地处理、适应这些故障。另外有些辅助的服务需要部署、维护,例如日志管理、监控系统、分析系统,需要与第三方服务交互,如通过与IaaS接口交互来管理虚拟主机实例。

你可以用手动方式来搭建这些服务:安装服务器操作系统,SSH登录每一台,安装软件包,编辑配置文件,等等。这种方式耗费大量时间还经常出错,特别是在做了3~4次之后,这枯燥重复的手工劳动是令人非常痛苦的。对于更复杂的任务,比如在你应用环境中搭建一个OpenStack云环境,由手工来操作会让人发疯。应有更好的方法。

如果你读到这里,你可能已经有了配置管理的思想,并考虑采用Ansible做为你的配置管理工具。无论你是一个开发人员想要把代码部署到生产环境,还是一个系统管理员寻找更好的自动化方法。我觉得Ansible对于这些问题都是很好的解决方案。

1.1 Ansible软件及公司

IT自动化配置管理最近20年获得了迅猛的发展,特别最近几年在移动互联、云计算、大数据、互联网+等大规模应用平台的需求推动下,涌现出一批成熟的大规模自动化运维工具。维基百科里列出了二十多个,其中Puppet、Chef和Salt,以及CFEngine、Ⅴagrant和NixOS,大家都可能耳熟能详了。不过后起之秀Ansible(http://www.ansible.com/)的人气更高,已经是当今最常用的管理基础架构的开源管理工具之一。

从开源仓库GitHub上受到使用者、开发者的关注度、加星、贡献、评论(见表1-1)可以看出,Ansible的受欢迎程度的数据已经远远超过Puppet、Chef、CFEngine、SaltStack。

表1-1 GitHub上开源自动化工具受关注程度信息表(截至2015年8月30日)

Ansible自从2012年2月发布以来,一直得到Ansible爱好者、用户、开发者的热情参与、持续贡献,如图1-1所示。

图1-1 Ansible受贡献者的支持趋势

Ansible使用Python作为开发语言,巧妙地设计、实现了简单易用、功能强大的自动化管理工具。Ansible由Michael DeHaan发起、开发、创建,他同时也是著名工具软件Cobbler与Func的开发者。Ansible的第一个版本发布于2012年2月,目前下载量已经超过了100万。当前在GitHub上,它是排名前10位的Python项目,可以预见Ansible的发展不可限量。

Ansible已经广泛应用于各种规模、各个领域的企业,包括Rackspace、Twitter、Evernote、NASA、GoPro、Atlassian等知名企业。

1.1.1 Ansible应用领域

Ansible的编排引擎可以出色地完成配置管理、流程控制、资源部署等多方面工作。与其他IT自动化产品相比较,Ansible为你提供一种不需要安装客户端软件、管理简便、功能强大的基础架构配置、维护工具。

Ansible基于Python语言实现,由Paramiko和PyYAML两个关键模块构建。Ansible具有独特的设计理念:

·安装部署过程特别简单,学习曲线很平坦。

·管理主机便捷,支持多台主机并行管理。

·避免在被管理主机上安装客户代理,打开额外端口,采用无代理方式,只是利用现有的SSH后台进程。

·用于描述基础架构的语言无论对机器还是对人都是友好的。

·关注安全,很容易对执行的内容进行审计、评估、重写。

·能够立即管理远程被管理主机,不需要预先安装任何软件。

·不仅仅支持Python,可运行使用任何动态语言开发模块。

·非root账户也可以使用。

·成为最简单、易用的IT自动化系统。

在云计算时代的浪潮中,基础架构必须满足按需自动伸缩、按使用量计费的基本特性,IT自动化运维软件就是最重要的必备工具之一。下面来看看几个关键的领域中取得的巨大的进展。

1.配置管理

配置管理领域已经涌现出多种工具,配置管理的目标就是确保被管理的主机尽可能快速、按照正确方式达到配置文件中描述的状态,这对管理IT环境至关重要。例如,在网站高峰时候需要扩展新的Web服务器,这需要一台由配置管理控制的机器能够快速就位,这也就是通常所说的代码化基础架构(Infrastructure as code),因为构建基础架构所有必须的代码都存储在源码控制系统中。这也是逐步引入对代码化基础架构按照软件开发生命周期(Software Development Lifecycle, SDLC)方式进行管理,这些包括辅助基础架构测试的工具有Ansible、CFEngine、Chef、Puppet、Salt等,基础架构测试工具有Serverspec、Test kitchen等。

2.服务即时开通

这个领域的工具主要是在数据中心、虚拟化环境、云计算中快速开通新的主机。几乎所有云计算的服务提供商都有相应的API接口,这些自动化工具通过这些API接口能够快速地创建主机实例。对于基于Linux或最近快速发展的容器(如Docker、LⅩC),越来越多的人开始采用自动化工具的方式来保证这些容器的开通。Ansible在这些场景扮演了重要的角色。

3.应用部署

这个领域的工具重点关注如何尽可能地零停机部署应用。许多单位已经采用滚动式部署(rolling deployments)或金丝雀部署(canary deployments), Ansible对这两种方式都支持。流水线式部署也是很常见的,常见的工具包括ThoughtWorks Go、Atlassian Bamboo、大量插件支持的Jenkins条,都是比较优秀的。

4.流程编排

流程编排主要是进行部署时候如何保证基础架构中的各种组件协调一致。例如,在你对Web服务器部署新的软件版本时候,需要确保该Web服务器从负载均衡器上移出,这是很常见的场景。这类工具有Ansible、Mcollective、Salt、Serf、Chef等。

5.监控告警

监控告警工具已经发展到能够适应快速处理大规模服务器的环境。以前有成熟的Nagios、 Ganglia、Zenoss、Zabbix,最新发展的有Graphite、Sensu、Riemann等,都是相对不错的工具。

6.日志记录

集中日志数据确保能够正确地收集跨系统和应用的日志,同时能够按照规则进行智能过滤、根本原因分析、告警等。常见的工具有Logstash-Kibana、SumoLogic、Rsyslog等。

在上面关键的六个领域中,Ansible能够非常完美地完成前面四个领域的工作。通过使用Ansible,无论是系统管理员、运维团队、基础架构管理员、开发者,或者其他任何需要基础架构自动化者都可以从中受益。本书目的就是介绍如何构建健壮的IT基础架构自动化运维系统。

Ansible软件创始人:Michael DeHaan

2012年2月,曾在Red Hat开发Cobbler和Func、又在Puppet工作过的Michael DeHaan看到了IT自动化领域的机会:Linux管理员不得不用好几类工具来应付不同的工作场景,如配置管理用Puppet或Chef,部署时要用Fabric或Capistrano,还要用Func或mCollective处理其他任务,总之,太复杂了。同时,多节点部署却没有处理得很好的工具,而在云计算和大规模互联网的基础设施里,这恰恰是最有意思的问题。

一天,DeHaan在自己的沙发上开始用Python开发一个新工具,他的目标是:极为易用,连他自己都很想用;任何人可以在几分钟之内学会并使用。经过短短的6个月,第一个版本的工具诞生了,这就是Ansible。

由于DeHaan在运维圈已经很有名气,Ansible发布后很快流行起来。这期间,Fedora的Seth Ⅴidal(yum作者)采用并在4月份发表了High Scalability,都非常关键。

这之后,DeHaan还参与了OpenStack的开发,但在用Puppet自动化管理OpenStack的过程中不断撞墙。这时候,Ansible在GitHub上火了起来。很快他决定成立公司——AnsibleWorks。2013年8月公司获得600万投资,后来改名为Ansible公司。

Ansible只依赖SSH,无需在远程机器上安装代理,极为容易上手。Hacker News上有人称之为shell scripting++,很到位。

1.1.2 Ansible软件发布

Ansible公司负责Ansible开源软件的维护、管理,是Ansible软件发展的最大贡献者。Ansible开发团队非常高效,软件发布周期大约是2个月发布一个新版本。由于发布周期如此之短,轻微的bug通常是在下一个版本中得到修补,而不是对稳定版本发布新补丁。重大的bug经评估后,如果确实需要将会发布对稳定版本的补丁,但这种情况很少出现。

Ansible项目重要目标之一是向后兼容,因此这些实例不用修改也能在将来的版本中很好地运行。Ansible每个主要版本代号都是Ⅴan Halen乐队的一首曲子。在编写本书时,最新稳定版是2015年7月26日发布的1.9.2版本,代号为“Dancing In the Street”。1.9.2是对之前1.9.0/1.9.1的小版本升级,主要修复一些安全、功能方面的bug。

编写本书时,2.0版本已经在开发中,但还没最后确定内容和发布时间,主要将改进以下内容。

1.变更功能

·引入新的block/rescue/always指令符,允许执行任务块和异常处理的语义。

·扩展新的plugin策略,可以在每个play中控制任务执行的过程,默认时与以前一样。

·改进异常处理,现在你将可以得到更多的详细解析信息,将会更新一般的异常处理和显示。

·任务中include将在执行者进行评判,最终的结果与之前一样,但现在可以包含动态的include和选项。

·新版本中将可以使用更多动态的include的重要特性以 “with_”开头的循环。

·Callback、connection、lookup的插件API略有变化,新版中有的需要修改才能工作。

·Callbacks现在与活动目录一起,不需要复制,只需要添加到ansible.cfg的白名单中。

·许多API已经变更,虽然现在运行的不能直接在新版本中运行,但新的API更容易使用、测试。

·设置将更有继承性,你在play、block或role中设置的参数将由容器自动继承,这样将可以在所有层级上设置,以前需要手工处理这些代码。

·模板代码现在保持bool或数字类型,而不是转换成字符串,如果你要用以前的方式,只要把值用引号引起来,将会是按照字符串方式处理;如果是null的情况,输出的结果将会是一个空字符串。

·增加了refresh_inventory元语句,强制在play中重新读取资源清单。

·vars现在可以在play、block、role和task不同级别中设置。

·在yaml中设置的空变量或null变量将不再转换成空字符串,它们将保留None的值;如果要保留以前的处理方式,只需要在配置文件中设置null_representation或环境变量ANSIBLE_NULL_REPRESENTATION中进行设置。

2.改进模块

对少量模块进行更新,包括ec2_ami_search (ec2_ami_find)、quantum_network (os_network)、glance_image、nova_compute (os_server)、quantum_floating_ip (os_floating_ip),括号内是对应的新版本模块。

3.新增

新增多达79个支持模块,主要是增强对云计算环境的支持,特别是对Amazon、CloudStack、OpenStack、ⅤmWare等主流云平台的支持,还有些是增强对应用WebFaction、Win_IIS、Zabbix等的支持。

Ansible名称的来历

最早是厄休拉·勒古恩(Ursula K. Le Guin)在1966年的小说《罗卡农的星球》(Rocannon' s World)中创造了Ansible这个词,用以表示一种能在浩瀚宇宙中即时通信的装置。这在她后来的作品中也得到了沿用,并很快传播到了其他科幻作家的作品之中,Ansible往往作为一种速度比光速还快的虚构通信工具。最出名的案例也许是奥森·斯科特·卡德(Orson Scott Card)的《安德的游戏》(Ender' s Game),其中地球两次遭遇过虫族的进攻,国际舰队认为必须在世界各地寻找天资聪颖的孩童,将把他们塑造成舰队指挥官,使人类在与虫族的战斗中占领先机,并得到存活的希望。安德使用Ansible装置实时远程指挥前线的舰队,这是相距数光年作战的唯一可行方式。

Michael DeHaan想用这个词来比喻控制远端大量的服务器。

那么,勒古恩又是怎么想到这个单词的呢?在2001年Usenet的一个帖子里,戴夫·古德曼宣称勒古恩曾经告诉他“Ansible”是从“answerable”(可以应答)演变来的,她后来发现把这个词的字母换一下顺序就变成了“lesbian”(女同性恋者),这一点也使她觉得相当有趣。

4.扩展

扩展了新的资源清单,支持CloudStack、Fleetctl、Openvz、Proxmox、Serf等环境。

详见Ansible官方信息发布网站https://github.com/ansible/ansible/blob/devel/CHANGELOG.md说明,或http://www.ansible.cn/forum.php?mod=viewthread&tid=334(部分已翻译)。

1.1.3 Ansible公司服务

Ansible既可以是指软件开源的名称,也可以指运营开源项目的公司名称。Michael DeHaan是Ansible软件的发起者、创始人,Ansible公司前技术总监(CTO)。为了避免混淆,我们在后面涉及Ansible都指Ansible软件,指公司的时候都用Ansible公司表示。

Ansible公司是负责Ansible软件开发、开源社区的管理,确保Ansible软件工具适应IT自动化的需求。同时Ansible公司在开源Ansible软件基础之上,开发了基于Web界面友好的Ansible Tower专有IT自动化管理工具。提供Ansible软件推广、咨询、培训服务,为支持Ansible发展的可持续提供保证。Ansible的服务团队成员都是经过精心挑选、久经沙场、经验丰富的IT专业人士,包括系统管理员、软件开发者、咨询服务精英、自动化运维专家。无论是公共的还是专有的领域,他们在各种规模系统上都取得过成功。团队的所有成员都是高级的Ansible用户,都为开源产品贡献过代码,是社区的活跃成员。他们提供如下一些服务。

1.Ansible健康检查服务

如果已经使用Ansible有段时间了,但你想要确保符合最佳实践标准;如果你的上线日期已经很近,想要在上线截至日期之前一切准备就绪,都可以寻求“健康检查服务”。服务团队将评估你Ansible和Ansible Tower管理的内容和配置,用Ansible最佳实践来验证你的系统,并为你将来的项目提供建议。有如下服务:

·审查你当前的Ansible配置是否遵循最佳实践。

·建议改进你Ansible的实现。

·对在审查过程中发现的问题将按照目标进行培训。

2.协助重大迁移服务

发现Ansible是很易用的产品,但现在已经部署了Puppet、Chef、CFEngine或其他定制化的解决方案。要从现在的配置管理、部署方案、创建Ansible与之对应,这需要做重大迁移服务工作,这项工作包括:

·评估:与你原来使用工具的专家一起分析当前工具管理的内容,设计一个迁移计划。

·实现:根据评估的结果,按照推荐的方式进行实施,用Ansible工具创建相应的管理功能。

根据客户的需求,Anisble咨询团队将交付部分或全部迁移服务,使运行在Ansible维护工具中。

Ansible团队还将提供一份文档化的解决方案,一种可行的迁移方式,探寻“train the trainer”方式,让你的团队将来能够自己可以进行迁移。

3.推进IT自动化项目

推进自动服务是一项能够加快建立起自动化很好方法,这些协议将提供:

·为你的团队培训Ansible、Ansible Tower的基础使用和高级知识。

·安装、配置Ansible和Ansible Tower。

·Ansible导师将在你的流程中部署关键组件。

4.客户咨询服务

Ansible公司可以提供个性化客户服务,包括从项目启动、健康检查、重要迁移到最后完成设计目标过程中大大小小所有事情。

可能交付的内容包括:定制化模块、Jinja2模板、动态资产库脚本、角色和playbook,能够帮助你解决挑战的问题,加速任何Ansible项目的推进。

5.Ansible培训服务

Ansible官方网站已经提供了快速入门的视频短篇教程,帮助你了解Ansible。这个短篇介绍了Ansible作为一款强大的自动化IT运维、流程编排的工具,有哪些优势,这也是为你开始自动化项目提供必备的基础知识。

Ansible提供老师讲解的课程,包括动手学习环境、实际问题处理、现场建设性问题解答。也致力于根据你的个性需求开发特定裁剪的课程,个性化的培训也可以根据要达到的目标签订专业的服务协议。