KitchenCI + Ansible для Windows и Linux

от автора

Мой коллега написал прекрасный блог о локальном тестировании ролей Ansible с использованием KitchenCI. Очень быстрый и простой инструмент, состоящий из ruby gem’ов, доступный на каждой ОС, который также работает с разными инструментами тестирования (например Serverspec и Pester). Коллега разрабатывал это решение под нужды своих проектов (provision и deploy исключительно под Windows), что на первый взгляд стало проблемой, потому что:

  • Я тоже люблю Ansible
  • Ansible мне нужен, чтобы управлять Linux
  • Я не хочу создавать еще один репозиторий на GitHub для отдельного тестирования Linux-ролей, потому что не хочу плодить сущности (Бритва Оккама наше все)

Кому интересно, что было дальше, прошу под кат.

После небольшой дискуссии мы договорились, что я адаптирую его инструмент под оба окружения, а конечный пользователь инструмента (будь то инженер или разработчик), сможет пользоваться всеми его компонентами или только частью. Но для начала — краткое описание, что работает сейчас.

А сейчас у нас имеется стандартная роль Ansible, в отдельной директории лежит kitchen, в котором расположены тесты Pester для тестирования конфигурации WinServer’а и настройки, собственно, самого kitchen. в файле .kitchen имеется 2 конфигурации для Vagrant box’ов (Ansible + Winserver), сценарии развертывания и пути до тестов. Кому интересно, исходники тут.

По 4 командам в директории kitchen, пройдет наше тестирование от начала и до конца.

  • kitchen create — создаст нашу локальную виртуальную инфраструктуру
  • kitchen converge — применит роли ansible
  • kitchen verifiy — применит тест suite из verifier’а
  • kitchen destroy — уберет за собой.

Первый раз будет выполняться невероятно долго (Windows box штука очень тяжелая), поэтому надо запастись терпением.

Важный момент, которые я забыл упомянуть: эта конфигурация — скелет роли, которую разработчик может изучить, чтобы понять как ему разрабатывать и тестировать свою роль. Я не представляю себе кейс, когда разработчик разрабатывает одну роль, которая должна работать на обеих экосистемах.

Но тем не менее, корпоративный GitHub не резиновый, поэтому надо немного экономить.
Начнем с того, что мы настроим роль playbook’а, чтобы она была универсальна для обеих ОС. Здесь нам помогут банальные факты Ansible.

--- # This play installs IIS, if you run it on windows box   - name: install web-server feature     win_feature:       name: Web-Server       state: present     when: ansible_os_family == "Windows"    - name: deploy iis start page template     template:       src: iisstart.j2       dest: C:\inetpub\wwwroot\iisstart.htm     when: ansible_os_family == "Windows"  # This play installs Nginx, if you run it on linux box   - name: install nginx     yum: name=nginx state=latest     when: ansible_os_family == "RedHat"    - name: start nginx     service: name=nginx state=started enabled=True     when: ansible_os_family == "RedHat" 

Как видно, в первой случае мы устанавливаем в Windows роль IIS, во втором — устанавливаем и запускаем Nginx.

Теперь к тестам. Создаем новую директорию в kitchen/tests/integration/default (default — это название нашего тест suit’a) под названием serverspec. В нем у нас будет всего один файл defailt_spec.rb

Я не очень силен в ruby, поэтому сделал грязно без spec-helper’а

require 'rubygems' require 'bundler/setup'  require 'serverspec' require 'pathname' require 'net/ssh'  RSpec.configure do |config|   set :host, ENV['KITCHEN_HOSTNAME']   # ssh options at http://net-ssh.github.io/net-ssh/Net/SSH.html#method-c-start   # ssh via ssh key (only)   set :ssh_options,     :user => ENV['KITCHEN_USERNAME'],     :port => ENV['KITCHEN_PORT'],     :auth_methods => [ 'publickey' ],     :keys => [ ENV['KITCHEN_SSH_KEY'] ],     :keys_only => true,     :paranoid => false,     :verbose => :error   set :backend, :ssh   set :request_pty, true end  describe package('nginx'), :if => os[:family] == 'redhat' do   it { should be_installed } end  describe service('nginx'), :if => os[:family] == 'redhat' do   it { should be_enabled }   it { should be_running } end  describe port(80) do   it { should be_listening } end 

Здесь у нас всего три проверки: пакет установлен, служба запущена и на автостарте, и на порту 80 кто-то слушает.

Небольшой совет тем, кто, как и я, не умеет в Ruby — согласно документации serverspec-init сгенерирует вам дефолтный тест, как в примере выше.

Итак, роль — есть, тесты — есть. Теперь надо настроить саму кухню. Коллега вынужден поднимать две машины, поскольку развернуть маленький ansible сервер гораздо проще, чем установить его на Windows. В моем же случае устанавливать ansible роль будет сам kitchen, поэтому мне хватит одной машинки. Мой скрипт kitchen будет поменьше.

--- driver:   name: vagrant   gui: true   linked_clone: true  platforms:   - name: centos_box     driver_plugin: vagrant     driver_config:       box: centos/7       network:       - [ 'private_network', { ip: '172.28.128.13' } ]     transport:       max_ssh_sessions: 1     provisioner:       name: ansible_playbook       roles_path: ../       role_name: kitchen_test_role       ansible_inventory: inventory/hosts       require_windows_support: true       require_chef_for_busser: false       ansible_host_key_checking: false       ansible_verbose: true       ansible_verbosity: 4       playbook: default_linux.yml     verifier:       name: serverspec       remote_exec: false   suites:   - name: default     verifier:       patterns:       - tests/integration/default/serverspec/default_spec.rb

У меня отдельный ansible_playbook, поскольку в нем роль выполняется только для linux машины в инвентарном файле.

С разработкой в общем-то и покончено. А объяснить kitchen’у какой конфигурацией пользовать довольно легко. Нужно перед выполнением команды kitchen передать ей переменную окружения KITCHEN_YAML=«имя_нашей_конфигурации».

Например:

KITCHEN_YAML=".kitchen_linux.yml" kitchen create/converge/verify/destroy. 

Благодарю за внимание.
ссылка на оригинал статьи https://habrahabr.ru/post/316700/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *