Vagrant环境的自动化测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vagrant环境的自动化测试相关的知识,希望对你有一定的参考价值。

在许多项目中,我使用Vagrant和Puppet来获得用于开发的实时环境的副本。有时特别是在小型项目中,我经常需要进行更改,我重新配置了流浪盒,但它失败了!

是否有可能使用持续集成测试Vagrant框?

我需要检查盒子没有错误,并运行一些自定义测试,如打开一个网页。

答案

Vagrant vs other choices for acceptance testing

在详细介绍之前,Vagrant绝对是本地验收测试的首选,因为它非常易于设置。但是,在CI环境中进行测试要困难得多,因为您必须设置所有各种部分才能使其正常工作(Ruby,Vagrant,Virtualbox等)。 Docker是一个很好的选择,因为它很轻巧,而且很多CI工具都内置了基于Docker的测试(例如Travis,Gitlab CI,CircleCI)。

我详细介绍了使用Docker的here。它并不完美,因为容器不是真正的机器:你不能测试像sysctl或swap这样的东西。但它有利于测试基本的Puppet模块(包,配置文件服务)。

您有两个主要选择来测试您的Puppet代码:

Beaker-rspec

Beaker是Puppet的Release Engineering团队编写的一个工具,用于测试Puppet Enterprise堆栈。后来Beaker-rspec诞生了,为Puppet模块测试提供了更像rspec的体验。

您编写的验收测试如下所示:

require 'spec_helper_acceptance'

describe 'cockpit class' do

  context 'default parameters' do
    # Using puppet_apply as a helper
    it 'should work idempotently with no errors' do
      pp = <<-EOS
      class { '::cockpit': }
      EOS

      # Run it twice and test for idempotency
      apply_manifest(pp, :catch_failures => true)
      apply_manifest(pp, :catch_changes => true)
    end

    describe package('cockpit') do
      it { is_expected.to be_installed }
    end

    describe service('cockpit') do
      # it { is_expected.to be_enabled }
      it { is_expected.to be_running }
    end

    context 'Cockpit should be running on the default port' do
      describe command('sleep 15 && echo "Give Cockpit time to start"') do
        its(:exit_status) { should eq 0 }
      end

      describe command('curl 0.0.0.0:9090/') do
        its(:stdout) { should match /Cockpit/ }
      end
    end
  end

end

然后针对选定的“管理程序”运行测试。所以在你的情况下,这将是流浪汉,我假设使用Virtualbox。

您配置主机配置文件,如下所示:

HOSTS:
  centos-72-x64:
    roles:
      - master
    platform: el-7-x86_64
    box: puppetlabs/centos-7.2-64-nocm
    hypervisor: vagrant
CONFIG:
  type: foss

然后使用环境变量调用测试来选择要安装的Puppet版本等(它将默认为Puppet的最新版本以及您设置为默认的任何框):

$ PUPPET_INSTALL_VERSION="1.5.2" PUPPET_INSTALL_TYPE=agent BEAKER_set="centos-7-x64" bundle exec rake acceptance
/Users/petersouter/.rbenv/versions/2.3.3/bin/ruby -I/Users/petersouter/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/lib:/Users/petersouter/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/rspec-support-3.5.0/lib /Users/petersouter/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/exe/rspec spec/acceptance
/Users/petersouter/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/beaker-rspec-5.3.0/lib/beaker-rspec/helpers/serverspec.rb:43: warning: already initialized constant Module::VALID_OPTIONS_KEYS
/Users/petersouter/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/specinfra-2.67.2/lib/specinfra/configuration.rb:4: warning: previous definition of VALID_OPTIONS_KEYS was here
Beaker::Hypervisor, found some vagrant boxes to create
==> centos-72-x64: VM not created. Moving on...
Bringing machine 'centos-72-x64' up with 'virtualbox' provider...
==> centos-72-x64: Importing base box 'puppetlabs/centos-7.2-64-nocm'...

有很多输出(我将我的日志设置为详细,但你也可以让它只在失败时显示),但最终你会得到一个通过测试:

以下是我在Serverfault上给出的Beaker-rspec的答案:

以下是解释Beaker-rspec和Puppet的其他一些链接:

Test-kitchen

test-kitchen实际上是一个Chef工具,但有人将它分叉以支持Puppet(和Ansible)。我没有这方面的经验,但基本上它以非常类似的方式工作:你设置一个配置来测试,比如Vagrant盒子,然后以spec文件的形式编写测试:

require 'serverspec'

include Serverspec::Helper::Exec
include Serverspec::Helper::DetectOS

RSpec.configure do |c|
  c.before :all do
    c.path = '/sbin:/usr/sbin'
  end
end

describe package('ntp') do
  it { should be_installed }
end

describe service('ntp') do
  it { should be_running }
end

这里有一些很好的链接:

以上是关于Vagrant环境的自动化测试的主要内容,如果未能解决你的问题,请参考以下文章

vagrant初识

Vagrant

使用Vagrant来管理开发和生产环境?

[转帖]Vagrant 入门指南

Vagrant 安装Oracle19c RAC测试环境的简单学习

Windows使用Vagrant和Virtual Box安装centos