如何借助Molecule测试Ansible角色

栏目: 服务器 · 发布时间: 6年前

内容简介:【51CTO.com快译】测试技术在软件开发中扮演着重要角色,我们谈论基础设施即代码(IaC)时也一样。开发人员总是在测试,需要不断的反馈来促进开发。如果获得变更方面的反馈很费时间,表明你的步骤可能太庞大,难以发现错误。小步骤和快速反馈是TDD(测试驱动型开发)的精髓。但是你如何将这个方法应用于开发特定的playbook或角色呢?

如何借助Molecule测试Ansible角色

【51CTO.com快译】测试技术在软件开发中扮演着重要角色,我们谈论基础设施即代码(IaC)时也一样。

开发人员总是在测试,需要不断的反馈来促进开发。如果获得变更方面的反馈很费时间,表明你的步骤可能太庞大,难以发现错误。小步骤和快速反馈是TDD(测试驱动型开发)的精髓。但是你如何将这个方法应用于开发特定的playbook或角色呢?

开发自动化时,典型的工作流程会从新的虚拟机开始。我使用Vagrant来阐述这个想法,但你可以使用libvirt、 Docker 、VirtualBox、VMware、私有云或公共云中的实例,或者数据中心虚拟机管理程序中配置的虚拟机(比如oVirt、Xen或VMware)。

决定使用哪个虚拟机时,应兼顾反馈速度和与你的实际目标环境的相似性。

Vagrant的最小起点是:

vagrant init centos/7 # or any other box 

然后将Ansible配置添加到你的Vagrantfile:

config.vm.provision "ansible" do |ansible|  
ansible.playbook = "playbook.yml"  
end 

最后,你的工作流程将是这样:

1. vagrant up。

2. 编辑playbook。

3. vagrant provision。

4. vagrant ssh,以验证虚拟机状态。

5. 重复步骤2至4。

偶尔会销毁并再次启动虚拟机(vagrant destroy -f; vagrant up),以提高你playbook的可靠性(即为了测试你的自动化是不是端到端运行)。

虽然这是很好的工作流程,但你仍在完成连接到虚拟机,并验证一切都按预期运行的所有棘手工作。

如果测试未自动化,你没有自动化基础架构时会面临类似那样的问题。

幸好,像Testinfra和Goss这样的 工具 有助于自动化这些验证。

我将着重介绍Testinfra,因为它是用 Python 编写的,是Molecule的默认验证器。想法很简单:使用Python自动化你的验证。

def test_nginx_is_installed(host):  
nginx = host.package("nginx")  
assert nginx.is_installed  
assert nginx.version.startswith("1.2")  
def test_nginx_running_and_enabled(host):  
nginx = host.service("nginx")  
assert nginx.is_running  
assert nginx.is_enabled 

在开发环境中,该脚本将使用SSH(就像Ansible)连接到目标主机以执行上述验证(包存在/版本和服务状态):

py.test --connection=ssh --hosts=server 

简而言之,在基础架构自动化开发过程中,面临的挑战是配置新的基础架构,针对它们执行playbook,验证你的变更体现了你在playbooks中声明的状态。

  • Testinfra能验证什么?
    • 从用户的角度来看,基础架构已安装并运行起来(比如,HTTPD或Nginx在回应请求,MariaDB或PostgreSQL在处理 SQL 查询)。
    • OS服务已运行并启用
    • 进程在侦听特定的端口
    • 进程在回应请求
    • 配置文件用模板正确复制或生成
    • 你几乎执行的任何操作,确保服务器状态正确无误
  • 这些自动化测试提供了哪些安全措施?
    • 执行复杂的变更或引入新功能而不破坏现有行为(比如,添加对基于Debian的系统的支持后,仍可以在基于RHEL的发行版中运行)。
    • 发布Ansible的新版本并引入新的最佳实践时,重构/改进代码库。

到目前为止,我们对Vagrant、Ansible和Testinfra所做的工作很容易与四阶段测试模式中描述的步骤对应起来――这种测试结构方法使测试目标清晰。它包括下列阶段:安装、演练、验证和拆除:

  • 安装:为测试执行准备环境(比如启用新的虚拟机):
vagrant up 
  • 演练:针对测试的系统有效地执行代码(即Ansible playbook):
vagrant provision 
  • 验证:验证上一步的输出:
py.test(针对Testinfra) 
  • 拆除:回到安装前的状态:
vagrant destroy 

我们用于特定playbook的同一个想法可以运用于角色开发和测试,但每当开发新产品时是否需要执行所有这些步骤?如果你想使用容器或OpenStack而不是Vagrant,该怎么办?如果你宁愿使用Goss而不是Testinfra,该怎么办?如何针对你代码中的每次变更持续运行此操作?有没有一种更简单快速的方法来使用自动化测试开发playbook和角色?

Molecule

Molecule使用测试帮助开发角色。该工具甚至可以用测试用例初始化新角色:molecule init role –role-name foo。

Molecule很灵活,足以让你可以将不同的驱动程序用于基础架构配置,包括Docker、Vagrant、OpenStack、GCE、EC2和Azure。它还允许使用不同的服务器验证工具,包括Testinfra和Goss。

它的命令简化了开发工作流程中常用任务的执行:

  • lint-执行yaml-lint、ansible-lint和flake8,如果有问题报告故障
  • syntax-验证角色的语法错误
  • create-创建驱动程序已配置的实例
  • prepare-使用准备playbook来配置实例
  • converge-执行针对主机的playbook
  • idempotence-执行两次playbook;万一第二次运行出现变更,就失效(非幂等)
  • verify-执行服务器状态验证工具(testinfra或goss)
  • destroy-销毁实例
  • test-执行前面的所有步骤

login命令可用于连接到已配置的服务器用于故障排查。

逐步操作

你如何从根本没有测试到针对每次变更/提交执行一个体面的代码库?

1. virtualenv(可选)

virtualenv工具创建孤立的环境,而virtualenvwrapper是便于使用virtualenv的扩展件的集合。

这些工具可防止Molecule与计算机中其他Python包之间的依赖项和冲突。

sudo pip install virtualenvwrapper  
export WORKON_HOME=~/envs  
source /usr/local/bin/virtualenvwrapper.sh  
mkvirtualenv mocule 

2. Molecule

安装带Docker驱动程序的Molecule:

pip install molecule ansible docker-py 

生成带测试场景的新角色:

molecule init role -r role_name 

或者针对现有角色:

molecule init scenario -r my-role 

所有必要的配置都是使用你的角色生成,你只要使用Testinfra编写测试用例:

import os  
import testinfra.utils.ansible_runner  
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(  
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')  
def test_jboss_running_and_enabled(host):  
jboss = host.service('wildfly')  
assert jboss.is_enabled  
def test_jboss_listening_http(host):  
socket = host.socket('tcp://0.0.0.0:8080')  
assert socket.is_listening  
def test_mgmt_user_authentication(host):  
command = """curl --digest -L -D - http://localhost:9990/management \  
-u ansible:ansible"""  
cmd = host.run(command)  
assert 'HTTP/1.1 200 OK' in cmd.stdout 

Wildfly角色的该示例测试用例验证OS服务已启用,进程在侦听端口8080,身份验证已正确配置。

为这些测试编写代码很简单,你基本上需要考虑一种自动验证方法。

你登录到playbook针对的机器或者为监视/警报系统构建验证时,你已经在编写测试。 这有助于使用Testinfra API或使用系统命令来构建内容。

CI

持续执行Molecule测试很简单。上述示例适用于带Docker驱动程序的TravisCI,但它可能很容易改动,适合Molecule支持的任何CI服务器和任何基础架构驱动程序。

---  
sudo: required  
language: python  
services:  
- docker  
before_install:  
- sudo apt-get -qq update  
- pip install molecule  
- pip install docker-py  
script:  
- molecule test 

访问 Travis CI 以获取示例输出。

原文标题:Testing Ansible roles with Molecule,作者:Jairo da Silva Junior

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

【责任编辑:庞桂玉 TEL:(010)68476606】


以上所述就是小编给大家介绍的《如何借助Molecule测试Ansible角色》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算理论导引

计算理论导引

[美]Michael Sipser / 唐常杰、陈鹏、向勇、刘齐宏 / 机械工业出版社 / 2006-7 / 36.00元

本书是计算理论领域的经典著作,被国外多所大学选用为教材。本书以注重思路、深入引导为特色,系统地介绍计算理论的三大主要内容:自动机与语言、可计算性理论和计算复杂性理论。同时,对可计算性和计算复杂性理论中的某些高级内容作了重点讲解。全书通过启发性的问题、精彩的结果和待解决问题来引导读者挑战此领域中的高层次问题。新版的一大亮点是增加了更多习题、教辅资料和部分习题解答,更加有利于教学。 全书叙述由浅......一起来看看 《计算理论导引》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具