Переосмысливая
подход к
инфраструктурному коду
Евгений Пивень
IPONWEB
Проект IPONWEB
Особенности инфраструктурного кода
• Декларативность
Декларативность
file { '/etc/my.cnf':
ensure => file,
content => file('mysql/my.cnf'),
owner => 'root',
group => 'root',
mode => '0640',
}
Особенности инфраструктурного кода
• Декларативность
• Управление ресурсами
Управление ресурсами
cron { 'run_task':
minute => 5,
}
cron { 'run_task_differently':
minute => [ 0, 20, 40 ],
}
Особенности инфраструктурного кода
• Декларативность
• Управление ресурсами
• Неожиданные последствия изменений
Неожиданные последствия изменений
/etc/init.d/mongod
- chown mongo.mongo "$PIDDIR"
+ chown mongo:mongo "$PIDDIR"
Наш опыт
Common
• Auto-deploy
• Всё в одном
• Поддержка старой и новой логики
• "Smoke testing"
Working Effectively with Legacy Code
by Michael C. Feathers
Working Effectively with Legacy Code
by Michael C. Feathers
... боль
Разбиваем монолитный legacy
Тестируем модули
• validate / lint
Тестируем модули
• validate / lint
• Unit-тесты
Unit-тесты
it {
is_expected.to contain_package('nginx')
.with_ensure('1.12.2')
}
Тестируем модули
• validate / lint
• Unit-тесты
• gendoc
gendoc
puppet-strings + puppet2conf -> Confluence
Решаем проблемы по дороге
• Атомарность операций
Атомарность операций – PURGE
resources { 'cron':
purge => true,
}
Атомарность операций – PURGE
file { '/etc/apt/sources.list.d':
purge => true,
recurse => true,
}
Решаем проблемы по дороге
• Атомарность операций
• Рестарты сервисов
D.R.Y - профили
D.R.Y - профили
node /^web-/ {
include accounts
include apt
include puppet
include nginx
include monitoring::nginx
include metrics::nginx
}
D.R.Y - профили
class profile::nginx {
include profile::base
include nginx
include monitoring::nginx
include metrics::nginx
}
node /^web-/ {
include profile::nginx
}
Hiera
Тестируем проектный код
• Unit-тесты проекта
"init"
Тестирование проекта
• Дублированные / потерянные ресурсы
• Циклические зависимости
Release
• Больше никаких авто-деплоев
• Все модули протестированы
• Changelogs
Что дальше?
• Acceptance
Acceptance
it 'is idempotent' { ... }
Acceptance
it 'is idempotent' { ... }
it 'installs correct nginx version' { ... }
it 'listens on port 80' { ... }
it 'responds with correct HTML' { ... }
Что дальше?
• Acceptance
• Integration
Что дальше?
• Acceptance
• Integration
• Изменения
Выводы
• Legacy код можно победить
• CI для инфраструктурного кода
• Осторожно с CD
$ whoami
t.me/pegas
http://epiven.pro
Вопросы?

Переосмысливая подход к инфраструктурному коду / Евгений Пивень (IPONWEB)