Desired State Configuration (DSC) adalah alat manajemen konfigurasi server. Dengan itu, Anda dapat mengkonfigurasi server (membuat perubahan pada registri, menyalin file, menginstal dan menghapus komponen), memantau status pengaturan saat ini dan dengan cepat kembali ke pengaturan dasar.DSC menarik bagi mereka yang mengikuti pendekatan DevOps. Alat ini sangat cocok dengan Infrastruktur sebagai paradigma Kode: pengembang dapat menambahkan persyaratan mereka ke konfigurasi dan memasukkannya ke dalam sistem kontrol versi, dan tim dapat menggunakan kode tanpa menggunakan proses "manual".Bersama dengan Stanislav Buldakov dari RaiffeisenbankKami menggabungkan pengalaman kami dengan mesin DSC dan membaginya menjadi 2 artikel. Pada bagian pertama, kami akan menganalisis prinsip-prinsip dasar kerja dan berkenalan dengan fitur-fitur penggunaan pada contoh-contoh praktis:- “Buka kemasannya” dengan mesin DSC, lihat sumber apa yang secara default, dan tunjukkan di mana mendapatkan sumber daya tambahan;
- Mari kita lihat bagaimana menggambarkan konfigurasi di DSC;
- Kita akan belajar bagaimana agen bawaan Local Configuration Manager menerapkan konfigurasi pada server, menunjukkan bagaimana itu dikonfigurasi menggunakan meta-konfigurasi;
- mari kita beralih ke kasus konfigurasi yang lebih kompleks: konfigurasi parsial dan konfigurasi rintisan.
DSC adalah mesin yang ringan dan cepat. Misalnya, menggunakannya, Anda dapat menginstal .NET Framework 3.5 pada mesin virtual lebih cepat. Inilah yang membantunya mempercepat proses konfigurasi layanan:- « » Windows PowerShell.
DSC PowerShell Windows Management Framework. Linux . , PowerShell. - , .
, , , . DSC. - , .
DSC , . .
Konfigurasi selalu dilakukan berurutan, tanpa syarat dan bercabang. Oleh karena itu, secara singkat, algoritma operasi DSC terlihat seperti ini:- Konfigurasikan Manajer Konfigurasi Lokal (LCM) . Ini adalah agen bawaan yang bertanggung jawab untuk menerapkan konfigurasi ke server. Kami memberitahunya bagaimana konfigurasi yang dideklarasikan harus bekerja dan dalam urutan apa.
- Jika sumber daya tambahan diperlukan, instal dan sambungkan terlebih dahulu.
- Dalam bentuk deklaratif, kita menulis urutan konfigurasi.
- Kami menyiarkan konfigurasi dalam format file MOF.
- Kami mengirim konfigurasi ke target yang baru digunakan atau server yang ada.
- LCM menerima konfigurasi (file MOF) plus instruksi untuk mengatur LCM itu sendiri.
- Konfigurasi segera diterapkan oleh tim kami.
Diagram disederhanakan dari arsitektur DSC.Kami akan mulai berkenalan dengan mesin dengan mempelajari sumber daya yang telah ditentukan. Selanjutnya, coba tulis konfigurasi.Sumber Daya DSC
Sumber daya DSC adalah sejenis analog dengan modul PowerShell. Setiap server Windows sudah memiliki sumber daya DSC yang telah ditentukan sebelumnya, mereka berada di direktori yang sama dengan modul PowerShell. Daftar ini dapat diperoleh melalui cmdlet Get-DscResourse. Seperti apa daftar ini pada Windows 10 1809: PS C:\windows\system32> Get-DscResource | Sort-Object -Property Name | ft ImplementedAs, Name -a
ImplementedAs Name
------------- ----
PowerShell Archive
PowerShell Environment
Binary File
PowerShell Group
Composite GroupSet
Binary Log
PowerShell Package
PowerShell PackageManagement
PowerShell PackageManagementSource
Composite ProcessSet
PowerShell Registry
PowerShell Script
PowerShell Service
Composite ServiceSet
Binary SignatureValidation
PowerShell User
PowerShell WaitForAll
PowerShell WaitForAny
PowerShell WaitForSome
PowerShell WindowsFeature
Composite WindowsFeatureSet
PowerShell WindowsOptionalFeature
Composite WindowsOptionalFeatureSet
PowerShell WindowsPackageCab
PowerShell WindowsProcess
Nama-nama sumber daya memberikan pemahaman tentang apa yang mereka kerjakan: - Arsip - dengan arsip pengemasan dan pembongkaran;
- Lingkungan - dengan variabel lingkungan;
- File - dengan file;
- Grup - dengan grup pengguna lokal;
- Log - dengan log;
- Paket —– dengan paket perangkat lunak;
- Registri —– dengan kunci registri dan statusnya;
- Layanan - dengan layanan dan statusnya;
- Pengguna - dengan akun pengguna lokal;
- WindowsFeature — Windows Server;
- WindowsProcess — Windows;
- Script — PowerShell- . 3 : SetScript — -, TestScript — , , GetScript — .
Lebih sering daripada tidak, sumber daya DSC di luar kotak tidak cukup . Dalam hal ini, Anda dapat menulis skrip Anda sendiri untuk semua yang melampaui modul standar. Agar tidak menemukan kembali roda, Anda dapat menggunakan sumber daya DSC yang ditulis oleh pengembang lain. Misalnya, dari sini https://github.com/PowerShell/DscResources atau dari PSGallery . Cara menginstal sumber daya tambahan . Kami menggunakan cmdlet Instal-Modul . Menginstal sumber daya hanya menyalin file sumber daya di sepanjang salah satu jalur di variabel lingkungan $ env: PSModulePath . Sumber daya yang terinstal tidak terhubung secara otomatis selama kompilasi, jadi nanti kita juga akan menghubungkannya dalam konfigurasi itu sendiri.Untuk menggunakan sumber daya, Anda harus menginstalnya secara lokal dan di server target. Di infrastruktur On-Premise, kebijakan keamanan biasanya melarang akses Internet untuk server. Dalam hal ini, server DSC tidak akan dapat memuat sumber daya tambahan dari sumber eksternal. Untuk menerbitkan arsip dengan modul, kami menggunakan repositori NuGet lokal atau server web biasa. Anda dapat menginstal sumber daya tambahan untuk server web dengan membongkar modul ke dalam direktori C: \ Program Files \ WindowsPowerShell \ Modules \.Inipersis seperti yang dilakukan oleh cmdlet Instal-Modul.Pada artikel kedua, kita akan melihat lebih dekat perbedaan antara pengaturan untuk mode Push dan Pull. Penguraian konfigurasi sederhana
Konfigurasi adalah deskripsi sederhana dan konsisten tentang apa yang perlu dilakukan di server. Ini adalah bagaimana konfigurasi DSC sederhana terlihat seperti: Configuration EnvironmentVariable_Path
{
param ()
Import-DscResource -ModuleName 'PSDscResources'
Node localhost
{
Environment CreatePathEnvironmentVariable
{
Name = 'TestPathEnvironmentVariable'
Value = 'TestValue'
Ensure = 'Present'
Path = $true
Target = @('Process', 'Machine')
}
}
}
EnvironmentVariable_Path -OutputPath:"C:\EnvironmentVariable_Path"
Sebagai contohnya, mari kita lihat apa yang terdiri dari konfigurasi.Blok Konfigurasi adalah tipe khusus fungsi PowerShell yang menjelaskan apa yang ingin kita dapatkan. Di dalam blok berisi: - blok param dengan parameter yang dapat digunakan secara internal;
- blokir dengan panggilan PowerShell tambahan. Di sini, di awal konfigurasi, kami selalu menjalankan Impor-Sumber Daya untuk menghubungkan sumber daya tambahan;
- blok dengan pengaturan untuk server Node $ servername tertentu.
Di dalam blok Node , kami menunjukkan sumber daya mana pada server tertentu yang akan kami konfigurasi. Dalam contoh di atas, ini membuat variabel lingkungan menggunakan sumber daya Lingkungan biasa.Mari kita lihat sedikit lebih dalam dan lihat sintaks sumber daya tertentu melalui Get-DscResource -Name Environment -Syntax command:
PS C:\windows\system32> Get-DscResource -Name Environment -Syntax
Environment [String]
{
Name = [string]
[DependsOn = [string[]]]
[Ensure = [string]{ Absent | Present }]
[Path = [bool]]
[PsDscRunAsCredential = [PSCredential]]
[Value = [string]]
}
Dalam contoh ini: - Nama - nama variabel lingkungan.
- Di DependsOn, kami menentukan ketergantungan pada sumber daya lainnya. Penting untuk diingat bahwa operasi tidak akan dilakukan sampai sumber daya yang ditentukan di sini selesai.
- Di Pastikan, kami menentukan kondisi konfigurasi. Jika variabel seperti itu tidak ada, maka kita akan membuatnya; jika ada, maka sumber daya ini tidak akan dikonfigurasi.
- The Jalan Menentukan apakah variabel lingkungan mengandung jalan.
- Dalam kredensial yang ditentukan PsDscRunAsCredential .
- Nilai - nilai variabel lingkungan.
- The Sasaran dapat diindikasikan sehubungan siapa konfigurasi diterapkan.
Cara memulai kompilasi . Kami hanya memanggil konfigurasi dengan namanya dengan parameter yang diperlukan. Hasilnya akan berupa file mof, yang selanjutnya digunakan oleh mesin DSC untuk mengkonfigurasi server tertentu: PS C:\windows\system32> EnvironmentVariable_Path -OutputPath:"C:\EnvironmentVariable_Path"
Directory: C:\EnvironmentVariable_Path
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 25.02.2020 14:05 2172 localhost.mof
Konfigurasikan Manajer Konfigurasi Lokal
Manajer konfigurasi lokal bertanggung jawab untuk menerapkan konfigurasi yang kami kompilasi ke dalam file mof. Dialah yang memantau pelestarian negara yang ditentukan dalam konfigurasi. Jika sistem meninggalkan kondisi ini, LCM memanggil kode di sumber daya untuk memulihkan keadaan yang ditentukan. Mari kita lihat pengaturan manajer konfigurasi lokal melalui Get-DscLocalConfigurationManager: PS C:\windows\system32> Get-DscLocalConfigurationManager
ActionAfterReboot : ContinueConfiguration
AgentId : 1FB3A2EE-57C9-11EA-A204-58A023EF3A48
AllowModuleOverWrite : False
CertificateID :
ConfigurationDownloadManagers : {}
ConfigurationID :
ConfigurationMode : ApplyAndMonitor
ConfigurationModeFrequencyMins : 15
Credential :
DebugMode : {NONE}
DownloadManagerCustomData :
DownloadManagerName :
LCMCompatibleVersions : {1.0, 2.0}
LCMState : Idle
LCMStateDetail :
LCMVersion : 2.0
StatusRetentionTimeInDays : 10
SignatureValidationPolicy : NONE
SignatureValidations : {}
MaximumDownloadSizeMB : 500
PartialConfigurations :
RebootNodeIfNeeded : False
RefreshFrequencyMins : 30
RefreshMode : PUSH
ReportManagers : {}
ResourceModuleManagers : {}
PSComputerName :
- RefreshMode berisi mode operasi LCM - Push atau Pull. Kami akan berbicara lebih banyak tentang mode di artikel kedua.
- ConfigurationMode menunjukkan mode aplikasi konfigurasi saat ini. Dalam kasus kami, ini adalah ApplyAndMonitor - berlaku dan lacak perubahan. Mode ApplyOnly juga tersedia (LCM tidak akan melacak perubahan konfigurasi) dan mode ApplyAndAutocorrect (LCM tidak hanya melacak perubahan, tetapi juga mengembalikannya ke konfigurasi dasar).
- RebootNodeIfNeeded - dapat me-reboot server setelah konfigurasi selesai, jika perlu menerapkan pengaturan.
- ConfigurationModeFrequencyMins - Memperbaiki seberapa sering LCM akan memeriksa perubahan konfigurasi.
Ubah pengaturan LCM dalam meta-konfigurasi. Inilah contohnya:
Configuration LCMConfiguration
{
Node Localhost
{
LocalConfigurationManager
{
RebootNodeIfNeeeded = $True
}
}
}
LCMConfiguration
Sama untuk versi terbaru WMF dengan komentar:
[DSCLocalConfigurationManager()]
Configuration LCMConfiguration
{
param
(
[string[]]$Server = "localhost"
)
Node $Server
{
Settings
{
RebootNodeIfNeeded = $True
RefreshMode = 'Push'
RefreshFrequencyMins = 30
}
}
}
LCMConfiguration -Server "localhost" -OutputPath "C:\DSC\MetaConfigurations\EnvironmentVariable_Path\"
Fitur konfigurasi metak . Saat menulis metakonfigurasi, kami menggunakan blok yang sama dengan konfigurasi DSC biasa. Pengecualian adalah blok internal LocalConfigurationManager (v4) atau atribut DSCLocalConfigurationManager (v5) untuk server tertentu. Mereka menggambarkan semua pengaturan yang diperlukan. Metaconfiguration juga dikompilasi menjadi file mof, tetapi untuk menggunakannya, cmdlet Set-DSCLocalConfigurationManager digunakan, dan bukan konfigurasi Start-DSCC. PS C:\windows\system32> LCMConfiguration -OutputPath C:\EnvironmentVariable_Path\
Directory: C:\EnvironmentVariable_Path
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 26.02.2020 20:05 1016 Localhost.meta.mof
PS C:\windows\system32> Set-DscLocalConfigurationManager -Path C:\EnvironmentVariable_Path\
PS C:\windows\system32> Get-DscLocalConfigurationManager
…
RebootNodeIfNeeded : True
…
Secara teoritis, tidak ada yang mencegah kita dari menggabungkan konfigurasi LCM dan sumber daya konvensional dalam konfigurasi yang sama. Tetapi untuk kesederhanaan, disarankan agar penulisan dan aplikasi konfigurasi dan metakonfigurasi dipisahkan.Konfigurasi Sebagian
Konfigurasi Parsial - beberapa konfigurasi yang dijalankan berurutan satu demi satu. Mereka berguna ketika beberapa tim mengerjakan layanan. Setiap perintah menunjukkan pengaturan untuk bagian dari layanan, dan konfigurasi parsial kemudian menerapkan semua pengaturan secara berurutan. Dalam pengaturan LCM, kami menentukan konfigurasi parsial dalam Konfigurasi Partial . Dalam konfigurasi parsial, kita harus mempertimbangkan logika DSC langsung. Mesin tidak memungkinkan percabangan, sehingga sumber daya tambahan diperlukan untuk memenuhi berbagai kondisi. Kami akan menganalisis ini dengan beberapa contoh. Misalkan kita ingin menjamin pengiriman konfigurasi ke server dan melanjutkan sesuai dengan algoritma berikut:- Pertama, periksa apakah modul yang diperlukan dipasang di server.
- Kami melakukan konfigurasi, yang akan membawa server ke keadaan yang diinginkan.
Beginilah bentuk konfigurasi metakonfigurasinya dengan beberapa konfigurasi berturut-turut di dalamnya:
[DSCLocalConfigurationManager()]
configuration MetaPushConfig
{
param
(
[ValidateNotNullOrEmpty()]
[string] $NodeName = 'localhost'
)
Node $NodeName
{
PartialConfiguration ModulesDownloadConfig
{
Description = 'Download and install modules'
RefreshMode = 'Push'
}
PartialConfiguration ServerOSConfig
{
DependsOn = "[PartialConfiguration]ModulesDownloadConfig"
Description = 'Configuration'
RefreshMode = 'Push'
}
Settings
{
RefreshMode = 'Push'
RefreshFrequencyMins = 30
RebootNodeIfNeeded = $true
}
}
}
MetaPushConfig -NodeName "NewServer.contoso.com" -OutputPath c:\DSC\MetaConfigurations
$cred = (Get-Credential -UserName Administrator -Message "Enter admin credentials")
Set-DscLocalConfigurationManager -ComputerName "NewServer.contoso.com" -Credential $cred -Path "c:\DSC\MetaConfigurations" -Verbose -Force
Publish-DscConfiguration c:\DSC\Configurations\ModulesDownloadConfig -ComputerName "NewServer.contoso.com" -Credential $cred -Force
Publish-DscConfiguration c:\DSC\Configurations\ServerOSConfig -ComputerName "NewServer.contoso.com" -Credential $cred -Force
Start-DscConfiguration -UseExisting -ComputerName "NewServer.contoso.com" -Credential $cred -Force -Verbose
Bagian pertama dari konfigurasi mengatakan Unduh dan instal modul : unduh dan instal sumber daya yang diperlukan. Bagian kedua dari ServerOSConfig membawa server ke keadaan yang diinginkan. Apa nuansa dengan kelurusan DSC di sini: - Jika bagian pertama dari konfigurasi awalnya mengembalikan FALSE dan selesai sepenuhnya, maka LCM tidak akan pergi ke konfigurasi kedua. Menurut logika DSC, pertama-tama Anda harus membawa server ke kondisi pertama yang dijelaskan.
Cara merawat: menjalankan konfigurasi dua kali atau mengotomatiskan seluruh proses dalam skrip. - Jika server setelah menginstal komponen apa pun memerlukan reboot, maka konfigurasi tidak akan melangkah lebih jauh sampai kita sendiri me-reboot server. Bahkan jika kita memberi tahu LCM bahwa RebootNodeIfNeeeded = $ True, agen akan menunggu solusi kami selama konfigurasi.
Cara merawat: sumber daya xPendingReboot datang untuk menyelamatkan , yang mengontrol kunci registri saat reboot. Sumber daya ini me-restart server untuk kita.
Berikut adalah contoh konfigurasi untuk mengunduh dan memasang sumber daya dalam skenario "berdarah perusahaan", ketika server tidak memiliki akses Internet. Ini mengasumsikan keberadaan server web, di mana sumber daya yang diunduh tersedia untuk semua orang melalui protokol http.
Configuration ModulesDownloadConfig
{
param
(
[string[]]$Server
)
Import-DscResource -ModuleName "PSDesiredStateConfiguration"
Node $Server
{
Registry DisableIEESC-Admin {
Key = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}"
ValueName = "IsInstalled"
Ensure = "Present"
ValueData = 0
ValueType = "DWORD"
}
Registry DisableIEESC-User {
Key = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}"
ValueName = "IsInstalled"
Ensure = "Present"
ValueData = "0"
ValueType = "DWORD"
}
File CreateDistribDir {
Ensure = "present"
DestinationPath = "C:\Install\PSModules"
Type = "Directory"
}
Script NetworkingDscDownLoad {
SetScript = { Invoke-WebRequest -Uri "http://repo.contoso.com/repo/modules/NetworkingDsc.zip" -OutFile "C:\Install\PSModules\NetworkingDsc.zip" }
GetScript = { return @{ Result = Test-Path "C:\Install\PSModules\NetworkingDsc.zip"
GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript
}
}
TestScript = { Test-Path "C:\Program Files\WindowsPowerShell\Modules\NetworkingDsc" }
}
Archive UnpackNetworkingDsc {
Ensure = "Present"
DependsOn = "[Script]NetworkingDscDownLoad"
Path = "C:\Install\PSModules\NetworkingDsc.zip"
Destination = "C:\Program Files\WindowsPowerShell\Modules\"
}
Script ComputerManagementDscDownLoad {
SetScript = { Invoke-WebRequest -Uri "http://repo.contoso.com/repo/modules/ComputerManagementDsc.zip" -OutFile "C:\Install\PSModules\ComputerManagementDsc.zip" }
GetScript = { return @{ Result = Test-Path "C:\Install\PSModules\ComputerManagementDsc.zip"
GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript
}
}
TestScript = { Test-Path "C:\Program Files\WindowsPowerShell\Modules\ComputerManagementDsc" }
}
Archive UnpackComputerManagementDsc {
Ensure = "Present"
DependsOn = "[Script]ComputerManagementDscDownLoad"
Path = "C:\Install\PSModules\ComputerManagementDsc.zip"
Destination = "C:\Program Files\WindowsPowerShell\Modules\"
}
Script xPendingRebootDownLoad {
SetScript = { Invoke-WebRequest -Uri "http://repo.contoso.com/repo/modules/xPendingReboot.zip" -OutFile "C:\Install\PSModules\xPendingReboot.zip" }
GetScript = { return @{ Result = Test-Path "C:\Install\PSModules\xPendingReboot.zip"
GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript
}
}
TestScript = { Test-Path "C:\Program Files\WindowsPowerShell\Modules\xPendingReboot" }
}
Archive UnpackxPendingReboot {
Ensure = "Present"
DependsOn = "[Script]xPendingRebootDownLoad"
Path = "C:\Install\PSModules\xPendingReboot.zip"
Destination = "C:\Program Files\WindowsPowerShell\Modules\"
}
}
}
Tentang keamanan
Minus lemak dari DSC di tanah adalah kurangnya akun Run As. Mekanisme ini dengan aman menyimpan akun dalam bentuk nama pengguna + "kata sandi garam" dan memasukkannya ke layanan, yang bertanggung jawab untuk otentikasi. Tanpa itu, DSC tidak dapat mengelola akun atas nama layanan lain. Dan jika kita perlu mengautentikasi di bawah akun dengan hak istimewa khusus, proses otomasi sangat rumit. Misalnya, ini akan menjadi kasus ketika memasukkan server ke domain.Semua yang kami miliki:- kredensial disimpan dalam Teks Biasa,
- kredensial terenkripsi hanya bekerja pada PC di mana mereka dihasilkan.
Dalam praktiknya, ada beberapa solusi. "Rintisan bertopik" baik ketika diprediksi perilaku server harus dipastikan.Kami melakukan "rintisan" setelah konfigurasi server dalam beberapa kasus, jika kami menggunakan:- reboot (sumber xPendingReboot)
- transfer kredensial
- sumber daya lain yang dapat memengaruhi kinerja server sehubungan dengan reboot atau keamanan yang tidak direncanakan.
Untuk melakukan ini, buat dan terbitkan ulang konfigurasi TANPA blok yang berisi sumber daya xPendingReboot dan konfigurasi dengan kredensial.Pendekatan ini hanya berlaku untuk skenario Dorong, karena Tarik cukup mudah dan tidak menyiratkan perubahan konfigurasi dengan cepat. Di artikel selanjutnya daribuldakovKami akan melihat lebih dekat pengaturan dan fitur yang bekerja di mode Push and Pull.Dan juga datang untuk membahas nuansa teknologi DSC dan batas-batas penerapannya pada 28 Mei pukul 18.00 pada pertemuan online pertama komunitas Komunikasi DGTL Raiffeisenbank. Kami juga akan membahas cara membuat teman-teman ELK dan Exchange dan apa yang dapat dilakukan Microsoft Endpoint Manager dalam manajemen perangkat. Ini adalah registrasi untuk mitap .