Статьи

Тестирование кукольных модулей


Есть несколько шагов в зависимости от того, насколько сложны тесты, какие части тестируются и, конечно же, сколько времени потребуется для выполнения тестов.

Для модульного тестирования мы используем rspec puppet и можем проверить, что наши манифесты и модули компилируются и содержат ожидаемые значения. Его можно использовать для проверки того, что конкретные типы, классы или определения находятся в скомпилированном каталоге и что параметры соответствуют ожиданиям.

Позже мы можем провести некоторое интеграционное тестирование, запустив новую виртуальную машину с Vagrant и проверив, нет ли ошибок при инициализации, а также проверив, что некоторые условия выполнены.

Для rspec-puppet PuppetLabs создала проект под названием puppetlabs_spec_helper, который позволит нам не писать кучу шаблонов. Недостатком является то, что он позволяет использовать только модули для тестирования из git. Если вы уже используете librarian-puppet (и вам следует!), Вы можете легко использовать один и тот же Puppetfile для развертывания модулей и их тестирования. В противном случае звучит как бесполезное тестирование, вы можете закончить разными версиями на разных машинах разработки, CI-сервере, мастере кукол… Так что просто добавьте в библиотеку rakefile вызов библиотекаря puppet, чтобы заполнить фиксации rspec-puppet, прежде чем запускать спецификации. ,

К сожалению, rspec-puppet не работает с Puppet 3.0.x, и требуется как минимум Puppet 3.1.0-rc1. Это было немного неудачно, когда мы перешли на Puppet 3 и начали использовать hiera , который оказывается очень полезным, когда у нас есть более простые манифесты и внешние данные, вводимые для наших установок Maestro с Puppet с нуля.

Вы также можете использовать тот же Puppetfile для запуска Vagrant-боксов с точно такой же версией модулей. Мы используем Cucumber и Aruba для выполнения vagrant, обеспечения виртуальной машины марионеткой и проверки нескольких вещей, таких как открытые порты, сервисы,… но это другая история:-)

пример

В этом проекте puppet-for-java-devs вы найдете фрагменты, которые демонстрируют все эти интегрированные инструменты. Он включает в себя определение трехуровневой системы с определениями Puppet для базы данных postgresql, узлов tomcat с установленной войной и узлов apache, стоящих перед ними.

Установите все необходимые драгоценные камни

bundle install

Установите все модули Puppet с помощью Puppet Librarian

librarian-puppet install

Запустите спецификации с Puppet-rspec

bundle exec rake

Начать все VMS с Vagrant

vagrant up

Rakefile

require 'bundler'
Bundler.require(:rake)
require 'rake/clean'




require 'puppetlabs_spec_helper/rake_tasks'




CLEAN.include('modules', 'spec/fixtures/', 'doc')
CLOBBER.include('.tmp', '.librarian')




task :librarian_spec_prep do
 sh "librarian-puppet install"
end
task :spec_prep => :librarian_spec_prep




task :default => [:spec]

Кукольный файл для библиотекаря-кукольный

forge 'http://forge.puppetlabs.com'




mod 'puppetlabs/java', '0.1.6'
mod 'puppetlabs/apache', '0.4.0'
mod 'inkling/postgresql', '0.2.0'
mod 'puppetlabs/firewall', '0.0.4'
mod 'tomcat', :git => 'https://github.com/carlossg/puppet-tomcat.git', :ref => 'centos'
mod 'maestrodev/maven', '1.x'
mod 'stahnma/epel', '0.0.2'
mod 'maestrodev/avahi', '1.x'
mod 'other', :path => 'mymodules/other'

tomcat_spec.rb с rspec-puppet

require 'spec_helper'




describe 'tomcat1.acme.com' do
  let(:facts) { {:osfamily => 'RedHat', :operatingsystem => 'CentOS', :operatingsystemrelease => 6.3} }




  it { should contain_class('java').with_distribution /openjdk/ }




  it "configure webapp" do
    should contain_maven('/srv/tomcat/appfuse/webapps/ROOT.war')
    should contain_maven('/srv/tomcat/appfuse/webapps/ROOT/WEB-INF/lib/postgresql-9.1-901.jdbc4.jar')
  end
end

Vagrantfile

Vagrant::Config.run do |config|
  config.vm.box = "CentOS-6.3-x86_64-minimal"
  config.vm.box_url = "https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box"




  config.vm.customize ["modifyvm", :id, "--rtcuseutc", "on"] # use UTC clock https://github.com/mitchellh/vagrant/issues/912




  # db server
  config.vm.define :db do |config|
    config.vm.host_name = "db.acme.local"
    config.vm.customize ["modifyvm", :id, "--name", "db"] # name for VirtualBox GUI
    config.vm.forward_port 5432, 5432
    config.vm.network :hostonly, "192.168.33.10"
    config.vm.provision :puppet do |puppet|
      puppet.module_path = "modules"
      puppet.manifest_file = "site.pp"
    end
  end




  # tomcat server
  config.vm.define :tomcat1 do |config|
    config.vm.host_name = "tomcat1.acme.local"
    config.vm.customize ["modifyvm", :id, "--name", "tomcat1"] # name for VirtualBox GUI
    config.vm.forward_port 8080, 8081
    config.vm.network :hostonly, "192.168.33.11"
    config.vm.provision :puppet do |puppet|
      puppet.module_path = "modules"
      puppet.manifest_file = "site.pp"
    end
  end




  # web server
  config.vm.define :www do |config|
    config.vm.host_name = "www.acme.local"
    config.vm.customize ["modifyvm", :id, "--name", "www"] # name for VirtualBox GUI
    config.vm.forward_port 80, 8080
    config.vm.network :hostonly, "192.168.33.12"
    config.vm.provision :puppet do |puppet|
      puppet.module_path = "modules"
      puppet.manifest_file = "site.pp"
    end
  end




end