PowerShell DSC: управление конфигурацией серверов

Что такое PowerShell DSC и зачем он нужен

PowerShell Desired State Configuration (DSC) — это декларативная платформа управления конфигурацией, встроенная в Windows. Вместо написания императивных скриптов («установи это, настрой то») вы описываете желаемое состояние сервера, а DSC сам приводит систему к этому состоянию и поддерживает его.

Типичные задачи для DSC:

  • Установка ролей и компонентов Windows (IIS, DNS, DHCP)
  • Управление файлами, реестром, службами
  • Настройка сетевых параметров
  • Установка пакетов MSI и EXE
  • Управление пользователями и группами
  • Контроль соответствия корпоративным стандартам

DSC работает на всех версиях Windows Server начиная с 2012 R2. В PowerShell 7+ появился DSC v3, но для Windows-серверов по-прежнему используется DSC v2, встроенный в Windows PowerShell 5.1.

Написание первой конфигурации DSC

Конфигурация DSC — это блок PowerShell-кода, объявляющий желаемое состояние. Рассмотрим пример: настройка веб-сервера IIS с конкретным сайтом.

Configuration WebServerSetup {
    # Импорт необходимых DSC-ресурсов
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName xWebAdministration

    Node "WEB01" {
        # Установка роли IIS
        WindowsFeature IIS {
            Name   = "Web-Server"
            Ensure = "Present"
        }

        WindowsFeature IISManagement {
            Name      = "Web-Mgmt-Tools"
            Ensure    = "Present"
            DependsOn = "[WindowsFeature]IIS"
        }

        WindowsFeature ASPNet45 {
            Name      = "Web-Asp-Net45"
            Ensure    = "Present"
            DependsOn = "[WindowsFeature]IIS"
        }

        # Создание каталога сайта
        File SiteDirectory {
            DestinationPath = "C:\inetpub\mysite"
            Type            = "Directory"
            Ensure          = "Present"
        }

        # Настройка сайта IIS
        xWebsite MainSite {
            Name         = "MainSite"
            PhysicalPath = "C:\inetpub\mysite"
            State        = "Started"
            BindingInfo  = @(
                MSFT_xWebBindingInformation {
                    Protocol = "HTTP"
                    Port     = 80
                }
            )
            DependsOn = "[File]SiteDirectory", "[WindowsFeature]IIS"
        }

        # Остановка Default Web Site
        xWebsite DefaultSite {
            Name   = "Default Web Site"
            State  = "Stopped"
            Ensure = "Present"
            DependsOn = "[WindowsFeature]IIS"
        }
    }
}

# Компиляция конфигурации в MOF-файл
WebServerSetup -OutputPath "C:\DSC\WebServerSetup"

Команда WebServerSetup компилирует конфигурацию в MOF-файл (Managed Object Format) в указанной директории. MOF — промежуточный формат, который понимает движок DSC (Local Configuration Manager).

Применение конфигурации к серверам

Существует два режима применения конфигураций: Push и Pull.

Push-режим — администратор вручную отправляет конфигурацию на сервер:

# Применение MOF к локальному серверу
Start-DscConfiguration -Path "C:\DSC\WebServerSetup" -Wait -Verbose -Force

# Применение к удалённому серверу
Start-DscConfiguration -Path "C:\DSC\WebServerSetup" `
  -ComputerName "WEB01" -Credential $cred -Wait -Verbose

# Проверка текущего состояния
Get-DscConfigurationStatus
Test-DscConfiguration -Detailed

Pull-режим — серверы сами периодически запрашивают конфигурацию с центрального Pull Server. Это предпочтительный режим для больших инфраструктур.

Настройка Local Configuration Manager

LCM — агент DSC на каждом сервере. Его настройки определяют режим работы:

[DSCLocalConfigurationManager()]
Configuration LCMConfig {
    Node "WEB01" {
        Settings {
            RefreshMode          = "Push"    # или Pull
            ConfigurationMode    = "ApplyAndAutoCorrect"  # автоисправление дрейфа
            RebootNodeIfNeeded   = $true
            RefreshFrequencyMins = 30        # проверка каждые 30 мин
            ActionAfterReboot    = "ContinueConfiguration"
            AllowModuleOverwrite = $true
        }
    }
}

LCMConfig -OutputPath "C:\DSC\LCMConfig"
Set-DscLocalConfigurationManager -Path "C:\DSC\LCMConfig" -Verbose

Режим ApplyAndAutoCorrect — если кто-то вручную изменит настройку, DSC вернёт её к описанному состоянию при следующей проверке. Это ключевое преимущество DSC — защита от «дрейфа конфигурации».

Работа с параметрами и конфигурационными данными

Жёстко прописывать имена серверов и параметры в конфигурации — плохая практика. DSC поддерживает разделение кода и данных через Configuration Data:

# Файл ConfigData.psd1
$ConfigData = @{
    AllNodes = @(
        @{
            NodeName                    = "*"
            PSDscAllowPlainTextPassword = $false
            CertificateFile             = "C:\Certs\DscPublicKey.cer"
        },
        @{
            NodeName = "WEB01"
            Role     = "WebServer"
            SiteName = "Portal"
            SitePath = "C:\inetpub\portal"
            Port     = 443
        },
        @{
            NodeName = "WEB02"
            Role     = "WebServer"
            SiteName = "API"
            SitePath = "C:\inetpub\api"
            Port     = 8443
        }
    )
}

# Использование данных в конфигурации
Configuration WebServers {
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName xWebAdministration

    Node $AllNodes.Where({$_.Role -eq "WebServer"}).NodeName {
        WindowsFeature IIS {
            Name   = "Web-Server"
            Ensure = "Present"
        }

        File SiteDir {
            DestinationPath = $Node.SitePath
            Type            = "Directory"
            Ensure          = "Present"
        }

        xWebsite Site {
            Name         = $Node.SiteName
            PhysicalPath = $Node.SitePath
            State        = "Started"
            BindingInfo  = MSFT_xWebBindingInformation {
                Protocol = "HTTPS"
                Port     = $Node.Port
            }
        }
    }
}

WebServers -ConfigurationData $ConfigData -OutputPath "C:\DSC\WebServers"

Такой подход позволяет использовать одну конфигурацию для десятков серверов, меняя только данные.

Популярные DSC-ресурсы

Встроенные ресурсы покрывают базовые задачи. Для сложных сценариев используйте модули из PowerShell Gallery:

МодульНазначениеУстановка
PSDesiredStateConfigurationFile, Registry, Service, Script, WindowsFeatureВстроен
NetworkingDscIP-адреса, DNS, firewall, маршрутыInstall-Module NetworkingDsc
ComputerManagementDscИмя компьютера, домен, планировщик, часовой поясInstall-Module ComputerManagementDsc
SqlServerDscУстановка SQL Server, настройка БД, AGInstall-Module SqlServerDsc
xWebAdministrationIIS сайты, пулы, привязкиInstall-Module xWebAdministration
ActiveDirectoryDscСоздание домена, OU, пользователейInstall-Module ActiveDirectoryDsc

Пример использования NetworkingDsc для настройки сети:

Configuration NetworkSetup {
    Import-DscResource -ModuleName NetworkingDsc

    Node "SRV01" {
        IPAddress StaticIP {
            InterfaceAlias = "Ethernet"
            AddressFamily  = "IPv4"
            IPAddress      = "10.0.1.50/24"
        }

        DefaultGatewayAddress Gateway {
            InterfaceAlias = "Ethernet"
            AddressFamily  = "IPv4"
            Address        = "10.0.1.1"
        }

        DnsServerAddress DNS {
            InterfaceAlias = "Ethernet"
            AddressFamily  = "IPv4"
            Address        = "10.0.1.10", "10.0.1.11"
        }

        Firewall AllowRDP {
            Name      = "AllowRDP"
            Direction = "Inbound"
            Action    = "Allow"
            Protocol  = "TCP"
            LocalPort = "3389"
            Ensure    = "Present"
        }
    }
}

Настройка Pull Server

Pull Server — централизованный веб-сервис, раздающий конфигурации и модули DSC-ресурсов. Серверы периодически опрашивают его и применяют обновлённые конфигурации.

# Установка Pull Server
Configuration PullServer {
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName xPSDesiredStateConfiguration

    Node "DSC-PULL" {
        WindowsFeature IIS {
            Name   = "Web-Server"
            Ensure = "Present"
        }

        WindowsFeature DSCService {
            Name   = "DSC-Service"
            Ensure = "Present"
        }

        xDscWebService PullSvc {
            EndpointName            = "PSDSCPullServer"
            Port                    = 8080
            PhysicalPath            = "$env:SystemDrive\inetpub\PSDSCPullServer"
            CertificateThumbPrint   = $cert.Thumbprint
            ModulePath              = "$env:ProgramFiles\WindowsPowerShell\DscService\Modules"
            ConfigurationPath       = "$env:ProgramFiles\WindowsPowerShell\DscService\Configuration"
            RegistrationKeyPath     = "$env:ProgramFiles\WindowsPowerShell\DscService\RegistrationKeys"
            UseSecurityBestPractices = $true
        }
    }
}

# Регистрация ключа
"e37a45d2-9c71-4b8f-a1e5-3f2c89d4a6b7" | Out-File `
  "$env:ProgramFiles\WindowsPowerShell\DscService\RegistrationKeys\RegistrationKeys.txt"

Клиенты регистрируются на Pull Server через LCM:

[DSCLocalConfigurationManager()]
Configuration RegisterPull {
    Node "WEB01" {
        Settings {
            RefreshMode = "Pull"
        }
        ConfigurationRepositoryWeb PullSvc {
            ServerURL          = "https://DSC-PULL:8080/PSDSCPullServer.svc"
            RegistrationKey    = "e37a45d2-9c71-4b8f-a1e5-3f2c89d4a6b7"
            ConfigurationNames = @("WebServerSetup")
        }
    }
}

Отчётность и мониторинг дрейфа

DSC фиксирует состояние каждой проверки. Для централизованной отчётности используйте DSC Reporting Server или собирайте данные через PowerShell:

# Проверка состояния конфигурации на нескольких серверах
$servers = "WEB01", "WEB02", "SQL01", "DC01"
$results = Invoke-Command -ComputerName $servers -ScriptBlock {
    $status = Get-DscConfigurationStatus
    $test = Test-DscConfiguration -Detailed
    [PSCustomObject]@{
        Server         = $env:COMPUTERNAME
        Status         = $status.Status
        InDesiredState = $test.InDesiredState
        DriftedResources = ($test.ResourcesNotInDesiredState |
          Select-Object ResourceId).ResourceId -join "; "
        LastRun        = $status.StartDate
    }
}

$results | Format-Table -AutoSize

# Экспорт отчёта
$results | Export-Csv -Path "C:\Reports\DSC-Compliance.csv" -NoTypeInformation

Настройте запуск отчёта по расписанию через Task Scheduler и отправку на почту при обнаружении серверов в состоянии InDesiredState = $false. Это позволяет оперативно реагировать на несанкционированные изменения.

Интеграция с Azure Automation DSC

Для гибридных сред рассмотрите Azure Automation State Configuration — облачный Pull Server с веб-интерфейсом отчётности. Регистрация сервера:

# Установка агента и регистрация
$params = @{
    RegistrationUrl = "https://xxx.agentsvc.eus.azure-automation.net/accounts/xxx"
    RegistrationKey = "base64key=="
    ConfigurationMode = "ApplyAndAutoCorrect"
    RefreshFrequencyMins = 30
    NodeConfigurationName = "WebServerSetup.WEB01"
}
Register-AzAutomationDscNode @params

Azure Automation DSC бесплатен для 5 узлов и предоставляет графические отчёты о соответствии конфигураций.

Часто задаваемые вопросы

DSC — встроенный в Windows инструмент, не требующий установки агентов и внешних серверов (в Push-режиме). Ansible и Chef мощнее в гетерогенных средах (Linux + Windows), но DSC глубже интегрирован с Windows и Active Directory. Для чисто Windows-инфраструктуры DSC — оптимальный выбор.

Никогда не храните пароли в открытом виде. Используйте сертификаты для шифрования: укажите CertificateFile в ConfigData, и DSC зашифрует все PSCredential в MOF-файле открытым ключом сертификата. Агент на целевом сервере расшифрует их закрытым ключом. Альтернатива — Azure Key Vault integration.

DSC и GPO могут управлять одними и теми же параметрами. GPO применяется каждые 90 минут и перезапишет изменения DSC. Решение: чётко разделите зоны ответственности. Например, GPO управляет политиками безопасности, а DSC — установкой ролей и приложений. Не дублируйте настройки между ними.

Да, через пакет omi-server и PowerShell DSC for Linux (nx модули). Однако поддержка ограничена базовыми ресурсами: файлы, пакеты, службы, скрипты. Для полноценного управления Linux-серверами Ansible или Puppet будут практичнее.

DSC хранит предыдущую конфигурацию. Для отката выполните Restore-DscConfiguration -Verbose. Это применит предыдущий MOF-файл. Для полного удаления DSC-конфигурации: Remove-DscConfigurationDocument -Stage Current, Pending, Previous и перезапустите LCM.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#PowerShell DSC#Desired State Configuration#управление конфигурацией#Pull Server#MOF#DSC ресурсы#конфигурация серверов#автоматизация
Комментарии 0

Оставить комментарий

загрузка...