DevOps практики
в разработке приложений
для бизнеса
Максим Пашук
Проект
CRM-система
7 стран
9 сервисов
3k пользователей
Всё просто
ASP.NET
MVC
Web
Server
Admin
Confluence
App
config
5-10 мин
Недостатки
Человеческий фактор
Инертность сознания
Всё сложно
ASP.NET
MVC
Service1
Service2
Country1
Country2
CountryN
Country1
Country2
CountryN
Admin
Server1
Server2
ServerN
30-60 мин
Мы стали медленнее
Overhead по инфраструктуре
Дольше тестируем
Заказчик недоволен
release
feedback
release
feedback
release
release
feedback
feedback
DevOps
Быстрая доставка изменений заказчику
Уменьшение стоимости доставки
Это agile в администрировании
Культура общения dev и ops
Автоматизация
Continuous Integration
Юнит-тесты
Статический анализ кода
Общий стиль кода
Метрики кода
Быстрый feedback
Dev TeamCity
Continuous Delivery
Configure
Server
Deploy App
Configure
App
Continuous
Integration
Ищем инструменты
chef, puppet, ansible, capistrano
Слабая поддержка Windows
Уникальные знания
Хочется родного
PowerShell (Ops)
Простой
Path.Combine(path1,	
  path2);
Join-Path $path1 $path2
vs
PowerShell (Ops)
Однострочники
Get-VM | Start-VM | Stop-VM
Стандартные модули
IIS, SQL Server, NetApp, etc.
PowerShell (Dev)
.NET runtime
Работа с .NET библиотеками (!)
Процедурное программирование
Add-Type 'any.net.dll'
[string]::IsNullOrEmpty()
function Add($x, $y){$x + $y}
Automate Everything
Confluence PowerShell
PowerShell
Modules
Version Everything
История изменений
Версионирование знаний
Версионирование инфраструктуры
Infrastructure As Code
$Environments=@{
'Env1'=@{};
'Env2'=@{}
}
Уровень 1
$Environments=@{
'Env1'=@{'Host'='Host1'};
'Env2'=@{'Host'='Host2'}
}
Уровень 2
Infrastructure As Code
Можно обратиться
$Environments['Production']
['Russia']
['OrderValidation']
['Hosts']
$Environments['Env1']['Host']
Реальный пример
PowerShell Remoting
Аналог ssh
Не нужно доп. агентов
Передача файлов
Configuration service
Configuration
Service
pull App
Apppush Configuration
Service
Configuration service
Master config
<configuration>	
  
	
  	
  <appSettings>	
  
	
  	
  	
  	
  <add	
  
	
  key="BusinessModel"	
  
	
  value="Russia"/>	
  
	
  	
  </appSettings>	
  
</configuration>
XDT transform <configuration>	
  
	
  	
  <appSettings>	
  
	
  	
  	
  	
  <add	
  
	
  key="BusinessModel"	
  
	
  value="Cyprus"	
  
	
  xdt:Transform="SetAttributes"	
  
	
  xdt:Locator="Match(key)"/>	
  
	
  	
  </appSettings>	
  
</configuration>
Configuration service
PM> Install-Package Microsoft.Web.Xdt
NuGet
PowerShell
Add-Type 'Microsoft.Web.XmlTransform.dll'
Сложный код
psake (https://github.com/psake/psake)
Powershell не хватает
Только процедурный стиль
psake
Task выполняется один раз
Task может зависеть от другого task
task Task1 -depends Task2, Task3
task Task4 -depends Task1, Task3
psake
Pre-post conditions
task Migrate-Elasticsearch `
-precondition `
{ $metadata['HasElasticsearch'] }
{
...
}
psake
Оркестровка процесса доставки
task Deliver -depends `
Create-Infrastructure, `
Configure-Infrastructure, `
Deploy-Services, `
Configure-Services
Всё вместе
psake
Remote
Management
Infrastructure
as Code Server1
Server2
ServerNConfiguration
service
PowerShell
TeamCity
UI
Continuous Delivery
Automate everything
Version everything
PowerShell
Team Business
Что дальше
Continuous Deployment
Continuous Monitoring
Максим Пашук
m.pashuk@2gis.ru
Спасибо
Задай вопрос, не стесняйся

Devops-практики в разработке решений для бизнеса, Максим Пашук