问题描述
想要在Ansible设置中建立一些弹性,以处理配置和配置管理。他了解到在配置方面有一些测试方法,但他想知道如何在配置管理方面实施测试,以及是否有任何工具可以帮助实现这种类型的测试。
目前,他们的大部分测试都是在playbook中串行进行的,这在处理“服务是否启动,vip是否可用,异步任务是否完成”等问题时是有意义的,但他真正关心的是在应用程序和配置层面(如VM配置)上管理配置漂移的能力。他知道Ansible不是处理配置漂移的最佳工具,但他对你的意见很感兴趣。
如果你有完全自动化的过程,那就更好了(我们有一些丑陋的脚本,每天在slack上报告)。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
测试工具
以下是一些可用的测试工具,按照Github的星标排序:
– Serverspec – 基于Ruby,是目前最受欢迎的工具,基于Ruby的rspec构建。
– Goss – 基于YAML,简单,小于10MB的自包含二进制文件,非常快速,可以从系统状态生成测试。
– Inspec – 基于Ruby,可以将其视为改进版Serverspec,几乎相同的语法,由Chef团队开发,易于扩展。
– Testinfra – 基于Python,具有使用Ansible的inventory/vars的功能。
这些工具之间的主要区别如下:
– 除了Goss之外,所有框架都可以针对远程机器(例如通过ssh)运行。Goss只能在本地或在docker中运行(使用dgoss)。
– 所有框架都可以在服务器上本地运行,但需要安装或嵌入Python或Ruby。Inspec提供了一个自包含的<150MB捆绑包,其中包含了一个嵌入的ruby版本。Goss是一个单独的<10MB二进制文件,没有外部依赖。
– Goss内置支持nagios/sensu输出,这使得与监控工具的集成更容易。
– Goss测试通常更简单,但灵活性较低,因为它基于YAML。其他框架允许您利用底层语言Python/Ruby的全部功能来编写测试或扩展工具的功能(简单性与灵活性)。
– Goss允许您从当前系统状态生成测试。
– 据我所知,Testinfra是唯一一个内置支持Ansible inventory和variables的工具。
– Inspec由Chef支持。
持续/漂移测试
- Chef Compliance – 与Inspec一起工作,持续测试服务器,付费产品。
- Goss – 可以轻松地与Nagios或Sensu集成。还支持将服务器测试公开为http端点。
开发测试工具
全面披露:我是goss的作者
更新: InSpec 4.x或更高版本使用混合商业/开源许可证-请参阅评论。
配置漂移测试
当使用配置管理工具(如Ansible)时,工具本身负责防止配置漂移。一旦使用Ansible设置了某个配置,重复执行Ansible将确保您的配置与您定义的一样。这还要求您的Ansible代码以幂等的方式编写。
通过在某个服务器上循环执行Ansible playbook,可以实现对配置的测试。例如,可以使用cron作业或Jenkins每30分钟执行playbook,并报告任何失败。没有失败意味着您的配置是正确的,有失败意味着服务器没有达到所需的状态。
在无法相信代码是幂等的情况下,因此无法从自动服务器循环执行Ansible的情况下,可以使用相同的方法(循环运行Ansible),但使用其干运行模式。每次Ansible报告需要更改时,Jenkins作业(或cron作业)可以通知您的配置已更改,并且服务器不处于所需的状态。
为了确保您的Ansible代码实际上是按照您的意图执行的,可以使用Dave Swersky提到的解决方案。无论是InSpec还是Serverspec,都是验证您的playbook是否实际上做了您的意思的工具。执行这些工具的一种很好的方法是使用kitchen.ci,在测试环境(甚至是docker容器)中处理各种基础设施单元测试工具,并执行您的playbook/modules/cookbooks。
Kitchen.ci最初用于测试Chef cookbooks,但也有适用于Ansible和其他配置管理工具的插件。
更新: InSpec 4.x或更高版本使用混合商业/开源许可证-请参阅评论。
其他工具
- Outthentic – 可以使用Outthentic来跟踪配置/基础设施的差异/漂移,它可以轻松创建一个测试套件来“修复”所需状态并在每次需要跟踪不希望的更改时重新运行它。
以上是一些可用的工具,您可以根据自己的需求选择适合您的工具。