В этом репозитории находится шаблон control repo, который мы в Авито используем в своей Puppet-инфраструктуре.
Выложен в ознакомительных целях к статье «Инфраструктура как Код в Авито: уроки, которые мы извлекли». Разработка ведётся внутри Авито, этот репозиторий будет поддерживаться по мере возможностей.
├── data # данные для hiera
├── Dockerfile.acceptance # Dockerfile для тестирования Puppet кода в докере
├── docs # документация
│ └── avito-coding-standards.md # Coding-standards для control repo
├── environment.conf # настройки для работы Puppet окружений
├── Gemfile # ruby-зависимости для работы с проектом
├── hiera.yaml # конфиг файл для hiera
├── manifests
│ └── site.pp # здесь содержится логика применения ролей на ноды по данным из ENC
├── Puppetfile # здесь подключаются зависимые модули
├── Rakefile
├── README.md
├── scripts
│ └── config_version.rb # логика генерации версии изменений (используется commit hashs)
├── site
│ ├── profile # профили кладутся сюда, структура директории аналогична структуре модуля
│ └── role # роли кладутся сюда, структура директории аналогична структуре модуля
├── spec # тесты (см. docs/puppet-code-testing.md)
│ ├── acceptance # acceptance тесты
│ ├── classes # юнит тесты (rspec-puppet)
│ ├── default_facts.yml # факты для rspec-puppet
│ ├── fixtures # фикстуры для rspec-puppet
│ └── spec_helper.rb
├── .overcommit.yml # настройки для overcommit (инструмент для запуска git хуков)
├── .fixtures.yml # фикстуры для puppet-rspec тестов
└── .kitchen.yml # конфигурация test-kitchen
Для того, чтобы воспользоваться этим шаблоном в своём проекте потребуется его доработка — некоторые его части мы не стали выкладывать в opensource, т.к. они содержат вещи слишком специфичные для нашей инфраструктуры и вряд ли могут быть полезны в других проектах.
Те места, которые необходимо исправить при адаптировании шаблона в свою инфраструктуру помечены комментариями как FIXME.
Для использования шаблона в своих проектах нужно написать роль для самого паппетсервера (он также управляется паппетом), на который раскладывается этот код. Для этого неплохо подойдёт модуль theforeman/puppet. Мы используем этот модуль у себя, написав модуль-обертку. Наш модуль устанавливает и настраивает puppetserver, доставляет ssh ключи для работы с VCS, устанавливает и настраивает компоненты для CD паппет кода.
Из opensorce модулей для доставки кода можно воспользоваться модулем puppet/r10k. Для выкатки кода в этом модуле используется r10k и webhook, который принимает события от различных VCS и выкатывает окружения.
Перед началом работы нужно установить все зависимости через bundler:
bundle install
Проверка синтаксиса:
bundle exec rake validate
Запуск puppet-линтера:
bundle exec rake lint
Запуск ruby-линтера:
bundle exec rake rubocop
Настройки ruby линтера находятся в .rubocop.yml
Юнит-тестирование (rspec-puppet):
Юнит тесты находятся в директории spec/{classes, defines,functions}. Более подробно про юнит тесты можно прочитать по ссылкам:
Запуск юнит тестов:
bundle exec rake spec
Удаление фикстур:
bundle exec rake spec_clean
Подготовка фикстур:
bundle exec rake spec_prep
Acceptance тестирование (testkitchen)
Acceptance тесты запускаются в Docker, настройки testkitchen находятся в файле .kitchen.yml. Используется Kitchen Puppet.
bundle exec kitchen test -t spec/acceptance
Для управления git-хуками используется overcommit. Настройки git-хуков находятся в .overcommit.yml.
Puppet control repo coding standards — стандарты кодирования для control repo в Avito