/control-repo

A puppet control repository example with tests

Primary LanguageRubyApache License 2.0Apache-2.0

Это пример control-repo для puppet с тестами.

Чтобы попробовать, вам надо выполнить следующие команды находясь в корне этого репозитория:

bundle install
bundle exec r10k puppetfile install

Чтобы проверить что у вас работают тесты, вам надо запустить команду:

bundle exec rspec spec/hosts/ spec/classes/

Ниже описание как это все работает.

Важные файлы:

  • Puppetfile - файл, в котором вы указываете какие puppet модули подключать.
  • Gemfile - какие gem использовать.
  • spec/spec_helper.rb - основа всех тестов. Самое главное - пути, если их настроить не правильно, ничего работать не будет:
RSpec.configure do |c|
    c.module_path     = File.join(base_dir, 'fixtures/modules') + ':' + File.join(base_dir, '../modules') + ':' + File.join(base_dir, '../site')
  puts c.module_path
  c.manifest        = File.join('manifests', 'site.pp')
  c.hiera_config    = File.join(base_dir, '../hiera.yaml')
  c.default_facts   = YAML.load_file File.join(base_dir, '/default_facts.yaml')
end
  • spec/default_facts.yaml - дефолтные факты, которые пригодятся при тестировании.
  • Сами тесты кладутся в директории:
    • spec/classes - тесты классов
    • spec/hosts - тесты хостов
    • spec/defines - тесты определений
    • spec/functions - тесты ваших функций
  • spec/fixtures - сюда можно положить файлы (классы), которые, например, отсутсвуют в вашем репозитории, в моем случае это файл с секретами.
  • В файле manifests/site.pp заведен специальный хост обманка для тестов
    node this.is.only.used.for.unit.tests { }, чтобы тесты не пытались вытащить определение для дефолтной ноды.

Вот в принципе и все.

Осталось раскрыть вопрос что делать, если у вас уже 500 профилей и 1000 нод, а тестов для них нет.
И я могу рассказать что делал я.
Есть отличная программа, которая выполнит за вас 80% работы по написанию тестов к уже существующим классам: https://github.com/nwops/puppet-retrospec , достаточно написать обертку над ней и использовать ее, что я и сделал.
У меня сейчас тестируется 45 уникальных хостов из 400 (да, всего 10%, но это самые важные 10%) и 54 класс из 500.

Бонус для тех кто дочитал до конца.

Конечно вручную все это запускать не интересно, надо автоматизировать.
Для этого я использую GitLab.
Посмотрите в файл .gitlab-ci.yml, там не большой пример как это можно сделать.

И да, есть следующий уровень тестирования, который подходит уже и для тех, у кого не паппет, и для тех, у кого паппет, но хочет заморочиться.
Это https://serverspec.org, он позволяет сходить на сервер и проверить, что там все действительно так, как описано в файле конфигурации.
Или https://github.com/aelsabbahy/goss, который может сначала сформировать файл конфигурации из существующиего сервера, а потом тестировать что оно соответствует ему. И для него все равно чем вы наливаете сервер.
Есть еще и другие инструменты тестирования стейта сервера, это те, которые мне пришли сразу на ум.