“文档是你写给你未来自己的情书。” ——Damian Conway
我使用 Ansible 作为我的个人笔记本,用于记录编码流程——包括我经常使用的和不常用的流程。这个过程方便了我的工作,并减少了执行重复性任务所需的时间,即那些需要按特定顺序执行特定命令才能完成特定结果的任务。
通过使用 Ansible 记录文档,我不需要记住每个命令的所有参数或特定流程涉及的所有步骤,并且很容易与我的队友分享细节。
传统的文档记录方法,如维基或共享驱动器,对于通用文档很有用,但不可避免地会过时,并且无法跟上基础设施和环境的快速变化。对于特定流程,最好使用像 Ansible 这样的工具直接在代码中记录文档。
Ansible 的优势
在我们开始之前,让我们回顾一些基本的 Ansible 概念:playbook 是使用 plays 对流程进行的高级组织;plays 是针对一组主机的特定流程;tasks 是特定操作,modules 是代码单元,而 inventory 是受管节点的列表。
Ansible 的巨大优势在于文档本身就是 playbook,因此它与代码一起演进并包含在代码内部。这不仅有用;而且也很实用,因为不仅仅是用 Ansible 记录解决方案,你还在编写一个 playbook,使你能够编写你的流程和命令,重现它们并自动化它们。这样,你可以在六个月后回顾并能够快速理解并再次执行它们。
诚然,这种解决问题的方式最初可能需要更多时间,但从长远来看肯定会节省大量时间。通过勇敢和有纪律地采用这些新习惯,你将在每次迭代中提高你的技能。
以下是一些其他重要的元素和支持工具,它们将有助于你的流程。
使用源代码控制
“先做,然后做对,然后做得更好。” ——Addy Osmani
当使用 Ansible playbook 时,实施 playbook 即代码策略非常重要。实现这一目标的一个好方法是使用源代码控制存储库,它允许你从一个简单的解决方案开始,并迭代改进它。
源代码控制存储库在你与其他开发人员协作、恢复以前的版本和备份你的工作时提供了许多优势。但在创建文档时,它的主要优势在于你可以追溯你正在做的事情,并且可以围绕小的更改进行迭代以改进你的工作。
最流行的源代码控制系统是 Git,但还有其他系统,如 Subversion, Bazaar, BitKeeper, 和 Mercurial。
记住幂等性
在基础设施自动化中,幂等性意味着达到一个特定的最终状态,无论该过程执行多少次,该状态都保持不变。因此,当您准备自动化您的流程时,请记住期望的结果,并编写能够始终如一地实现这些结果的脚本和命令。
这个概念存在于大多数 Ansible 模块中,因为在您指定期望的最终状态后,Ansible 将实现它。例如,有用于创建文件系统、修改 iptables 和管理 cron 条目的模块。所有这些模块默认都是幂等的,因此您应该优先考虑 它们。
如果您正在使用一些较低级别的模块,如 command 或 shell,或者开发自己的模块,请注意编写幂等的代码,并且可以安全地重复多次以获得相同的结果。
当您为自动化准备流程时,幂等性概念非常重要,因为它允许您评估多种方案,并将使您的代码更安全并创建一个指向期望结果的抽象级别的方案纳入其中。
测试它!
测试您的部署工作流程可以在您的代码到达生产环境时减少意外情况。Ansible 认为您不需要另一个框架来验证基础设施中的基本事项是正确的。但您的重点应该放在应用程序测试上,而不是基础设施测试上。
Ansible 的文档为您的流程提供了几种 测试策略。为了测试 Ansible playbook,您可以使用 Molecule,它旨在帮助开发和测试 Ansible roles。Molecule 支持使用多个实例、操作系统/发行版、虚拟化提供商、测试框架和测试场景进行测试。这意味着 Molecule 将完成所有测试步骤:linting 验证、检查 playbook 语法、构建 Docker 环境、针对 Docker 环境运行 playbook、再次运行 playbook 以验证幂等性,以及之后清理一切。使用 Molecule 测试 Ansible roles 是对 Molecule 的一个很好的介绍。
运行它!
运行 Ansible playbook 可能会创建以不友好且难以阅读的方式格式化的日志。在这些情况下,Ansible Run Analysis (ARA) 是运行 Ansible playbook 的一个很好的补充工具,因为它提供了一个直观的界面来浏览它们。阅读 Analyzing Ansible runs using ARA 以获取更多信息。
记住要使用 Ansible Vault 保护您的密码和其他敏感信息。Vault 可以加密二进制文件、group_vars、host_vars、include_vars 和 var_files。但是,当您以 -v(verbose)模式运行 playbook 时,此加密数据会暴露出来,因此最好将其与设置为 true 的关键字 no_log 结合使用,以隐藏任何任务的信息,因为它表明不应记录或显示参数的值。
一个基本示例
您是否需要连接到服务器以生成报告文件并将该文件复制到另一台服务器?或者您是否需要很多特定的参数来连接?也许您不确定将参数存储在哪里。或者您的流程是否花费了很长时间,因为您需要从多个来源收集所有参数?
假设您有一个具有某些限制的网络拓扑,并且您需要将文件从您可以访问的服务器 (server1) 复制到由第三方管理的另一台服务器 (server2)。连接参数是
Source server: server1
Target server: server2
Port: 2202
User: transfers
SSH Key: transfers_key
File to copy: file.log
Remote directory: /logs/server1/
在这种情况下,您需要连接到 server1 并使用这些参数复制文件。您可以使用一行命令来完成此操作
ssh server1 "scp -P 2202 -oUser=transfers -i ~/.ssh/transfers_key file.log server2:/logs/server1/"
现在您的 playbook 可以执行该流程了。
有用的组合
如果您生成大量 Ansible playbook,您可以使用其他工具(如 AWX (Ansible Works Project))组织您的所有流程,AWX 提供了一个基于 Web 的用户界面、一个 REST API 和一个构建在 Ansible 之上的任务引擎,以便用户可以更好地控制他们在 IT 环境中对 Ansible 项目的使用。
其他有趣的组合包括 Ansible 与 Rundeck(它将流程作为自助服务作业提供)以及 Jenkins(用于持续集成和持续交付流程)。
结论
我希望这些使用 Ansible 的技巧能够帮助您改进您的自动化流程、编码和文档。如果您有更多兴趣,请深入研究并了解更多。我很想听听您的想法或问题,所以请在下面的评论中分享它们。
2 条评论