Infrastructure as Code в мире Windows
宣言 PowerShell DSC: Управление Windows-серверами на уровне кода
Мы часто пишем PowerShell-скрипты, чтобы что-то сделать: установить роль, запустить службу, создать файл. Это императивный подход — мы описываем, как достичь цели.
PowerShell Desired State Configuration (DSC) предлагает декларативный подход. Мы описываем, каким должен быть сервер, а DSC сам решает, как привести его в это состояние. Это и есть Infrastructure as Code (IaC) для Windows.
▪️ Ключевая идея:
Вы создаете конфигурационный файл, в котором описываете конечное состояние системы. Например: "Веб-сервер IIS должен быть установлен, а служба 'w3svc' должна быть запущена". Если IIS не установлен, DSC его установит. Если служба остановлена, DSC ее запустит. Если всё уже в нужном состоянии, DSC ничего не сделает (идемпотентность).
▪️ Пример: Конфигурация простого веб-сервера
Этот скрипт описывает, что на сервере должен быть установлен IIS и запущен его сервис.
Создайте конфигурационный скрипт (WebServerConfig.ps1):
PowerShell
Запустите скрипт в PowerShell ISE или консоли. Он не применит конфигурацию сразу, а создаст в новой папке WebServerConfig файл localhost.mof. Этот MOF-файл и есть скомпилированное «желаемое состояние».
Примените конфигурацию:
PowerShell
DSC проанализирует текущее состояние системы, сравнит его с localhost.mof и выполнит необходимые действия. Повторный запуск этой команды не приведет ни к каким изменениям, если состояние сервера не менялось.
🧠 Взгляд архитектора:
DSC — это переход от одноразовых скриптов к созданию живой, самоподдерживающейся документации вашей инфраструктуры в виде кода. Это позволяет гарантировать консистентность конфигураций десятков и сотен серверов, автоматически исправлять "дрейф" настроек и встраивать управление инфраструктурой в CI/CD пайплайны.
#PowerShellDSC #IaC #WindowsServer #Automation #DevOps #PowerShell
宣言 PowerShell DSC: Управление Windows-серверами на уровне кода
Мы часто пишем PowerShell-скрипты, чтобы что-то сделать: установить роль, запустить службу, создать файл. Это императивный подход — мы описываем, как достичь цели.
PowerShell Desired State Configuration (DSC) предлагает декларативный подход. Мы описываем, каким должен быть сервер, а DSC сам решает, как привести его в это состояние. Это и есть Infrastructure as Code (IaC) для Windows.
▪️ Ключевая идея:
Вы создаете конфигурационный файл, в котором описываете конечное состояние системы. Например: "Веб-сервер IIS должен быть установлен, а служба 'w3svc' должна быть запущена". Если IIS не установлен, DSC его установит. Если служба остановлена, DSC ее запустит. Если всё уже в нужном состоянии, DSC ничего не сделает (идемпотентность).
▪️ Пример: Конфигурация простого веб-сервера
Этот скрипт описывает, что на сервере должен быть установлен IIS и запущен его сервис.
Создайте конфигурационный скрипт (WebServerConfig.ps1):
PowerShell
Configuration WebServerConfig
{
# Узел, к которому применяется конфигурация (localhost)
Node localhost
{
# Убеждаемся, что компонент Windows 'Web-Server' установлен
WindowsFeature IIS
{
Ensure = "Present"
Name = "Web-Server"
}
# Убеждаемся, что служба IIS запущена
Service WebService
{
Ensure = "Present"
Name = "w3svc"
State = "Running"
DependsOn = "[WindowsFeature]IIS" # Запускать только после установки IIS
}
}
}
# Вызываем конфигурацию для создания MOF-файла
WebServerConfig
Запустите скрипт в PowerShell ISE или консоли. Он не применит конфигурацию сразу, а создаст в новой папке WebServerConfig файл localhost.mof. Этот MOF-файл и есть скомпилированное «желаемое состояние».
Примените конфигурацию:
PowerShell
Start-DscConfiguration -Path .\WebServerConfig -Wait -Verbose
DSC проанализирует текущее состояние системы, сравнит его с localhost.mof и выполнит необходимые действия. Повторный запуск этой команды не приведет ни к каким изменениям, если состояние сервера не менялось.
🧠 Взгляд архитектора:
DSC — это переход от одноразовых скриптов к созданию живой, самоподдерживающейся документации вашей инфраструктуры в виде кода. Это позволяет гарантировать консистентность конфигураций десятков и сотен серверов, автоматически исправлять "дрейф" настроек и встраивать управление инфраструктурой в CI/CD пайплайны.
#PowerShellDSC #IaC #WindowsServer #Automation #DevOps #PowerShell
Windows: Поиск и архивация старых файлов с помощью PowerShell
«На диске C заканчивается место» — вечная головная боль админа, особенно на файловых серверах. Искать большие и старые файлы вручную через Проводник — неэффективно. PowerShell позволяет автоматизировать этот процесс, сделав его быстрым и безопасным.
Этот скрипт находит файлы больше определенного размера и старше заданного количества дней, а затем предлагает архивировать их с сохранением структуры папок.
▪️ Скрипт (Archive-OldFiles.ps1):
PowerShell
▪️ Как использовать:
Тестовый запуск (безопасный режим):
Сначала запустите скрипт с параметром -WhatIf. Он покажет, что он собирается сделать, но ничего не переместит.
PowerShell
Рабочий запуск:
Если вас устраивает результат тестового запуска, уберите -WhatIf для реального перемещения файлов.
PowerShell
Это не просто скрипт, а безопасный инструмент, который сначала позволяет проверить свои действия.
#PowerShell #WindowsServer #Automation #Скрипты #SysAdmin
«На диске C заканчивается место» — вечная головная боль админа, особенно на файловых серверах. Искать большие и старые файлы вручную через Проводник — неэффективно. PowerShell позволяет автоматизировать этот процесс, сделав его быстрым и безопасным.
Этот скрипт находит файлы больше определенного размера и старше заданного количества дней, а затем предлагает архивировать их с сохранением структуры папок.
▪️ Скрипт (Archive-OldFiles.ps1):
PowerShell
[CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact='High')]
param(
[Parameter(Mandatory=$true)]
[string]$SourcePath,
[Parameter(Mandatory=$true)]
[string]$ArchivePath,
[int]$DaysOld = 365,
[long]$MinSizeGB = 1
)
# Проверяем, существуют ли пути
if (-not (Test-Path $SourcePath)) {
Write-Error "Исходный путь не найден: $SourcePath"
return
}
if (-not (Test-Path $ArchivePath)) {
Write-Warning "Путь для архива не найден. Создаем: $ArchivePath"
New-Item -Path $ArchivePath -ItemType Directory | Out-Null
}
$thresholdDate = (Get-Date).AddDays(-$DaysOld)
$minSizeBytes = $MinSizeGB * 1GB
Write-Host "Ищем файлы в '$SourcePath' старше $($thresholdDate.ToString('yyyy-MM-dd')) и больше $MinSizeGB GB..."
$filesToArchive = Get-ChildItem -Path $SourcePath -Recurse -File | Where-Object {
$_.LastWriteTime -lt $thresholdDate -and $_.Length -gt $minSizeBytes
}
if ($null -eq $filesToArchive) {
Write-Host "Файлы для архивации не найдены."
return
}
Write-Host "Найдено $($filesToArchive.Count) файлов для архивации."
foreach ($file in $filesToArchive) {
# Сохраняем относительную структуру папок
$relativePath = $file.FullName.Substring($SourcePath.Length)
$destinationPath = Join-Path -Path $ArchivePath -ChildPath $relativePath
$destinationDir = Split-Path -Path $destinationPath -Parent
# Создаем директорию в архиве, если ее нет
if (-not (Test-Path $destinationDir)) {
New-Item -Path $destinationDir -ItemType Directory | Out-Null
}
Write-Host "Перемещение: $($file.FullName) -> $destinationPath"
# Ключевая команда с поддержкой -WhatIf
if ($pscmdlet.ShouldProcess($file.FullName, "Move to $destinationPath")) {
Move-Item -Path $file.FullName -Destination $destinationPath
}
}
Write-Host "Архивация завершена."
▪️ Как использовать:
Тестовый запуск (безопасный режим):
Сначала запустите скрипт с параметром -WhatIf. Он покажет, что он собирается сделать, но ничего не переместит.
PowerShell
.\Archive-OldFiles.ps1 -SourcePath "D:\Shares" -ArchivePath "E:\Archive" -DaysOld 365 -MinSizeGB 1 -WhatIf
Рабочий запуск:
Если вас устраивает результат тестового запуска, уберите -WhatIf для реального перемещения файлов.
PowerShell
.\Archive-OldFiles.ps1 -SourcePath "D:\Shares" -ArchivePath "E:\Archive"
Это не просто скрипт, а безопасный инструмент, который сначала позволяет проверить свои действия.
#PowerShell #WindowsServer #Automation #Скрипты #SysAdmin