Admin Future
241 subscribers
51 photos
1 video
4 files
120 links
Превращаем эникейщиков в System Architects.
🚀 Твой навигатор в мире IT-инфраструктуры:

▪️ Hard Skills: Linux, Windows, Network, Security
▪️ Tools: Лучший софт и скрытые фишки
▪️ Mindset: Как думать, чтобы платили много


Админ - @maksimshap
Download Telegram
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

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

[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