PowerShell DSC в корпоративной инфраструктуре: от первой конфигурации до Pull-сервера
Я Семёнов Евгений Сергеевич, директор АйТи Фреш, за 15+ лет работы с Windows-инфраструктурами внедрял DSC в разных объёмах — от десятка серверов в офисе на 50 РМ до нескольких сотен Windows-нод в распределённом парке. Desired State Configuration — это то, что избавляет от «у нас на таком-то сервере вручную поправили реестр, на другом — нет, и теперь они ведут себя по-разному». Я всегда предлагаю DSC, когда клиенту нужна гарантия, что сто серверов настроены одинаково — и остаются такими через год. В этой статье — честный разбор, как работает DSC, какие у него подводные камни и как я внедряю его на боевых проектах.
Что такое DSC и зачем он нужен
Desired State Configuration — декларативная модель управления конфигурацией. Вы описываете «я хочу, чтобы на этом сервере было установлено IIS, открыт порт 443, лежал такой-то файл, была создана такая-то локальная группа». DSC превращает это описание в MOF-файл (Managed Object Format) и передаёт Local Configuration Manager (LCM), который на узле применяет конфигурацию и поддерживает её в рабочем состоянии.
Преимущества против ручной настройки очевидны:
- Идемпотентность — применение одной и той же конфигурации много раз даёт один результат. Нет «у нас уже было применено, теперь сломается».
- Decorative — пишете «что должно быть», а не «как делать». LCM сам разбирается с командами.
- Drift detection — если кто-то руками поменял настройку, LCM в следующий цикл вернёт к правильному состоянию.
- Документация как код — конфигурация хранится в Git, через PR можно внести изменения, история видна.
Push vs Pull режимы
| Критерий | Push | Pull |
|---|---|---|
| Как доставляется MOF | Start-DscConfiguration с центральной машины | LCM сам скачивает с HTTPS Pull Server по расписанию |
| Требует инфраструктуру | Минимум — WinRM до узлов | IIS + репозиторий MOF + SSL-сертификат |
| Масштабируемость | Плохо от 50+ узлов | Сотни-тысячи узлов |
| Отчётность | Только по требованию | Автоматическая в Report Server |
| Удобно для | 10–30 серверов, одноразовые применения | Постоянное управление парком 50+ машин |
На небольших клиентах (до 30 серверов) у нас на практике достаточно Push-режима: пишем конфигурацию, применяем командой, через полгода-год повторяем при изменениях. На крупных — разворачиваем Pull Server с отчётностью.
Первая DSC-конфигурация в Push
Для начала установите модуль PSDscResources и напишите простой скрипт:
Install-Module -Name PSDscResources -Force
Install-Module -Name ComputerManagementDsc -Force
Configuration WebServer {
param([string[]]$NodeName = 'localhost')
Import-DscResource -ModuleName PSDesiredStateConfiguration
Import-DscResource -ModuleName PSDscResources
Node $NodeName {
WindowsFeature IIS {
Ensure = 'Present'
Name = 'Web-Server'
}
WindowsFeature ASP {
Ensure = 'Present'
Name = 'Web-Asp-Net45'
DependsOn = '[WindowsFeature]IIS'
}
Service W3SVC {
Name = 'W3SVC'
State = 'Running'
DependsOn = '[WindowsFeature]IIS'
}
File WebContent {
DestinationPath = 'C:\inetpub\wwwroot\corp.html'
Contents = 'ITFresh corporate web
'
Ensure = 'Present'
Type = 'File'
}
}
}
WebServer -NodeName 'srv-web01','srv-web02' -OutputPath C:\DSC\MOF
Start-DscConfiguration -Path C:\DSC\MOF -Wait -Verbose -Force
Через 30–60 секунд на обоих серверах будет установлен IIS, ASP.NET, запущена служба W3SVC и создан файл corp.html. Повторный запуск — ничего не сломает, LCM увидит, что всё уже в нужном состоянии.
Настройка LCM
LCM — демон на каждом узле, который принимает и применяет конфигурации. По умолчанию он в режиме Push с проверкой раз в 30 минут. Настраивается через мета-конфигурацию:
[DscLocalConfigurationManager()]
Configuration LcmSettings {
Node 'srv-web01' {
Settings {
ConfigurationMode = 'ApplyAndAutoCorrect' # чинить drift
ConfigurationModeFrequencyMins = 30
RefreshMode = 'Pull'
RefreshFrequencyMins = 15
RebootNodeIfNeeded = $true
ActionAfterReboot = 'ContinueConfiguration'
AllowModuleOverwrite = $true
}
ConfigurationRepositoryWeb PullSrv {
ServerURL = 'https://dsc.corp.itfresh.local:8080/PSDSCPullServer.svc'
RegistrationKey = 'a3f5e8b2-1234-4567-89ab-cdef01234567'
ConfigurationNames = @('WebServer')
}
ReportServerWeb ReportSrv {
ServerURL = 'https://dsc.corp.itfresh.local:8080/PSDSCPullServer.svc'
RegistrationKey = 'a3f5e8b2-1234-4567-89ab-cdef01234567'
}
}
}
LcmSettings -OutputPath C:\DSC\Meta
Set-DscLocalConfigurationManager -Path C:\DSC\Meta -Verbose
Ключевые режимы LCM:
- ApplyOnly — один раз применить и забыть (не следит за drift).
- ApplyAndMonitor — применяет, раз в интервал проверяет drift и пишет предупреждение в event log.
- ApplyAndAutoCorrect — применяет и автоматически исправляет drift. Мой любимый режим для критичных серверов.
Pull Server: центральный репозиторий
Развернуть DSC Pull Server на Windows Server 2019/2022:
Install-WindowsFeature -Name DSC-Service -IncludeManagementTools
Install-Module -Name xPSDesiredStateConfiguration -Force
Configuration DscPullServer {
Import-DscResource -ModuleName xPSDesiredStateConfiguration
Node localhost {
WindowsFeature DSCService { Name = 'DSC-Service'; Ensure = 'Present' }
xDscWebService PSDSCPullServer {
Ensure = 'Present'
EndpointName = 'PSDSCPullServer'
Port = 8080
PhysicalPath = "$env:SystemDrive\inetpub\PSDSCPullServer"
CertificateThumbPrint = 'AA:BB:CC:DD...' # thumbprint SSL
ModulePath = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Modules"
ConfigurationPath = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration"
State = 'Started'
UseSecurityBestPractices = $true
}
}
}
DscPullServer -OutputPath C:\DSC\Pull
Start-DscConfiguration -Path C:\DSC\Pull -Wait -Verbose -Force
После развёртывания Pull Server — кладёте MOF-файлы в каталог Configuration, считаете их чексумму (New-DscChecksum) и регистрируете узлы с их конфигурациями по GUID.
Полезные DSC-ресурсы из Gallery
У нас в проектах постоянно используются:
- ComputerManagementDsc — имя компьютера, часовой пояс, PowerPlan, перезагрузка, TimeSync.
- NetworkingDsc — IP-адреса, DNS, маршруты, firewall-правила.
- xActiveDirectory — установка роли, создание домена, GPO, OU, пользователи (с оговорками по безопасности).
- SqlServerDsc — установка и конфигурация SQL Server Engine и AlwaysOn.
- xWebAdministration — AppPool, Web Sites, Web Applications в IIS.
- CertificateDsc — импорт/создание сертификатов и привязка к сервисам.
- AuditPolicyDsc — правила аудита ОС для ИБ-стандартов.
Мини-кейс: стандартизация Windows Server 2022
В июне 2025 к нам пришла производственная компания — 38 Windows-серверов, половина 2019, половина 2022, все настроены по-разному: где-то Defender выключен, где-то RDP на стандартном порту, где-то Windows Update на автомате, где-то вручную. Задача: унифицировать базовую конфигурацию.
За полторы недели написали DSC-конфигурацию BaselineServer (firewall, RDP с NLA, Defender включён, часовой пояс МСК, NTP pool.ntp.org, логирование PowerShell, настройки WinRM с сертификатом) и прикрутили к Push-режиму. Серверы — Dell PowerEdge R750 с двумя Xeon Platinum 8280 и 40G Mellanox до хранилища в дата-центре МТС. Деплой на всех 38 машинах занял 35 минут. Через три месяца один админ восстановил старую привычку выключать Defender на одном из серверов — LCM вернул состояние через 15 минут, админ получил предупреждение и больше так не делал. Стоимость работ — 120 тыс. руб., ежегодная экономия рабочего времени на унификацию — около 80 часов.
Мониторинг и отладка
DSC — штука не самая дружелюбная при ошибках. Минимальный набор навыков:
# Текущее состояние и drift
Test-DscConfiguration -Detailed
# Последний запуск LCM
Get-DscConfigurationStatus | Select-Object -First 3
# Подробный лог
Get-WinEvent -LogName 'Microsoft-Windows-DSC/Operational' -MaxEvents 50
# Принудительный цикл
Update-DscConfiguration -Wait -Verbose
Отчёты с Pull Server агрегирует pwshReportingPortal или самописный PowerShell-скрипт, который парсит логи и складывает в Grafana/Power BI. Я всегда настраиваю алерт на ошибки LCM через EventLog subscription — чтобы админ узнавал за минуту, а не через неделю.
Типовые грабли
- Credentials в MOF в открытом виде. Без
ConfigurationDataс сертификатом DSC плюнет warning, а пароли в MOF будут читаемыми. Всегда настраивайте MOF-шифрование через сертификат. - Несовпадение версий модулей. На Pull Server лежит xWebAdministration 3.2.0, на узле — 3.1.0. LCM либо не применит, либо применит неправильно. Централизованно управляйте версиями.
- RebootNodeIfNeeded = $true без выходного окна. Ставите обновление — сервер уходит в перезагрузку в рабочее время. Всегда разносите применение и перезагрузку.
- Композитные ресурсы без тестов. Пишете свой Custom Resource — пишите Pester-тесты. Без тестов он сломается при первом изменении ОС.
- PSDesiredStateConfiguration v2 не работает в некоторых сценариях — для старых узлов оставляйте v1 совместимость или переходите на Ansible.
Внедрим DSC в вашу инфраструктуру
Разработаю DSC-конфигурации под ваши серверы, подниму Pull Server с отчётностью, обучу админов. От 10 до нескольких сотен Windows-нод, 15+ лет опыта с корпоративными Windows-инфраструктурами. При необходимости — хостинг Pull Server на выделенной ноде Dell с Xeon Platinum 8280 в дата-центре МТС на 40G аплинке Mellanox.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — частые вопросы по DSC
- Чем отличается DSC от Ansible/Puppet?
- DSC — родная технология Microsoft, глубоко интегрированная с Windows. Она легче для Windows-серверов, но беднее по ресурсам и интеграциям. Ansible — универсальный, кроссплатформенный, проще для смешанных парков Linux/Windows.
- Какую версию DSC использовать?
- Для продакшена сегодня — DSC v2 (PSDesiredStateConfiguration 2.x) в режиме Push. DSC v3 (Azure Automanage) новее, но пока годится только для Azure-гибридных сценариев. Pull-сервер встроенный в Windows Server объявлен устаревшим.
- Что такое LCM?
- Local Configuration Manager — демон на каждом управляемом узле. Он применяет MOF-файлы, периодически проверяет drift и отчитывается на Pull Server. Настраивается через мета-конфигурацию.
- Как бороться с drift?
- DSC сам ловит drift: раз в 30 минут (RefreshFrequencyMins) LCM сверяет текущее состояние с MOF. Если расходится, в режиме ApplyAndAutoCorrect автоматически чинит. В режиме ApplyAndMonitor — пишет предупреждение.
- Где брать готовые DSC-ресурсы?
- PowerShell Gallery: PSDscResources (базовые), ComputerManagementDsc, NetworkingDsc, xActiveDirectory, SqlServerDsc. Проверяйте дату последнего обновления и issue tracker — некоторые модули заброшены.