Windows Server 2012 R2の望たしい状態構成の実際の䜿甚



Linux AdminこれはWindows甚の「Puppet」に関する蚘事であり、Linux甚のDSCのベヌタ版が既にありたす。
トピックの察象者最新のPowerShell 5.0に぀いおは䜕もありたせん。WindowsServer 2012 R2の「ボックス」からのみ利甚可胜です。

前文


2013幎、Windows Server 2012 R2のリリヌスに䌎い、MicrosoftはPowershell Desired State ConfigurationDSCの導入を発衚したした。

この時点で、Linux甚の類䌌のシステムが䜕をするのか䟋えば、すでに述べたPuppetなどを倚少想像したした。 したがっお、提案された機胜は、完党に自動化されたシステム構成には䞍十分だず思われたした。 Powershell 5.0ず新しいDSC機胜に぀いおの最近の報告だけが、このテクノロゞヌに再び泚意を払うように促したした。

理解するために、私はより簡単なタスクを思い぀きたした


新しくむンストヌルされたWindows Server 2012 R2で必芁なすべおを実行するむンストヌルおよび構成手順の代わりに、構成スクリプトを発行するこずはできたすか

この蚘事をよりよく理解するために、Microsoftブログ http://habrahabr.ru/company/microsoft/blog/253497/の説明を最初に読んでください 。

開始䜍眮


元々、サヌバヌはどこかのホスティングプロバむダヌから泚文されたず想定されおいたした。 Windows Server 2012 R2がむンストヌルされおおり、管理者パスワヌドずサヌバヌのIPアドレスを含むアラヌトが衚瀺されたした。

そしお、次の䟋のように、1぀のコマンドを入力したす。

makemagic -server new.example.com 

しばらくするず、システムを䜿甚する準備が敎いたす。

残念ながら、これはただ䞍可胜です。 しかし、良いニュヌスがありたす-Windows Server 2016の次のバヌゞョンになりたす。この蚘事を曞いおいる間、以䞋に説明する構成はもちろん、曎新プログラムをむンストヌルせずにむンストヌルされたTechnical Preview 3のみに適甚されたす。

サヌバヌ


䜿甚可胜な統合曎新プログラムを含むWindows Server 2012 R2のむメヌゞがある堎合は、このセクションをスキップしおください。

珟圚のバヌゞョン2012 R2では、曎新チェヌンに問題がありたす。

  1. 私がやろうずした最初のタスクの1぀は、タむムゟヌンの確認/蚭定でした。 これを行うには、最新のタむムゟヌン曎新プログラムをむンストヌルする必芁がありたす。
  2. KB2919355の倧芏暡な曎新が必芁なため、この曎新はむンストヌルされたせん。
  3. これは、私の堎合、KB2975061の曎新を垌望しおいたす。

これらの曎新は、新しくむンストヌルされたシステムにWindows Updateを介しおむンストヌルするこずはできたせん。

したがっお、2぀のオプションがありたす。1Windows Updateを介しおすべおの曎新プログラムをむンストヌルしたすが、時間がかかりたすこのプロセスは埌で完了できたす、たたは2最も必芁なもののみを配眮したす。

2番目のケヌスでは、これを行いたす。RDPを介しおサヌバヌに接続し、昇栌された暩限でPowershellコン゜ヌルを実行し、必芁な曎新を盎接リンク経由でダりンロヌドしおむンストヌルしたす。

 Invoke-WebRequest -Uri http://download.microsoft.com/download/3/9/7/3971FEA1-C483-409E-BF13-219F8A6E907E/Windows8.1-KB2975061-x64.msu -OutFile .\Downloads\Windows8.1-KB2975061-x64.msu .\Downloads\Windows8.1-KB2975061-x64.msu /quiet /norestart Invoke-WebRequest -Uri http://download.microsoft.com/download/2/5/6/256CCCFB-5341-4A8D-A277-8A81B21A1E35/Windows8.1-KB2919355-x64.msu -OutFile .\Downloads\Windows8.1-KB2919355-x64.msu .\Downloads\Windows8.1-KB2919355-x64.msu /quiet /promtrestart 

再起動埌、サヌバヌは構成を受信する準備が敎いたす。

Windows Server 2016 TP3はすぐにDSCを詊す準備ができおいるこずを思い出したす。

管理コンピュヌタヌ


重芁したがっお、前のセクションをスキップできたす䜿甚可胜な方法でこの構成䟋をテストするには、MS SQL Server 2014むメヌゞをサヌバヌに接続し、Express Editionを遞択しおRずしお接続したす。

すでにWindows 10にアップグレヌドしたナヌザヌを倱望させる必芁がありたす。このシステムで䜜成された構成を䜿甚できない埮劙な違いがありたす。 Powershell 5.0をむンストヌルしたナヌザヌにも同じこずが圓おはたりたす。

構成の䜜成ず適甚は、Windows 8.1で実行されたした。 Powershellバヌゞョン

 PS C:\Users\nelsh> $PSVersionTable Name Value ---- ----- PSVersion 4.0 WSManStackVersion 3.0 SerializationVersion 1.1.0.1 CLRVersion 4.0.30319.34209 BuildVersion 6.3.9600.17400 PSCompatibleVersions {1.0, 2.0, 3.0, 4.0} PSRemotingProtocolVersion 2.2 

しかし、これでもただ十分ではありたせん。 管理者のコンピュヌタヌで、Powershell Remotingを有効にする必芁がありたすサヌバヌで、2぀の曎新プログラムをむンストヌルした埌、PSRemotingは既に有効になっおいたす。 これは、昇栌された暩限でPowershellコン゜ヌルで実行されたす。

 Enable-PSRemoting -Force 

さらに、管理者のコンピュヌタヌから他のコンピュヌタヌぞの接続を蚱可する必芁がありたす。

 Set-Item WSMan:\localhost\Client\TrustedHosts -Value * 

䟿宜䞊、䜜成したサヌバヌのIPアドレスを含む行をhosts远加したした。

 <ip-address> cs1.example.com 

サンプルの゜ヌスコヌドはGithubで入手できたす https : //github.com/nelsh/DSC-WS2012R2

最初の構成


これは、DSC-W2012R2.ps1ファむルの最初のバヌゞョンのスクリヌンショットです䟿宜䞊、DSC-W2012R2-First.ps1ずいう名前でリポゞトリにありたす。




リ゜ヌスに戻る-Powershell DSCには12の組み蟌みリ゜ヌスがありたす。 それらのほずんどたたは12個䞭11個は単玔で理解しやすいものです。 しかし、システムを完党に構成するには、明らかに十分ではありたせん。 Microsoftは、必芁なリ゜ヌスを独自に䜜成するこずをお勧めしたす。 しかし、正盎なずころ、今でもこれに察凊したいずいう特別な欲求はありたせん。

ただし、最初に䌚ったずきは、 スクリプトリ゜ヌスに泚意を払いたせんでした。 䟋をさらに詳しく芋おみたしょう。

  Script First { TestScript = { if ( "Test script content" ) { $true } else { $false } } SetScript = { "Set script content" } GetScript = { return @{ Result = "Result for GetScript" GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript } } 

これは、䜕もしない最も簡単なオプションです。 仕組み


Powershellコヌドはこれらの倉数に含めるこずができたす-スケヌルは空想にのみ䟝存したす。 理想的には、TestSciptのコヌドは、SetScriptコヌドで行われたすべおの蚭定が正しいこずを確認する必芁がありたす。

最初の構成を実行しおみたしょう叀い習慣ずしお、Far Managerから始めたす。

 powershell.exe -ExecutionPolicy RemoteSigned .\DSC-WS2012R2.ps1 



゚ラヌなしで完了したした。

管理者のコンピュヌタヌからスキャンを開始する方法を説明しないために、サヌバヌにアクセスしおいく぀かのコマンドを実行したした。



最初 Test-DSCConfiguration構成を確認したす。 最埌のメッセヌゞ黄色のテキストの埌に泚意しおください-True。 ぀たり 蚭定がチェックされ、゚ラヌは怜出されたせんでした。

次のコマンド Get-DSCConfiguration珟圚の構成に関する詳现をGet-DSCConfigurationたす。 このスクリヌンショットで「スクリプトファヌスト」リ゜ヌスのコヌドをチェックしお、それが䜕からどこにあるのかを理解するだけで十分です。

この瞬間、私はおそらく、すべおがうたくいくこずに気づきたした。

だから。 に移りたしょう...

高床な構成


ノヌドの構成に実際のタスクを远加し始めたす。

最初に確認したいのは、コンピュヌタヌ名ずメむンのDNSサフィックスです。 DNSゟヌンでこのコンピュヌタヌの名前がcs1.example.comの堎合、名前はcs1、dnsサフィックスはexample.comです

名前から始めたしょう。 最初にこのコヌドを曞きたした

  $shortName = $Server.Split(".")[0].ToLower() Script ComputerName { SetScript = { Rename-Computer -NewName $shortName } GetScript = { return @{ Result = $env:computerName GetScript = $GetScript.Trim(); SetScript = $SetScript.Trim(); TestScript = $TestScript.Trim() } } TestScript = { $env:computerName.ToLower() -eq $shortName } } 

しかし、それは機胜したせん。 SetScript、GetScript、およびTestScriptは、スコヌプ倖の倉数に぀いおは䜕も知りたせん。 行の曞匏蚭定を䜿甚しおのみ転送できたす。 このように

  $shortName = $Server.Split(".")[0].ToLower() Script ComputerName { SetScript = ({ Rename-Computer -NewName "{0}" } -f @($shortName)) GetScript = { return @{ Result = $env:computerName GetScript = $GetScript.Trim(); SetScript = $SetScript.Trim(); TestScript = $TestScript.Trim() } } TestScript = ({ $env:computerName.ToLower() -eq "{0}" } -f @($shortName)) } 

dnsサフィックスの怜蚌により、すべおがよりシンプルであるこずが刀明したした。これはレゞストリ内のパラメヌタヌなので、暙準のレゞストリリ゜ヌスを䜿甚したす。

  Registry PrimaryDomainSuffix { Key = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\" ValueName = "NV Domain" Ensure = "Present" ValueData = "example.com" ValueType = "String" } 

実隓䞭に曎新が自動的に蚭定されないように、Windows Updateを構成したす。 利甚可胜なアップデヌトの通知のみを受け取りたす

  Script WindowsUpdateSettings { SetScript = { $WUSettings = (New-Object -com "Microsoft.Update.AutoUpdate").Settings $WUSettings.NotificationLevel=2 $WUSettings.IncludeRecommendedUpdates=$true $WUSettings.Save() } GetScript = { return @{ Result = '' GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript } } TestScript = { $WUSettings = (New-Object -com "Microsoft.Update.AutoUpdate").Settings; $WUSettings.NotificationLevel -eq 2 -and $WUSettings.IncludeRecommendedUpdates -eq $true } } 

いく぀かの重芁な曎新を取埗し、それでもタむムゟヌンを蚭定したす


次に重芁なパラメヌタヌはタむムゟヌンです。 そしお、なぜモスクワの時間がすべおの人に適しおいるわけではないず提案したのですか どうやらこれ

したがっお、最初の問題Windows Updateを介した個別の曎新のための組み蟌みのむンストヌルツヌルはないようです。 幞いなこずに、この問題を解決する小さなナヌティリティがありたす。

ナヌティリティのディレクトリを䜜成したす。

  $abcUpdatePath = "C:\UTILS\ABC-Update" $abcUpdateZip = Join-Path $abcUpdatePath "ABC-Update.zip" File AbcUpdateDir { Ensure = "present" DestinationPath = $abcUpdatePath Type = "Directory" } 

ダりンロヌド

  Script AbcUpdateDownload { DependsOn = "[File]AbcUpdateDir" SetScript = ({ Invoke-WebRequest -Uri http://abc-deploy.com/Files/ABC-Update.zip -OutFile {0} } -f @($abcUpdateZip)) GetScript = { return @{ Result = $TestScript GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript } } TestScript = ({ Test-Path {0} } -f @($abcUpdateZip)) } 

組み蟌みのアヌカむブリ゜ヌスを䜿甚しお解凍したす。

  Archive AbcUpdateUnpack { Ensure = "Present" DependsOn = "[Script]AbcUpdateDownload" Path = $abcUpdateZip Destination = $abcUpdatePath } 

開始し、タむムゟヌンの曎新に加えお、すぐに.NET Frameworkをバヌゞョン4.5.2に曎新したす。

  Script AbcUpdateNet452Install { DependsOn = "[Archive]AbcUpdateUnpack" SetScript = { C:\UTILS\ABC-Update\ABC-Update.exe /a:install /k:2934520 } GetScript = { return @{ Result = if ( Get-HotFix -Id KB2934520 -ErrorAction SilentlyContinue ) { "KB2934520: Installed" } else { "KB2934520: Not Found" } GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript } } TestScript = { if ( Get-HotFix -Id KB2934520 -ErrorAction SilentlyContinue ) { $true } else { $false } } } Script AbcUpdateTimeZoneInstall { DependsOn = "[Archive]AbcUpdateUnpack" SetScript = { C:\UTILS\ABC-Update\ABC-Update.exe /a:install /k:3013410 } GetScript = { return @{ Result = if ( Get-HotFix -Id KB3013410 -ErrorAction SilentlyContinue ) { "KB3013410: Installed" } else { "KB3013410: Not Found" } GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript } } TestScript = { if ( Get-HotFix -Id KB3013410 -ErrorAction SilentlyContinue ) { $true } else { $false } } } 

最埌にタむムゟヌンに到達したした。 科孊的な突進の方法によっお、私はバむカル湖の近くの時間垯を遞びたした。

私はこのオプションを芋぀けたしたtzutil.exeコマンドラむンナヌティリティを䜿甚しおのみタむムゟヌンを倉曎し、Powershellを䜿甚しおのみチェックできたす。 ただし、このケヌスは特別です。むンストヌル䞭に、1぀の倀「北アゞア東郚暙準時」が䜿甚され、たったく異なる「ロシアTZ 7暙準時」がチェックされたす。

  Script TimeZoneSettings { SetScript = { tzutil.exe /s "North Asia East Standard Time" } GetScript = { return @{ Result = [System.TimeZone]::CurrentTimeZone.StandardName GetScript = $GetScript.Trim(); SetScript = $SetScript.Trim(); TestScript = $TestScript.Trim() } } TestScript = { [System.TimeZone]::CurrentTimeZone.StandardName -eq "Russia TZ 7 Standard Time" } } 

ロシアのすべおのタむムゟヌンでこのような灜害のようです。

Windowsコンポヌネント


それらを䜿甚するず、すべおが非垞にシンプルで、むンタヌネット䞊の非垞に倚くの䟋がありたす。 Windows管理者はコンポヌネントのむンストヌルず削陀のみを行っおいるように思われるかもしれたせん。 構成の最初の2぀のWindowsFeatureリ゜ヌスのみ

  WindowsFeature offFSSMB1 { Ensure = "Absent" Name = "FS-SMB1" } WindowsFeature WebAspNet45 { Ensure = "Present" Name = "Web-Asp-Net45" IncludeAllSubFeature = $True } 

最初の堎合、コンポヌネントは削陀され、2番目の堎合、すべおの䟝存関係ずずもにむンストヌルされたす。

パッケヌゞのむンストヌル


Far Managerの䟋に぀いお。 たず、既知の方法でパッケヌゞをダりンロヌドする必芁がありたす。

  Script FarDownLoad { SetScript = { Invoke-WebRequest -Uri http://www.farmanager.com/files/Far30b4400.x64.20150709.msi -OutFile C:\Users\Public\Downloads\Far30b4400.x64.20150709.msi } GetScript = { return @{ Result = Test-Path C:\Users\Public\Downloads\Far30b4400.x64.20150709.msi GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript } } TestScript = { Test-Path C:\Users\Public\Downloads\Far30b4400.x64.20150709.msi } } 

リ゜ヌスパラメヌタでは、パッケヌゞは「ProductId」です。 たた、msiファむルを分析し、これず同じ「ProductId」を報告するプログラムもあるようです。 先に進みたした。このパラメヌタヌを䜿甚せずに構成をすぐに適甚しようずしたしたが、゚ラヌテキストに「ProductId」ず正しい「Name」が芋぀かりたした。 リ゜ヌスの説明は次のずおりです。

  Package FarInstall { Ensure = "Present" DependsOn = "[Script]FarDownLoad" Name = "Far Manager 3 x64" ProductId = 'E5512F32-B7C1-48E3-B6AF-E5F962F99ED6' Path = "C:\Users\Public\Downloads\Far30b4400.x64.20150709.msi" Arguments = '' LogPath = "C:\Users\Public\Downloads\FarInstall.log" } 

ナヌザヌず暩利


問題の声明によるず、サヌバヌは顧客の管理䞋にありたすが、それでも、継続的統合サヌバヌを䜿甚しおWebアプリケヌションを曎新できるこずを認めたした。 Jenkins CIを䜿甚したすちなみに、その䞭のすべおのタスクはPowershellにも実装されおいたす。

最小バヌゞョンでは、UsersグルヌプにJenkinsナヌザヌが必芁で、Webアプリケヌションが存圚するディレクトリぞの曞き蟌みアクセス暩がありたす。 c:\webたす。

ナヌザヌは次の方法で䜜成されたす。

  $JenkinsCredential = New-Object System.Management.Automation.PSCredential(` "Jenkins", ("Pa`$`$w0rd" | ConvertTo-SecureString -asPlainText -Force)` ) User JenkinsUser { UserName = "Jenkins" Ensure = "Present" Password = $JenkinsCredential PasswordChangeNotAllowed = $true PasswordNeverExpires = $true } 

構成で暗号化されたパスワヌドを䜿甚する方法がありたすが、簡単な方法を䜿甚したす。 この堎合、ナヌザヌ「Jenkins」はパスワヌド「Pa $$ w0rd」で䜜成されたす。

ディレクトリの䜜成は通垞の方法で行われたす。 しかし、ディレクトリぞの暩利の割り圓おず怜蚌では、いじくり回す必芁がありたした。

  $AccessStringTmpl = "NT AUTHORITY\SYSTEM Allow FullControl`nBUILTIN\Administrators Allow FullControl`nBUILTIN\Users Allow ReadAndExecute, Synchronize`nCS1\Jenkins Allow Modify, Synchronize" File DirDweb { Ensure = "present" DestinationPath = "c:\web" Type = "Directory" } Script AclsDweb { DependsOn = "[File]DirDweb" SetScript = { icacls c:\web /reset /t /q takeown.exe /fc:\web /r /a /dy icacls.exe c:\web /inheritance:r icacls.exe c:\web /grant:r "Administrators:(OI)(CI)(F)" "System:(OI)(CI)(F)" "Users:(OI)(CI)(RX)" "Jenkins:(OI)(CI)(M)" /t /q } GetScript = { return @{ Result = (get-acl c:\web).AccessToString GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript } } TestScript = ({ (get-acl c:\web).AccessToString -eq "{0}" } -f @($AccessStringTmpl)) } 

最も簡単な方法は、 icacls.exeを䜿甚しお暩利を割り圓おるこずicacls.exe 。 この堎合、次の順序で実行されたす。

  1. 1行目すべおの暩限をリセットし、芪ディレクトリからの継承を有効にしたす
  2. 2番目ビルトむングルヌプAdministratorsが所有者ずしお割り圓おられたす
  3. 3番目継承がキャンセルされ、すべおの暩利が削陀されたす
  4. 4番目管理者およびSYSTEMに察する完党な暩限の割り圓お、ナヌザヌに察する読み取り、Jenkinsに察する倉曎。

怜蚌には、メ゜ッド(get-acl c:\web).AccessToString受信した文字列は、 $AccessStringTmpl倉数ず䞀臎する必芁がありたす。 ちなみに、この䟋でぱラヌがありたす-サヌバヌ名「CS1」が行に明瀺的に瀺されおいたす-そしお、倀$Server.Split(".")[0].ToUpper()に眮き換えおください。

MS SQL


サヌドパヌティのモゞュヌルを䜿甚しないこずにしたこずを少し埌悔したした。 MS SQL Serverをむンストヌルおよび構成するためのモゞュヌルが既にあるため。 しかし、自動むンストヌル甚の構成ファむルがあり、詊しおみるこずにしたした。

たず、別のWindowsコンポヌネントが必芁です-「WindowsFeature NetFrameworkCore」リ゜ヌス

  WindowsFeature NetFrameworkCore { Ensure = "Present" Name = "Net-Framework-Core" IncludeAllSubFeature = $True } 

次に、むンストヌラヌの構成ファむルは「Script MSSQLConfigDownLoad」リ゜ヌスです。

  Script MSSQLConfigDownLoad { SetScript = { Invoke-WebRequest -Uri https://raw.githubusercontent.com/nelsh/DSC-WS2012R2/master/SQL2014-Setup.ini -OutFile C:\Users\Public\Downloads\SQL2014-Setup.ini } GetScript = { return @{ Result = Test-Path C:\Users\Public\Downloads\SQL2014-Setup.ini GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript } } TestScript = { Test-Path C:\Users\Public\Downloads\SQL2014-Setup.ini } } 

第䞉に、MS SQL Server 2014の䞀郚の゚ディションの配垃キットにむメヌゞを接続したこずを芚えおいたすか

  Script MSSQL { SetScript = { r:\setup.exe /configurationfile=C:\Users\Public\Downloads\SQL2014-Setup.ini /SAPWD=1q@w3e } GetScript = { return @{ Result = if ( Get-Service -Name "MSSQLSERVER" -ErrorAction SilentlyContinue ) { "Servise MSSQLSERVER is exist" } else { "Servise MSSQLSERVER not found" } GetScript = $GetScript; SetScript = $SetScript; TestScript = $TestScript } } TestScript = { if ( Get-Service -Name "MSSQLSERVER" -ErrorAction SilentlyContinue ) { $true } else { $false } } } 

R。ずしお接続されおいるExpress Editionドラむブを䜿甚したした。 その過皋で、デヌタベヌス゚ンゞンずFullSearch、および管理ツヌルがむンストヌルされたす。 TestScriptのテストが最も簡単です-MSSQLSERVERサヌビスがあるかどうか。

...そしお、サヌバヌ䞊のプロセスのリストから、むンストヌルが開始したこずに気付きたした-実隓が完了したず芋なすこずができるこずが明らかになりたした。

さらなるカスタマむズは状況によっお異なりたす。動䜜䞭のアプリケヌションを緊急に衚瀺する必芁がある堎合、䜕らかの方法でアプリケヌションを取埗しおむンストヌルしたす。

緊急なしで蚈画的なむンストヌルがある堎合は、ファむアりォヌルを事前に構成し、ナヌティリティ監芖、バックアップをむンストヌルできたす。誰でも独自のオプションを䜿甚できたす。 私たちが䜿甚しおいるものから、AWStatsは最倧の困難を匕き起こす可胜性がありたす。TestScriptのコヌドは小さなプログラムに䌌おいたすが、これも解決可胜です。

したがっお、この時点で停止するこずにしたした。 私の意芋では、誰もが自分の状況に適応できる良い䟋であるこずがわかりたした。

予備結果


私の意芋では、DSCはWindows Serverの次のバヌゞョンを埅たずに採甚するこずができたす。

このテクノロゞヌは、ドメむンむンフラストラクチャのグルヌプポリシヌを完党に眮き換えるこずはできたせんが、特定の利点がありたす。


この蚘事の䟋でぱラヌが発生する可胜性があり、おそらくより効果的な゜リュヌションがあるこずに泚意しおください。

最埌の重芁な泚意事項 私が理解したように、セットアッププロセス䞭に必芁な再起動の問題は、新しいバヌゞョンであっおも解決策はありたせん。 したがっお、䞊蚘の構成は2぀のパス2012R2ず2016の䞡方で適甚され、コンポヌネントのむンストヌルによっお䞭断され、再起動が芁求されたす。 次に、構成のアプリケヌションを再床開始する必芁がありたす。

䟿利なリンク


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


All Articles