测试技术在软件开发中扮演着重要角色,我们谈论基础设施即代码(IaC)时也一样。
成都创新互联公司是一家专业提供呼中企业网站建设,专注与网站设计制作、网站建设、H5响应式网站、小程序制作等业务。10年已为呼中众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。
开发人员总是在测试,需要不断的反馈来促进开发。如果获得变更方面的反馈很费时间,表明你的步骤可能太庞大,难以发现错误。小步骤和快速反馈是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中声明的状态。
到目前为止,我们对Vagrant、Ansible和Testinfra所做的工作很容易与四阶段测试模式中描述的步骤对应起来――这种测试结构方法使测试目标清晰。它包括下列阶段:安装、演练、验证和拆除:
- vagrant up
- 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。
它的命令简化了开发工作流程中常用任务的执行:
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以获取示例输出。
分享名称:如何借助Molecule测试Ansible角色
文章出自:http://www.shufengxianlan.com/qtweb/news15/64515.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联