如何借助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角色》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Concepts, Techniques, and Models of Computer Programming

Concepts, Techniques, and Models of Computer Programming

Peter Van Roy、Seif Haridi / The MIT Press / 2004-2-20 / USD 78.00

This innovative text presents computer programming as a unified discipline in a way that is both practical and scientifically sound. The book focuses on techniques of lasting value and explains them p......一起来看看 《Concepts, Techniques, and Models of Computer Programming》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具