当前位置: 首页 > 科技观察

如何用分子测试AnsibleRoles_0

时间:2023-03-19 23:02:25 科技观察

【.com快译】测试技术在软件开发中扮演着重要的角色,当我们谈论基础架构即代码(IaC)时也是如此。开发人员总是在测试,需要不断的反馈来推动开发。如果获得有关更改的反馈需要时间,那么您的步骤可能太大而无法发现错误。小步骤和快速反馈是TDD(测试驱动开发)的精髓。但是,您如何将这种方法应用于开发特定的剧本或角色呢?在开发自动化时,典型的工作流程从一个新的虚拟机开始。我使用Vagrant来说明这个想法,但您可以使用libvirt、Docker、VirtualBox、VMware、私有云或公共云中的实例,或者在数据中心管理程序(例如oVirt、Xen或VMware)中配置的虚拟机。在决定使用哪个虚拟机时,应考虑反馈的速度和与您的实际目标环境的相似性。Vagrant的最低起点是:vagrantinitcentos/7#oranyotherbox然后将Ansible配置添加到你的Vagrantfile:config.vm.provision"ansible"do|ansible|ansible.playbook="playbook.yml"end***,你的工作流程将是这样的:1.vagrantup。2.编辑剧本。3.流浪者规定。4.vagrantssh验证虚拟机状态。5.重复步骤2到4。偶尔销毁并重新启动VM(vagrantdestroy-f;vagrantup)以提高playbook的可靠性(即测试您的自动化是否正在端到端运行)。虽然这是一个很棒的工作流程,但您仍然需要完成所有连接到虚拟机并验证一切是否按预期工作的棘手工作。如果测试不是自动化的,那么当您没有自动化的基础架构时,就会遇到类似的问题。幸运的是,像Testinfra和Goss这样的工具有助于自动化这些验证。我将专注于Testinfra,因为它是用Python编写的,并且是Molecule的默认验证器。这个想法很简单:使用Python来自动化您的验证。deftest_nginx_is_installed(host):nginx=host.package("nginx")assertnginx.is_installedassertnginx.version.startswith("1.2")deftest_nginx_running_and_enabled(host):nginx=host.service("nginx")assertnginx.is_runningassertnginx.is_enabled开发环境,这个脚本会使用SSH(就像Ansible一样)连接到目标主机来执行上面的验证(包存在/版本和服务状态):py.test--connection=ssh--hosts=server简而言之,在在架构自动化开发过程中,面临的挑战是提供新的基础设施,针对它们执行剧本,并验证您的更改是否反映了您在剧本中声明的状态。Testinfra可以验证什么?从用户的角度来看,基础设施已安装并正在运行(例如,HTTPD或Nginx正在响应请求,MariaDB或PostgreSQL正在处理SQL查询)。操作系统服务正在运行并已启用进程正在侦听特定端口进程正在响应请求使用模板正确复制或生成配置文件为确保服务器状态正确所做的几乎所有操作这些自动化测试提供了哪些保护措施?执行复杂的更改或在不破坏现有行为的情况下引入新功能(例如,添加对基于Debian的系统的支持,同时仍在基于RHEL的发行版中运行)。在发布新版本的Ansible并引入新的最佳实践时重构/改进代码库。到目前为止,我们使用Vagrant、Ansible和Testinfra所做的工作很容易对应于四阶段测试模式中描述的步骤——这种测试结构方法使测试目标变得清晰。它包括以下阶段:设置、演练、验证和拆解:设置:为测试执行准备环境(例如启动新的虚拟机):vagrantup演练:针对被测系统(即Ansible剧本)有效执行代码:vagrantprovisionValidation:ValidateOutputfrompreviousstep:py.test(forTestinfra)Demolition:Returntopre-installstate:vagrantdestroy我们用于特定剧本的相同想法可以应用于角色开发和测试,但我们是否需要执行所有这些步骤?如果您想使用容器或OpenStack而不是Vagrant怎么办?如果您更愿意使用Goss而不是Testinfra怎么办?您如何针对代码中的每次更改连续运行它?有没有更简单快捷的方法来使用自动化测试来开发剧本和角色?MoleculeMolecule使用测试来帮助培养角色。该工具甚至可以使用测试用例初始化新角色:moleculeinitrole--role-namefoo。Molecule足够灵活,您可以为您的基础架构配置使用不同的驱动程序,包括Docker、Vagrant、OpenStack、GCE、EC2和Azure。它还允许使用不同的服务器验证工具,包括Testinfra和Goss。它的命令简化了开发工作流程中常见任务的执行:lint-执行yaml-lint、ansible-lint和flake8,如果有语法问题则报告错误-验证角色的语法错误创建-创建驱动程序配置实例准备-使用preparationplaybook配置实例converge-executetheplaybookidempotenceforthehost-执行两次playbook;如果第二次运行有变化,会失败(非幂等)verify-执行服务器状态验证工具(testinfra或goss)destroy-销毁实例test-执行前面的所有步骤login命令可以用来连接到已配置的服务器以进行故障排除。您如何逐步从完全没有测试到为每次更改/提交执行的体面的代码库?1.virtualenv(可选)virtualenv工具创建隔离环境,而virtualenvwrapper是一个扩展的集合,有助于使用virtualenv。这些工具可以防止Molecule与计算机中其他Python包之间的依赖关系和冲突。sudopipinstallvirtualenvwrapperexportWORKON_HOME=~/envssource/usr/local/bin/virtualenvwrapper.shmkvirtualenvmocule2.Molecule使用Docker驱动程序安装Molecule:pipinstallmoleculeansibledocker-py使用测试场景生成新角色:moleculeinitrole-role_name或为现有角色:moleculeinitscenrole所有必要的配置是使用您的角色生成,您只需使用Testinfra编写测试用例:=host.service('wildfly')assertjboss.is_enableddeftest_jboss_listening_http(host):socket=host.socket('tcp://0.0.0.0:8080')assertsocket.is_listeningdeftest_mgmt_user_authentication(host):command="""curl--digest-L-D-http://localhost:9990/management\-uansible:ansible"""cmd=host.run(command)assert'HTTP/1.1200OK'incmd.stdoutThisexampletestcasefortheWildflyrole验证t帽子操作系统服务已启用,进程正在侦听端口8080,并且身份验证已正确配置。为这些测试编写代码很简单,您基本上需要想出一种自动验证方法。当您登录到一台机器时,您已经在编写测试,该机器是剧本的目标或为监控/警报系统构建验证。这有助于使用TestinfraAPI或使用系统命令构建内容。通过CI连续执行分子测试很简单。上面的例子是针对带有Docker驱动程序的TravisCI,但它可以很容易地适应任何CI服务器和Molecule支持的任何基础设施驱动程序。---sudo:requiredlanguage:pythonservices:-dockerbefore_install:-sudoapt-get-qqupdate-pipinstallmolecule-pipinstalldocker-pyscript:-moleculetest访问TravisCI以获取示例输出。原标题:TestingAnsibleroleswithMolecule,作者:JairodaSilvaJunior