Ansible и serverspec

2014/05/22

Когда я готовил playbook для своего VPS, я взял за основу Sovereign. В этом репозитории меня заинтересовал файл tests.py, содержащий тесты для результирующего сервера. У меня сразу же возник вопрос - почему тесты самописные, на голом Python, а не на каком-нибудь готовом решении. Я решил изучить, что же есть сейчас для TDD-администрирования. Оказалось, что толком ничего и нет, а то, что есть - для Ansible не особо нужно.

Для начала, что есть. Тут все скучно, есть serverspec, и envassert. Оба эти инструмента предоставляют возможность декларативно описать требуемое состояние удаленного сервера, и проверить его соответствие реальности по ssh.

Вот пример для serverspec с официального сайта:

:::ruby
require 'spec_helper'

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

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

describe port(80) do
  it { should be_listening }
end

describe file('/etc/httpd/conf/httpd.conf') do
  it { should be_file }
  its(:content) { should match /ServerName www.example.jp/ }
end

Все чудесно, и для того же Chef это отличный инструмент, поскольку сам Chef провоцирует писать императивный код на Ruby, который хорошо было бы проверять простым декларативным описанием.

Но в случае Ansible, наш playbook уже содержит декларативное описание требуемого состояния.

Вот фрагмент роли Nginx для Ansible.

:::yaml
- name: Ensure nginx package is installed
  apt: pkg=nginx state=latest

- name: Ensure nginx service is enabled and started
  service: name=nginx state=started enabled=yes

- name: Place nginx.conf
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf mode=644
  notify:
    - reload nginx

Как можно заметить, описание Ansible не содержит только проверок портов, зато позволяет привести систему к описываемому виду, а не только проверить на соответствие.

Таким образом, имеет смысл использовать serverspec с Ansible только для проверки таких параметров, как слушающие порты, правила iptables, и настройки сетевых интерфейсов - все остальное Ansible и проверяет, и приводит к нужному состоянию. Но в боевой системе, или в staging-окружении, эти параметры и так будут проверяться системой мониторинга, причем на постоянной основе.

Видимо, именно поэтому репозиторий sovereign содержит самописные тесты, которые проверяют не столько состояние системы, сколько корректность работы сконфигурированных сервисов. К сожалению, инструмент, который бы облегчил задачу написания таких тестов, еще не написан, хотя было бы здорово расширить serverspec для проверки корректности работы HTTP-сервисов, либо imap-сервера, дополнить его более высокоуровневыми проверками.

Я для себя пока решил, что написание serverspec-тестов для Ansible избыточно при наличии staging-окружения с работающим мониторингом и фунциональными тестами, однако инструмент это явно полезный и перспективный.

Tags: Ansible serverspec Мнение

Categories: IT Russian