随着技术的进步,计算变得越来越复杂。随着每天制造更好的硬件,计算系统的复杂性增加了。分布式计算开始蓬勃发展,很快“云”被发明出来。软件变得琐碎,管理软件成了一件痛苦的事情。开发周期加快了步伐,手动测试和部署很快就感觉过时了,因此需要自动化。如果你正在阅读这本书,你可能理解自动化的重要性,无论是测试应用还是管理整个基础设施。
随着负载的增加和基础设施的不断扩展,系统管理员不再是手工配置每个系统的简单工匠,而是开始同时管理数千个系统。对于任何环境,无论它有多大,您都需要一个可靠的系统来管理它。地理位置分散的工作场所和不断增长的基础设施使得几乎不可能跟踪库存并手动配置和管理每台机器。快节奏的开发周期和缩短的上市时间给错误留下了很小的空间,并且将手动过程抛出窗外。
管理整个基础设施、部署构建、加快流程,同时跟踪变化的关键是要有一个用户友好、学习曲线小、可根据您的需求插入的系统。最重要的是,您要保持专注,花更多的时间管理您的基础架构和流程,而不是自动化脚本和管理工具本身。在众多可用的解决方案中,Ansible 就是这样一个具有许多有趣特性的工具。它易于扩展,并可满足 90%的用户需求。这本书关注剩下的 10%。
在本章中,我们将探讨:
- 为什么是 Ansible?
- 为什么要扩展 Ansible?
- Ansible 的架构
- 扩展 Ansible
在市场上众多可用的工具中,您如何选择最适合您需求的工具?在选择工具来满足您的需求时,您应该考虑哪些因素?可能会想到以下问题:
- 从金钱、时间和努力来看,投资回报率是多少?
- 使用该工具我可以获得什么样的支持?
- 潜在的相关安全风险是什么?
- 该工具是否足够灵活,可以插入我的基础架构?
- 覆盖范围是什么?我的所有要求都得到满足了吗?
如果这些是我想到的问题,我会试着用 Ansible 来回答它们。
- Ansible 是免费的。你唯一需要的投资就是一些时间和努力。Ansible 的行动手册是基于 YAML 的,因此非常容易阅读、理解和维护,因此涉及非常小的学习曲线。模块隐藏了下面的复杂性。
- Ansible 是开源的。因此,有整个社区来支持你。您可以将问题归档,甚至自己修复它们,因为您始终可以访问代码。
- 与大多数基于代理的其他解决方案不同,Ansible 纯粹在 SSH 上工作。不需要代理。因此,您可以坐下来放松,因为您的生产系统上没有额外的包装。
- Ansible 提供了一个非常好的 API,您可以使用它来构建适合您需求的自己的 Ansible 模块,然后可以将其插入到您的基础架构中。
- Ansible 开箱即可满足 90%的用户需求。剩下的 10%有一个记录良好的应用编程接口和社区支持来构建您自己的模块,因此增加了覆盖率。
如果你对上述论点感到满意,并愿意尝试一下,请继续阅读。
Ansible 在各种环境中都很方便——作为配置管理工具和部署自动化工具,以及用于配置和编排。它开箱即用,有很多插件和模块可以用来构建剧本。您可以像大多数软件开发项目一样,使用 Ansible 管理您的整个基础架构。基础设施作为代码 ( IAC ) 将软件开发的相同原则应用于配置管理。
人们喜欢 Ansible,因为它简单明了,关注点分离清晰。它不会强迫你坚持一个特定的愿景,即你应该如何管理你的配置。它为设计您的 IAC 解决方案提供了一个完美的构建模块,可根据您的特定要求进行定制。
扩展 Ansible 有很多原因。这可能包括添加缺失的功能,也可能包括根据您自己的需要修改/增强现有功能。由于 Ansible 是一个开源的、社区驱动的项目,并不是所有的东西都可以一次集成。效用和需求之间总是有权衡的。如果一个特定特性的用户不多,那么项目维护人员支持它就会成为一项开销。
所以,你遇到了一种情况,Ansible,以它的本地形式和可用的模块和插件,不足以满足你的需求。你是做什么的?换个工具?寻找其他选择?也许甚至诅咒你的运气不好,因为你无法预见将要发生的事情,现在你需要改变一切?
答案是否定的。Ansible 提供了一个非常好的应用编程接口和样板,你可以根据自己的需求来编写自己的 Ansible 模块或插件。构建 Ansible 模块很容易。由于 Ansible 是社区驱动的,如果您觉得更多的人可能会面临您遇到的相同问题,您甚至可以为所需的模块提交功能请求。如果你是一名开发人员,你可以简单地编写自己的 Ansible 模块或插件,并与社区共享。为您的模块发送一个拉取请求,并与项目维护人员进行讨论。希望该模块将被合并,并在 Ansible 的未来版本中提供。
在本书中,我们将看到如何根据需求扩展 Ansible,并通过对开源项目,特别是 Ansible 的贡献来分发定制。
将您的基础架构视为代码提供了许多优势,但这也是有代价的。不是你团队的所有成员都愿意攀登学习曲线。因此,只有少数人会成为任何配置管理工具(如 Ansible)的强大用户,他们将成为整个团队的瓶颈。
一个好的 IAC 实现应该使每个人都能够轻松地与基础设施交互、部署新软件、提供资源以及将组件组织在一起。细节应该尽可能抽象,行为应该清晰,定义应该是可导航的。还应该有一种简单的方法可以将任何问题追溯到高级配置。
为了实现这一点,一可以开发插件和模块,这些插件和模块可以抽象细节,并提供人们可以直接使用并从中获得结果的界面。这将帮助每个人加快速度并与基础设施互动。
你可以创建模块和插件,让你的日常任务变得简单。您可以将这些作为实用程序共享,公司中的任何人都可以使用它们来执行类似的任务。这将需要一些开发人员的努力,但即使是不太强大的用户也能充分利用他们的基础设施。
基础设施逐渐发展到一个点,在这个点上,您最终放弃手动管理它,并开始感觉到需要一种更好的方法来管理突发的复杂性。
一种方法是花大量时间寻找合适的工具,然后最终采用完整的配置管理解决方案,并竭尽全力改变您的问题,使其适合现有的解决方案。显然,这种方法听起来有缺陷。
另一种方法是保持简单,并在现有工具真正给你带来直接优势的时候,逐步利用它们的力量。
Ansible 更适合后一种方法。它写得很好,提供了明确的关注点分离和简单的模型。事实上,你可以选择你想在多大程度上参与其中。它允许您在保持控制的同时重用社区提供的组件。
您可以利用 Ansible 公开的各种扩展点来构建符合您需求的模块和插件。重用已经存在的插件和模块,并在需要时创建自己的插件和模块,可以对基础设施提供更多的控制。
Ansible 是一个托管在 GitHub 上的开源项目。如果你有一个 GitHub 账号,你可以很容易地分叉 Ansible 存储库并开始为项目做贡献(Ansible 代码:https://github.com/ansible/ansible)。
您可以将项目转移到自己的帐户中,克隆它,然后进行更改并向项目所有者发送拉取请求。这适用于所有开源项目。
如果您不知道从哪里开始投稿,也可以查看存储库中的问题部分。问题部分包含使用该工具的人的错误报告和特性请求。您可以选择验证并修复问题,然后将补丁作为针对问题的请求发送给项目所有者。
补丁经过一个评审过程,只有在项目维护人员批准后,补丁才会被合并。一旦合并,用户就可以使用该功能。
即使虽然我们假设我们的读者对 Ansible 有工作知识,但是浏览 Ansible 架构的简要概述是有用的,以便更好地理解各种扩展点。
Ansible 是一个无代理的配置管理系统,这意味着被管理的主机上不必运行特殊的软件。Ansible 通常通过普通 SSH 连接到其目标,复制所有必要的代码,并在目标机器上运行。与其他解决方案相比,无代理是 Ansible 的主要优势之一。这减少了在目标计算机上设置所需代理的开销,也降低了安全风险,因为不需要安装额外的软件包或代理。
核心 Ansible 组件包括:
- 库存:目标
- 变量:关于目标主机的信息
- 连接:如何与目标主机通话
- 跑者:将连接到目标并执行动作
- 剧本:配方在目标主机上执行
- 事实:关于目标的动态信息
- 模块:执行动作的代码
- 回调:收集剧本动作的结果
下图显示了 Ansible 的体系结构:
让我们仔细看看 Ansible 组件。
在的核心是 T2 跑者。runner 允许您在一个或多个主机上执行操作并收集结果。
跑步者使用清单来选择要连接的主机。清单还可以将一组变量与每个主机相关联。然后,这些变量可以通过剧本和其他类似连接插件的 Ansible 组件来访问。
连接插件(带有默认 SSH 连接)可以使用特定的主机变量来计算如何连接到远程主机。变量可能包括用于连接远程主机的用户名、非默认端口号等信息。
转到另一个部分,剧本 是最重要的一个,因为所有的食谱都是以 Ansible 剧本的形式写的。剧本被建模为剧本的集合,每个剧本定义了一组要在一组远程主机上执行的任务。剧本也定义了执行任务的环境。
剧本可以分解成个角色 以便更好地组织。角色有助于模块化行动手册任务。这些角色可以在之后的针对特定主持人群体的戏中出现。例如,如果您的基础架构涉及 web 服务器和代理服务器,每一个都需要一组通用的任务(准备系统),然后是特定类型的任务(设置和配置 web/代理服务器),那么这些任务可以简单地分解为角色,这些角色稍后可以针对特定的主机运行。可以针对所有主机定义通用任务,此时可以针对各自的主机组执行 webserver 和代理服务器角色。
Ansible 架构中的另一个重要组件是 变量。变量可用于提取公共值和参数化共享剧本片段。它们还可以用来根据主机共享的某些质量对主机进行分类。
由于每台主机都可以给出大量关于自身的信息,因此不建议手动管理它们。因此,Ansible 在其软件中包含了一个名为 facts 的特殊变量。
facts 变量由设置模块提供,并在每个主机上隐式执行(除非显式禁用)。在运行程序开始在远程主机上执行剧本之前,此变量收集有关远程主机的信息。
现在我们已经准备好了 Ansible 剧本,并且已经收集了所有关于远程主机组的事实,跑步者开始了。runner 变量通过将操作代码复制到目标机器并在执行操作代码之前准备环境,在远程主机上执行特定的操作(如 Ansible playbook 中所指定的)。
一旦运行程序评估并执行了任务,它就会清除从远程主机复制的代码,最后通过 回调报告状态。
剧本语言的表达性是有限的,以便促进你的配置的某种声明性和描述性结构。然而,Ansible 并没有过分尝试对严格的声明性配置建模。可执行的游戏被建模为任务的顺序执行,只受变量的影响。
有几个技巧可以让您在行动手册中插入复杂的逻辑,以及一些扩展点,我们将在后面看到,这些扩展点可以让您实现您想要的东西。
Ansible 提供了各种扩展点,可以用来扩展 Ansible,使其适合定制自己的需求。它有四个主要入口点,您可以在其中输入代码:
- 自定义事实脚本:从远程主机收集自定义事实
- Ansible 模块:实际基础设施变化的执行器
- 插件:延长可执行的生命周期
- Python API :反转控件,并从您的自定义工具中利用 Ansible 的部分
动态库存可能会提供一些关于基础设施及其分组和管理方式的知识,但它不能提供事物实际状态的视图。
在每一次 Ansible 运行之前,都会收集关于执行行动手册的基础架构的事实。这收集了大量关于主机的信息,如果需要,可以在以后的 Ansible 行动手册中使用。
然而,你可能会发现自己处于这样一种境地:作为事实收集过程的一部分而收集的默认事实是不够的。为了解决这个问题,Ansible 允许您在 Ansible 播放执行之前,作为事实收集阶段的一部分运行您的自定义代码。
模块定义可以在您的基础设施上执行的基本操作。它们允许你从剧本中准确描述什么是正确的。它们可以封装复杂的高级任务,例如与一些外部基础架构组件进行交互,并部署虚拟机或整个环境。
模块是可定制的关键。模块可以用任何编程语言编写,如果合适的话,它们可以使用 Ansible 本身来执行操作的细节。
这本书的很大一部分致力于构建 Ansible 模块。
术语插件 将大量的扩展点组合在一起,这些扩展点深深地钩住了 Ansible 核心,并以强大的方式扩展其行为。
Ansible 目前可用的插件如下:
- 动作插件
- 环回插件
- 回调插件
- 连接插件
- 过滤插件
- 它的插件
插件将在第 4 章、探索 API 和第 5 章、中进行详细介绍深入了解 Ansible 插件,在这里您将了解所有您需要了解的插件,包括如何实现它们和构建自己的插件。
Ansible Python API 允许您将 Ansible 用作库,从而从您的定制配置管理解决方案(无论是什么)中利用 Ansible 擅长的东西。您可以通过编程方式运行 Ansible 行动手册。
Python 应用编程接口也可以在其他 Ansible 扩展中使用;我们将在本书中强调重要的部分。
看完这一章后,您可能会想使用 Ansible 作为配置管理和编排工具。或许我们也给了你一个选择 Ansible 作为 IAC 解决方案的理由。本章向您简要介绍了 Ansible 及其功能和用例。它让您熟悉了 Ansible 架构、Ansible 的不同组件以及 Ansible 提供的各种扩展点。本章还带您了解了为 Ansible 项目做贡献的过程。
在下一章中,您将学习 Ansible 模块。这一章将带你在开始编写 Ansible 模块之前了解你需要知道的内容,并指导你完成第一个模块的编写。这一章还将教你开发 Ansible 模块时应该遵循的一些最佳实践。此外,这一章将为本书后面将涉及的更高级的主题奠定基础,其中包括在哪里以及如何利用 Ansible 的力量的现实场景。