· 17 мин чтения

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), который на узле применяет конфигурацию и поддерживает её в рабочем состоянии.

Преимущества против ручной настройки очевидны:

Push vs Pull режимы

КритерийPushPull
Как доставляется MOFStart-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:

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

У нас в проектах постоянно используются:

Мини-кейс: стандартизация 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 — чтобы админ узнавал за минуту, а не через неделю.

Типовые грабли

Внедрим 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 — некоторые модули заброшены.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.