Bagaimana cara mengotomatisasi pembuatan mesin virtual? Kami memberi tahu secara detail

Membuat mesin virtual baru adalah rutinitas yang menyita waktu. Dan semakin banyak infrastruktur dan organisasi, semakin banyak prosedur yang terkait dengan proses ini. Kami mengotomatiskan proses ini menggunakan PowerShell.

Selamat datang di kat jika Anda tertarik.




Pemrogram tidak suka melakukan pekerjaan ganda, administrator sistem juga.

Di bawah ini adalah contoh otomatisasi salah satu pelanggan kami.

Kami ingin memastikan bahwa setiap insinyur atau manajer proyek dapat membuat mesin virtual baru dengan upaya minimal dan untuk periode minimum. Pelanggan kami memiliki sistem ITSM, dalam contoh ini adalah ServiceNow, kami membuat formulir web yang sesuai dalam katalog layanan. Untuk "memesan" mesin baru, manajer perlu mengisi kolom dan mengkonfirmasi "pesanan", setelah itu rantai proses diluncurkan, dan pada output kita mendapatkan mesin siap untuk digunakan.

Jadi, mari kita lihat apa yang perlu didefinisikan manajer untuk membuat mesin virtual baru:



Deskripsi VM: deskripsi mesin virtual
Beberapa klarifikasi diperlukan di sini. Dalam solusi kami, PowerShell 5.1 digunakan secara aktif, jadi untuk Windows saja, di masa mendatang kami akan mencoba menambahkan dukungan untuk mesin Unix dan beralih ke PowerShell Core.

OS , sistem operasi. Tidak ada hambatan khusus untuk menggunakan Windows 2008 (R2), tetapi kami menggunakan 2012R2 atau 2016.

Ukuran VM , ukuran mesin virtual. Untuk masing-masing, ini dapat ditentukan dengan caranya sendiri, dalam contoh ini Ram 1CPU-4Gb Kecil, Sedang 2CPU-8Gb, Besar 4-16.

Penyimpanan VM , Disk 0 (C: \) memiliki ukuran tetap yang tidak dapat Anda ubah, hanya pemilih penyimpanan Fast / Slow yang tersedia. "Cepat" dapat menjadi Tier Penyimpanan dengan SSD, dan "Lambat" dapat disimpan pada HDD "biasa" (tentu saja, SAN). Disk1 (Disk2 dan seterusnya) juga memiliki pemilih untuk memilih Penyimpanan, serta bidang untuk memasukkan ukuran yang diinginkan dalam gigabyte, Surat untuk partisi dan ukuran kluster (yang penting untuk SQL Server).

Percayalah , kami menentukan bahwa mesin harus bergabung dengan Domain atau tidak, dengan akses dari Jaringan Publik atau tidak.

Jenis , jenis mesin. Hampir setiap mesin dapat didefinisikan sebagai aplikasi front-end atau back-end atau lainnya dalam semua kasus lainnya. Berdasarkan jenis yang dipilih, kita dapat lebih lanjut menentukan subnet yang paling cocok untuk mesin.

Lingkungan , dalam infrastruktur pelanggan ada dua pusat data: Primer (Produksi) dan Sekunder (Dev / tes), DC dihubungkan oleh saluran komunikasi cepat dan memberikan toleransi kesalahan. Dengan persetujuan, semua mesin virtual di DC Primer memiliki alamat IP mulai dari 10.230, dan di Secondary DC pada 10.231.

(SLA) Perjanjian Tingkat Layanan , parameter ini memengaruhi kualitas layanan untuk mesin ini.

Aplikasi Kami telah menambahkan kemampuan untuk menginstal dan mengkonfigurasi SQL Server. Anda harus memilih edisi, nama instance, dan collation. Dimungkinkan juga untuk mengkonfigurasi peran Server Web dan banyak lagi.

Sekarang kita perlu menentukan cara menyimpan nilai yang dipilih. Kami memutuskan bahwa format yang paling nyaman adalah file JSON. Seperti yang saya katakan sebelumnya, lingkungan pelanggan menggunakan ITSM ServiceNow; manajer, setelah memilih semua nilai yang diperlukan, klik tombol "order" dan setelah itu ServiceNow meneruskan semua parameter ke skrip PowerShell kami (ke ServiceNow back-end), yang akan membuat file JSON. Itu terlihat seperti ini:

.\CreateConfiguration.ps1 -SecurityZone trusted -VMDescription "VM for CRM System" -Requestor "evgeniy.vpro" -OSVersion 2k16 -OSEdition Standard -BuildNewVM -VMEnvironment Prod -VMServiceLevel GOLD -VMSize Medium -Disk0Tier Fast -Disk1Size 50 -Disk1Tier Eco -Disk1Letter D -MSSQLServer -MSSQLInstanceName "Instance1" -SQLCollation Latin1_General_CI_AS -SQLEdition Standard -Disk2Size 35 -Disk3Size 65 


Di badan skrip CreateConfiguration .ps1:

 # PowerShell- $config = [ordered]@{} #    . $config.SecurityZone=$SecurityZone 


Pada akhirnya, ekspor objek kami ke file JSON:

 $ServerConfig = New-Object –TypeName PSObject $config ConvertTo-Json -InputObject $ServerConfig -Depth 100 | Out-File "C:\Configs\TargetNodes\Build\$($Hostname.ToLower()).json" -Force 


Konfigurasi sampel:

 { "Hostname": "dsctest552", "SecurityZone": "trusted", "Domain": "testdomain", "Requestor": "evgeniy.vpro", "VM": { "Size": "Medium", "Environment": "Prod", "SLA": "GOLD", "DbEngine": "MSSQL", "RAM": 8, "Storage": [ { "Id": 0, "Tier": "Fast", "Size": "100", "Allocation": 4, "Letter": "C" }, { "Id": 1, "Tier": "Eco", "Size": 50, "Label": "Data", "Allocation": 64, "Letter": "D" }, { "Id": 2, "Tier": "Fast", "Size": 35, "Label": "Data", "Allocation": 64, "Letter": "E" }, { "Id": 3, "Tier": "Fast", "Size": 65, "Label": "Data", "Allocation": 64, "Letter": "F" } ] }, "Network": { "MAC": "", "IP": "10.230.168.50", "Gateway": "10.230.168.1", "VLAN": “VLAN168” }, "OS": { "Version": "2k16", "Edition": "Standard", "Administrators": [ "LocaAdmin", "testdomain\\ Security-LocalAdmins" ] }, "OU": "OU=Servers,OU=Staging,DC=testdomain", "Applications": [ { "Application": "Microsoft SQL Server 2016", "InstanceName": "vd", "Collation": "Latin1_General_CI_AS", "Edition": "Standard", "Features": "SQLENGINE", "Folders": { "DataRoot": "E:\\MSSQL", "UserDB": "E:\\MSSQL\\MSSQL11.vd\\MSSQL\\Data", "UserLog": "E:\\MSSQL\\MSSQL11.vd\\MSSQL\\Log", "TempDB": "D:\\MSSQL\\MSSQL11.vd\\MSSQL\\TempDB", "TempDBLog": "D:\\MSSQL\\MSSQL11.vd\\MSSQL\\TempDB", "Backup": "E:\\MSSQL\\MSSQL11.vd\\MSSQL\\Backup" }, "MaxMemory": 2147483647 } ], "Description": "VM for CRM", "Certificate": { "File": null, "Thumbprint": null }, "Version": 0 } 


Anda mungkin telah memperhatikan bahwa formulir web tidak memiliki nama mesin virtual dan alamat IP. Kami mendapatkan nilai-nilai ini secara otomatis sebagai berikut:

Nama mesin , ITSM ServiceNow memiliki bagian khusus: CMDB (Basis Data Manajemen Konfigurasi), basis data ini menyimpan semua catatan tentang mesin virtual yang ada, statusnya, tim pendukung, dll. Kami telah membuat sekitar 200 catatan cadangan dengan status yang dialokasikan. Untuk mendapatkan nama untuk mesin virtual, kami membuat permintaan REST ke CMDB dan mendapatkan catatan "bebas" pertama dan mengubah statusnya dari Alokasi ke instalasi Tertunda.

Alamat IP dan VLAN , kami menyebarkan IPAM di jaringan kami - ini adalah fitur bawaan di Windows Server 2016 yang memungkinkan Anda untuk mengelola alamat IP di jaringan Anda. Sama sekali tidak perlu menggunakan semua fitur IPAM (DHCP, DNS, AD), tetapi menggunakannya hanya sebagai basis data alamat IP dengan potensi ekstensi fungsi. Skrip yang membuat file JSON membuat permintaan ke IPAM untuk alamat IP gratis pertama di subnet. Dan subnet VLAN (x / 24 subnet) ditentukan berdasarkan nilai SLA, Environment, Trust, dan Type yang dipilih.
File konfigurasi sudah siap, semua bidang sudah ada, Anda dapat membuat mesin. Pertanyaannya adalah, "bagaimana cara menyimpan kredensial untuk semua skrip kami?". Kami menggunakan paket CredentialManager . Paket ini berfungsi dengan API Credential Manager Windows bawaan untuk menyimpan kata sandi. Contoh membuat kata sandi:

 New-StoredCredential -Target "ESXi" -UserName "testdomain.eu\vmwareadm" -Password "veryultraP@ssw00rd." -Type Generic -Persist LocalMachine 


Kata sandi akan tersedia untuk dibaca dalam mesin dan akun ini.

 $ESXiAdmin = Get-StoredCredential -Type Generic -Target ESXi 


Kami memiliki server tempat semua konfigurasi dengan GIT disimpan, sekarang kami dapat melacak semua perubahan dalam konfigurasi dengan andal: siapa, apa, di mana, dan kapan.

Tugas terjadwal dikonfigurasikan di server ini: periksa folder dengan konfigurasi dan tulis di Windows Event Log tentang semua perubahan.

Setelah 15 menit, tugas yang dijadwalkan akan menulis ke Windows EventLog bahwa file konfigurasi baru telah terdeteksi.

Sudah waktunya untuk memeriksa konfigurasi ini. Pertama-tama, kita perlu memastikan bahwa file memiliki format yang benar:

 $Configuration=(Get-Content -Raw $File | Out-String | ConvertFrom-Json) 


Jika semuanya baik-baik saja, saatnya untuk mulai membuat mesin dan menjalankan skrip BuildVM.ps1.

Dalam BuildVM.ps1, kami memverifikasi bahwa file konfigurasi memiliki deskripsi semua karakteristik mesin virtual: ukuran, env, sla, jenis, penyimpanan, ram, jaringan.

Pastikan untuk memeriksa apakah ada mesin dengan nama yang sama di infrastruktur (CheckVM.ps1).
Kami terhubung melalui VMWare PowerShell CLI ke vSphere kami:

 $VmWareAdmin = Get-StoredCredential -Type Generic -Target ESXi Connect-VIServer -Server "vSphereSrv" -Credential $VmWareAdmin | Out-Null 


Periksa apakah ada mesin dengan nama yang sama di infrastruktur

 $VM=Get-VM $server -ErrorAction SilentlyContinue 


Dan matikan:

 Disconnect-VIServer * -Force -Confirm:$false 


Pastikan bahwa mesin juga tidak tersedia di WinRM

 $ping=Test-NetConnection -ComputerName $Configuration.Hostname -CommonTCPPort WINRM -InformationLevel Quiet -ErrorAction SilentlyContinue 


Jika $ VM dan $ ping kosong, maka Anda dapat membuat mesin baru. (Kami menangani situasi ketika mesin sudah dibuat secara manual di ESXi atau mesin ini di pusat data lain.)

Beberapa kata tentang mobil. Ini adalah gambar mesin virtual yang disiapkan yang diselesaikan oleh sysprep dan dikonversi menjadi templat di vSphere kami. Administrator lokal dengan kata sandi yang kita tahu disimpan dalam gambar, akun ini tidak macet setelah sysprep, yang akan memungkinkan kita untuk mengakses setiap mesin dari templat ini, dan nanti kita dapat mengganti kata sandi ini untuk tujuan keamanan.


Menciptakan mesin virtual


Temukan gugus SLR yang sesuai:

 $Cluster=Get-Cluster -Name $Configuration.VM.SLA 


Periksa apakah kami memiliki cukup ruang di Datastore:

 $DatastoreCluster = Get-DatastoreCluster |Where-Object {$_.Name -like $Datastore1Name} $Datastore1 = Get-Datastore -Location $DatastoreCluster |sort -Property "FreeSpaceGB" |select -Last 1 IF ($Datastore1.FreeSpaceGB -le "200"){ Write-Host -foreground red "STOP: Not enough datastore capacity for DISK" $vdisk.Id Break } 


Dan cukup memori:

 $VMHost = Get-VMHost -Location $Cluster |sort -Property "MemoryUsageGB" |select -First 1 IF ($VMHost.MemoryUsageGB -le "20"){ Write-Host -foreground red "STOP: No enough ESXi host capacity" Break } 


Kami mengambil templat kami

 $VMTemplate = Get-Template -Name 'Win2016_Std_x64_Template' 


Dan buat mesin virtual baru

 New-VM -Name $Configuration.Hostname.ToUpper() -VMHost $VMHost -ResourcePool $ResourcePool -Datastore $Datastore -Template $VMTemplate -Location "AutoDeployed VMs" 


Penting untuk menghubungkan antarmuka jaringan ke subnet dengan DHCP diaktifkan.

Kami memulai mesin virtual

 Start-VM $VM 


Dan simpan deskripsi mesin, sehingga nanti Anda bisa menentukan mesin di level VMWare.

 Set-Annotation -Entity $VM -CustomAttribute "Change request" -Value $Configuration.Request -Confirm:$false Set-VM $VM -Notes $Configuration.Description -Confirm:$false 


Mesin mulai hidup dan sekarang kita bisa mengetahui alamat MAC yang diterima:

 $vMAC = (($VM | Get-NetworkAdapter | Select-Object -Property "MacAddress").MacAddress).Replace(':','') 


Simpan nilai ini ke file JSON kami.

 $Configuration.Network.MAC=$VMAC ConvertTo-Json -InputObject $Configuration -Depth 100 | Out-File "C:\Configs\TargetNodes\Build\$Hostname.json" -Force 


Inilah saatnya untuk berkomitmen pada Git kami bahwa mesin tersebut dibuat dan memiliki MAC uniknya sendiri.

Mesin mulai menginisialisasi (setelah sysprep), mengatur peralatan dan konfigurasi awal.

Mari kita tunggu sampai mesin WinRM kami tersedia dengan skrip EstablishConnection.ps1.

Pertama-tama kita mencari tahu IP apa yang diterima mesin dari DHCP:

 # $MAC = $vMAC while($isOnline -ne $true){ if((Get-DhcpServerv4Lease -ClientId $MAC -ScopeId $StagingDHCPScope -ComputerName $DHCPServer -ErrorAction Ignore).IPAddress.IPAddressToString){ $tempIP=(Get-DhcpServerv4Lease -ClientId $MAC -ScopeId $StagingDHCPScope -ComputerName $DHCPServer).IPAddress.IPAddressToString break } else{ if($isOnline -ne $true){ Write-Host "`r$i`t" -NoNewline $i++ } } } 


Dan sekarang kita akan menunggu, ketika mesin akan tersedia di WinRM:

 $LocalAdmin = Get-StoredCredential -Type Generic -Target LocalAdmin $i=0 $isOnline=$false while($isOnline -ne $true){ if(Invoke-Command -ComputerName $tempIP -ScriptBlock{ Get-ItemProperty -Path "Registry::\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing" } -Credential $LocalAdmin -ErrorAction SilentlyContinue){ $isOnline=$true break } else{ if($isOnline -ne $true){ Write-Host "`r$i" -NoNewline $i++ Start-Sleep -Seconds 1 } } } 


Mesin siap mengemudi.

Konfigurasi keadaan yang diinginkan


Untuk mengkonfigurasi konfigurasi yang diinginkan, kami menggunakan bagian PowerShell - DSC (Configuration State Configuration). Ada Server Tarik DSC yang dikonfigurasi di jaringan: dscpull.testdomain.eu.
Di bawah ini adalah konfigurasi Server Tarik DSC kami. Artikel bagus tentang konfigurasi Tarik DSC.

 Node $NodeName { WindowsFeature DSCServiceFeature { Ensure = "Present" Name = "DSC-Service" } xDscWebService PSDSCPullServer { Ensure = "Present" EndpointName = "PSDSCPullServer" Port = 8080 PhysicalPath = "$env:SystemDrive\inetpub\PSDSCPullServer" CertificateThumbPrint = $certificateThumbPrint ModulePath = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Modules" ConfigurationPath = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration" State = "Started" DependsOn = "[WindowsFeature]DSCServiceFeature" RegistrationKeyPath = "$env:PROGRAMFILES\WindowsPowerShell\DscService" AcceptSelfSignedCertificates = $true UseSecurityBestPractices = $true } File RegistrationKeyFile { Ensure = 'Present' Type = 'File' DestinationPath = "$env:ProgramFiles\WindowsPowerShell\DscService\RegistrationKeys.txt" Contents = $RegistrationKey } } 


Ini tersedia di: https://dscpull.testdomain.eu:8080

Titik Akhir: https://dscpull.testdomain.eu:8080/PSDSCPullserver.svc

Semua klien server tarik harus memiliki PowerShell 5.1 yang diinstal
Jika tidak PowerShell 5.1 diinstal:

 $PSVersionTable.PSVersion.Major –lt 5 


instal PowerShell 5.1:

 Write-Host "Download PowerShell 5.1" Invoke-Command -ComputerName $Node -ScriptBlock { [System.Net.ServicePointManager]::SecurityProtocol=[System.Net.SecurityProtocolType]::Tls12;Invoke-WebRequest -Uri "https://dscpull.testdomain.eu:8080/Files/Updates/WMF.msu" -OutFile C:\TEMP\WMF.MSU } Write-Host "Extract PowerShell 5.1" Invoke-Command -ComputerName $Node -ScriptBlock {Start-Process -FilePath 'wusa.exe' -ArgumentList "C:\temp\WMF.msu /extract:C:\temp\" -Wait -PassThru } Write-Host "Apply PowerShell 5.1" Invoke-Command -ComputerName $Node -ScriptBlock {Start-Process -FilePath 'dism.exe' -ArgumentList "/online /add-package /PackagePath:C:\temp\WindowsBlue-KB3191564-x64.cab /Quiet" -Wait -PassThru } Write-Host "PowerShell 5.1 has been installed" 


Server PKI juga digunakan di jaringan kami. Ini adalah kondisi untuk enkripsi aman kredensial yang disimpan dalam file msa DSC (file Mof adalah "bahasa" di mana Pull Server dan kliennya berkomunikasi). Ketika klien mencoba mendaftar pada Server Tarik, perlu untuk menentukan sertifikat cetak sidik jari dan kemudian pada Server Tarik akan menggunakan sertifikat ini untuk mengenkripsi kata sandi. Di bawah ini kita akan melihat cara kerjanya.

Impor Root CA ke mesin baru kami:

  Invoke-Command -ComputerName $server -ScriptBlock{ $PKI="-----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQSPIjcff9rotNdxbg3+ygqDANBgkqhkiG9w0BAQUFADAe **************************************************************** znafMvVx0B4tGEz2PFss/FviGdC3RohBHG0rF5jO50J4nS/3cGGm+HGdn1w/tZd0 a0FWpn9VCOSmXM2It+tSW1f4nZVt6T2kr1ZlTxkDhT7HMSGsrX/XJswzCkDGe3dE qrVVjNUkhVTaeeBWdujB5J6mcx7YkNsAUhODiS9Cf7FnYnxLFA72M0pijI48P5F0 ShM9HWAAUIrLkv13ug== -----END CERTIFICATE-----" $PKI | Out-File RootCA.cer Import-Certificate RootCA.cer -CertStoreLocation Cert:\LocalMachine\Root | select Thumbprint | Out-Null } -Credential $LocalAdmin | Out-Null 


Untuk pekerjaan lebih lanjut, kami membutuhkan sepasang kunci RSA. Kami akan menghasilkan sertifikat yang ditandatangani sendiri dan untuk sementara bekerja dengannya.

Sekarang kita bisa mendaftar di Server Tarik:

 $DscHostFQDN = [System.Net.Dns]::GetHostEntry([string]$env:computername).HostName $DscPullServerURL = "https://$($DscHostFQDN):8080/PSDSCPullserver.svc" $DscWebConfigChildPath = '\inetpub\psdscpullserver\web.config' $DscWebConfigPath = Join-Path -Path $env:SystemDrive -ChildPath $DscWebConfigChildPath $DscWebConfigXML = [xml](Get-Content $DscWebConfigPath) $DscRegKeyName = 'RegistrationKeys.txt' $DscRegKeyXMLNode = "//appSettings/add[@key = 'RegistrationKeyPath']" $DscRegKeyParentPath = ($DscWebConfigXML.SelectNodes($DscRegKeyXMLNode)).value $DscRegKeyPath = Join-Path -Path $DscRegKeyParentPath -ChildPath $DscRegKeyName $DscRegKey = Get-Content $DscRegKeyPath [DSCLocalConfigurationManager()] configuration RegisterOnPull { Node $Node { Settings { ConfigurationModeFrequencyMins = 1440 CertificateID = $Thumbprint RefreshMode ='Pull' RefreshFrequencyMins = 1440 RebootNodeIfNeeded = $true ConfigurationMode ='ApplyAndAutoCorrect' AllowModuleOverwrite = $true DebugMode = 'None' StatusRetentionTimeInDays = 1 } ConfigurationRepositoryWeb $([string]$env:computername) { ServerURL = $DscPullServerURL RegistrationKey = $DscRegKey CertificateID = $Thumbprint ConfigurationNames = @("$hostx") } } } RegisterOnPull -OutputPath $MetaConfigsStorage Set-DscLocalConfigurationManager -ComputerName $Node -Path $MetaConfigsStorage -Verbose -Force -Credential $LocalAdmin 


Kirim konfigurasi pertama ke mesin kami

 Configuration Rename { param ( [Parameter()] [System.String[]] $Node, $hostname ) Import-DscResource -ModuleName xComputerManagement Import-DscResource –ModuleName PSDesiredStateConfiguration Node $Node { xComputer JoinDomain { Name = $hostname } } } Rename -Node $Node -OutputPath $DscConfigPath -hostname $hostname New-DscChecksum $DscConfigPath -Force Invoke-Command -ComputerName $Node -ScriptBlock{Update-DscConfiguration -Verbose -Wait } -Credential $LocalAdmin -Verbose 


Server akan secara otomatis mengganti nama dan reboot. Sekarang kita bisa menjalankan Join Domain.

 Configuration JoinAD { param ( [Parameter()] [System.String[]] $Node, [Parameter(Mandatory = $true)] [ValidateNotNullorEmpty()] [System.Management.Automation.PSCredential] $DomainAdmin, $hostname, $domain ) Import-DscResource -ModuleName xComputerManagement Import-DscResource –ModuleName PSDesiredStateConfiguration Node $Node { xComputer JoinDomain { Name = $hostname DomainName = $domain Credential = $DomainAdmin JoinOU = "OU=Servers,OU=Staging,DC=testdomain,DC=eu" } GroupSet LocalAdmins { GroupName = @( 'Administrators') Ensure = 'Present' MembersToInclude = @( 'testdomain-eu\dscstaging' ) } } } $cd = @{ AllNodes = @( @{ NodeName = $Node PSDscAllowPlainTextPassword = $false PSDscAllowDomainUser=$true Certificatefile = $CertFile Thumbprint = $Certificate.ToString() } ) } JoinAD -Node $Node -OutputPath $DscConfigPath -DomainAdmin $DomainAdmin -hostname $hostname -ConfigurationData $cd -domain $domain New-DscChecksum $DscConfigPath -Force Invoke-Command -ComputerName $Node -ScriptBlock{Update-DscConfiguration -Verbose -Wait } -Credential $LocalAdmin -Verbose 


Seperti inilah tampilan file mof kami:

 instance of MSFT_Credential as $MSFT_Credential1ref { Password = "-----BEGIN CMS-----\nMIIBsgYJKoZIhvcNAQcDoIIBozCCAZ8CAQAxggFKMIIBRgIBADAuMBoxGDAWBgNVBAMMD1dJTi1H\nNFFKTFFQME4xNQIQOQN77pxew75HU6l7GPn99TANBgkqhkiG9w0BAQcwAASCAQAlhFf7Zs2gJbJEnc1DEK2yWbKcO+BEyD2cr6vKHdn\nQ9TrjvbysEOvYjT15o6MccwkMEwGCSqGSIb3DQEHATAdBglghkgBZQMEASoEEEdKJT+GX4IkPezR\nwYncyQiAIAFKxwJocH4ufRsq9L2Ipkp+VQCx2ljlwif6ac4X/PqG\n-----END CMS-----"; UserName = "testdomain.eu\\service_DomainJoin_001"; }; instance of MSFT_xComputer as $MSFT_xComputer1ref { ResourceID = "[xComputer]JoinDomain"; Credential = $MSFT_Credential1ref; DomainName = "testdomain.eu"; SourceInfo = "C:\\Program Files\\WindowsPowerShell\\Scripts\\JoinAD.ps1::34::9::xComputer"; Name = "dsctest51"; JoinOU = "OU=Servers,OU=Staging,DC=testdomain,DC=eu"; ModuleName = "xComputerManagement"; ModuleVersion = "4.1.0.0"; ConfigurationName = "JoinAD"; }; nMIIBsgYJKoZIhvcNAQcDoIIBozCCAZ8CAQAxggFKMIIBRgIBADAuMBoxGDAWBgNVBAMMD1dJTi1H \ nNFFKTFFQME4xNQIQOQN77pxew75HU6l7GPn99TANBgkqhkiG9w0BAQcwAASCAQAlhFf7Zs2gJbJEnc1DEK2yWbKcO + BEyD2cr6vKHdn \ nQ9TrjvbysEOvYjT15o6MccwkMEwGCSqGSIb3DQEHATAdBglghkgBZQMEASoEEEdKJT + GX4IkPezR \ nwYncyQiAIAFKxwJocH4ufRsq9L2Ipkp + VQCx2ljlwif6ac4X / PqG \ n ----- END CMS -----"; instance of MSFT_Credential as $MSFT_Credential1ref { Password = "-----BEGIN CMS-----\nMIIBsgYJKoZIhvcNAQcDoIIBozCCAZ8CAQAxggFKMIIBRgIBADAuMBoxGDAWBgNVBAMMD1dJTi1H\nNFFKTFFQME4xNQIQOQN77pxew75HU6l7GPn99TANBgkqhkiG9w0BAQcwAASCAQAlhFf7Zs2gJbJEnc1DEK2yWbKcO+BEyD2cr6vKHdn\nQ9TrjvbysEOvYjT15o6MccwkMEwGCSqGSIb3DQEHATAdBglghkgBZQMEASoEEEdKJT+GX4IkPezR\nwYncyQiAIAFKxwJocH4ufRsq9L2Ipkp+VQCx2ljlwif6ac4X/PqG\n-----END CMS-----"; UserName = "testdomain.eu\\service_DomainJoin_001"; }; instance of MSFT_xComputer as $MSFT_xComputer1ref { ResourceID = "[xComputer]JoinDomain"; Credential = $MSFT_Credential1ref; DomainName = "testdomain.eu"; SourceInfo = "C:\\Program Files\\WindowsPowerShell\\Scripts\\JoinAD.ps1::34::9::xComputer"; Name = "dsctest51"; JoinOU = "OU=Servers,OU=Staging,DC=testdomain,DC=eu"; ModuleName = "xComputerManagement"; ModuleVersion = "4.1.0.0"; ConfigurationName = "JoinAD"; }; 


Kredensial terenkripsi DSC dari akun layanan dengan hak Admin Domain: testdomain.eu \\ service_DomainJoin_001 dengan sertifikat yang ditandatangani sendiri. Klien DSC dengan Kunci Privatnya mendekripsi kredensial dan menerapkan semua modul konfigurasi dengan kredensial domain yang ditentukan. Dalam hal ini, ia melakukan Domain Bergabung di unit organisasi yang ditentukan.

 GroupSet LocalAdmins { GroupName = @( 'Administrators') Ensure = 'Present' MembersToInclude = @( testdomain-eu\dscstaging' ) } 


Modul ini menambahkan dscstaging ke administrator lokal untuk konfigurasi lebih lanjut.

Setelah mem-boot ulang, kita akan dapat memasuki mesin dengan kredensial domain.

Kami sedang menunggu server menerima sertifikat dari PKI kami (kami telah mengonfigurasi pendaftaran otomatis) dan di masa mendatang kami akan bekerja dengan sertifikat yang dikeluarkan oleh PKI kami.

 $vmcert=Invoke-Command -ComputerName $server -ScriptBlock{ return Get-ChildItem -Path cert:\LocalMachine\My | where {$_.EnhancedKeyUsageList.FriendlyName -eq "Document Encryption"-and $_.Issuer -eq "CN=TestDomain Issuing CA, DC=testdomain, DC=eu"} } -ErrorAction Ignore 


Sekarang mendaftar untuk Tarik Server lagi dengan cap jempol yang diperbarui.

Itu saja, mesin yang bergabung dengan domain, dan kita bisa menggunakannya dengan cara yang sesuai dengan kita.

Instal SQL Server


File JSON menjelaskan persyaratan untuk MS SQL Server, kami juga menggunakan DSC untuk menginstal dan mengkonfigurasi SQL Server. Seperti inilah bentuk konfigurasi:

 Configuration $Node{ WindowsFeature "NetFramework35"{ Name = "NET-Framework-Core" Ensure = "Present" Source = "\\$DscHostFQDN\Files\Updates" } WindowsFeature "NetFramework45"{ Name = "NET-Framework-45-Core" Ensure= "Present" } SqlSetup "MSSQL2012NamedInstance"{ InstanceName = $MSSQL.InstanceName Features = $MSSQL.Features ProductKey = $ProductKey SQLCollation = $MSSQL.Collation SQLSysAdminAccounts = @('testdomain-EU\SQLAdmins',' testdomain-EU\Backup') InstallSharedDir = "C:\Program Files\Microsoft SQL Server" InstallSharedWOWDir = "C:\Program Files (x86)\Microsoft SQL Server" InstallSQLDataDir = $MSSQL.DataRoot SQLUserDBDir = $MSSQL.UserDBDir SQLUserDBLogDir = $MSSQL.UserLogDir SQLTempDBDir = $MSSQL.TempDBDir SQLTempDBLogDir = $MSSQL.TempDBLogDir SQLBackupDir = $MSSQL.BackupDir SourcePath = $SQLSource SAPwd = $SA SecurityMode = 'SQL' UpdateSource = ".\Updates" Action = "Install" ForceReboot = $True SQLSvcAccount = $SqlServiceCredential AgtSvcAccount = $SqlServiceCredential ISSvcAccount = $SqlServiceCredential BrowserSvcStartupType = "Automatic" DependsOn = '[WindowsFeature]NetFramework35', '[WindowsFeature]NetFramework45' } 

Di mana $ MSSQL didefinisikan:
 $MSSQL=$Configuration.Applications | where {$_.Application -eq "Microsoft SQL Server 2012"} 


$ MSSQL.InstanceName - semua ini ditunjukkan dalam file Json kami. Menerapkan konfigurasi ini akan menginstal MS SQL Server dengan semua pembaruan di folder Pembaruan dan me-restart server jika perlu.

Mobil sudah siap.

Servis sekarang


Ada beberapa API yang tersedia di Layanan-Sekarang. Kami menggunakan API Istirahat.
Untuk mendapatkan daftar mesin dengan status yang dialokasikan, kueri formulir digunakan:
instance.service-now.com/cmdb_ci_server_list.do?sysparm_query=install_status=16 ^ u_subtype = ^ ORDERBYname
Di PowerShell, tampilannya seperti ini:
 $url="https://instance.service-now.com/api/now/table/cmdb_ci_server?sysparm_query=install_status=16^u_subtype=^ORDERBYname" $uri= new-object System.Uri("https://instance.service-now.com/") #       $credentials = (Get-StoredCredential -Type Generic -Target DSC).GetNetworkCredential() $credentials = new-object System.Net.NetworkCredential $credentials.UserName, $credentials.SecurePassword Add-Type -AssemblyName System.Net.Http $handler = New-Object System.Net.Http.HttpClientHandler $handler.CookieContainer = New-Object System.Net.CookieContainer $handler.UseCookies=$true $handler.Credentials=$credentials $HttpClient = New-Object System.Net.Http.HttpClient($handler) $HttpClient.BaseAddress= $uri $Header = New-Object System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json") $HttpClient.DefaultRequestHeaders.Accept.Clear() $HttpClient.DefaultRequestHeaders.Accept.Add($Header); $response=$HttpClient.GetAsync($url) $respStream=$response.Result.Content.ReadAsStringAsync() $Servers = $respStream.Result | ConvertFrom-Json #   Configuration Items  $ServersCI=$Servers.result 

Objek array pertama adalah nama host yang kita butuhkan.
Jika mesin siap, maka Anda dapat mengubah status mesin di Service-Now, untuk ini skrip UpdateCI.ps1:
 param( $CI, [ValidateSet("Allocated","In use","Pending install")] $NewStatus='In use' ) $url="https://instance.service-now.com/api/now/table/cmdb_ci_server?sysparm_query=name=$CI" $uri= new-object System.Uri("https://instance.service-now.com/") $credentials = (Get-StoredCredential -Type Generic -Target DSC).GetNetworkCredential() $credentials = new-object System.Net.NetworkCredential $credentials.UserName, $credentials.SecurePassword Add-Type -AssemblyName System.Net.Http $handler = New-Object System.Net.Http.HttpClientHandler $handler.CookieContainer = New-Object System.Net.CookieContainer $handler.UseCookies=$true $handler.Credentials=$credentials $HttpClient = New-Object System.Net.Http.HttpClient($handler) $HttpClient.BaseAddress= $uri $Header = New-Object System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json") $HttpClient.DefaultRequestHeaders.Accept.Clear() $HttpClient.DefaultRequestHeaders.Accept.Add($Header); $response=$HttpClient.GetAsync($url) $respStream=$response.Result.Content.ReadAsStringAsync() $Servers = $respStream.Result | ConvertFrom-Json $ServerCI=$Servers.result[0] $update=@{} if($NewStatus -eq "In use"){ $update.install_status=1 } if($NewStatus -eq "Pending install"){ $update.install_status=4 } $stringcontent = New-Object System.Net.Http.StringContent((ConvertTo-Json -InputObject $update -Depth 100),[System.Text.Encoding]::UTF8, "application/json"); $result=$HttpClient.PutAsync("https://instance.service-now.com/api/now/table/cmdb_ci_server/$($ServerCI.sys_id)", $stringcontent) 

Untuk mendapatkan tabel dan catatan, REST API GET permintaan digunakan, untuk mengubah catatan permintaan PUT / POST, di tubuh mana bidang yang perlu Anda ubah.

Kami telah membuat alat yang nyaman dengan alat grafis seperti Azure Portal, yang memungkinkan kami mengelola infrastruktur di tempat senyaman mungkin bagi kami dan pelanggan kami.
PS 12.24.2018. Apakah semuanya tampak ketinggalan zaman? Saatnya menggunakan Azure DevOps. Pada artikel berikutnya, saya akan menunjukkan kepada Anda bagaimana melakukan semua ini dengan pipa Azure DevOps.

Source: https://habr.com/ru/post/id425129/


All Articles