Configuration File و خودکارسازی نصب SQL Server روی Server Core
PAGE-111نتایج نشان میدهند PROSQLADMINCORE2 روی SQL Server Build Version برابر 15.0.1100.94 اجرا میشود که Build Number مربوط به SQL Server 2019 CTP 2.1 است.
Figure 3-4 — شکل/تصویر منبع، صفحه PDF 111استفاده از Config File
در بخشهای مختلف کتاب به استفاده از Configuration File برای ساخت Buildهای Consistent اشاره شده است. Listing 3-7 محتوای یک Configuration File را نشان میدهد که همه Required Parameterهای لازم برای نصب Instance با نام PROSQLADMINCONF1 روی Windows Server Core در آن قرار داده شدهاند. همچنین Optional Parameterهایی برای Enable کردن Named Pipes و TCP/IP، فعالکردن FILESTREAM در Levelی که فقط از T-SQL قابل دسترسی است، Automatic کردن Startup مربوط به SQL Agent Service و تنظیم Collation روی Latin1_General_CI_AS وجود دارد. در File با پسوند .ini، Comment با Semicolon در ابتدای Line تعریف میشود.
PAGE-112 تا PAGE-113Listing 3-7 — Configuration File for SQLPROSQLADMINCONF1
; SQL Server 2019 Configuration File
[OPTIONS]
; Accept the SQL Server License Agreement
IACCEPTSQLSERVERLICENSETERMS
; Specifies a Setup work flow, like INSTALL, UNINSTALL, or UPGRADE.
; This is a required parameter.
ACTION="Install"
; Setup will display progress only, without any user interaction.
QUIETSIMPLE="True"
; Specifies features to install, uninstall, or upgrade.
FEATURES=SQLENGINE,REPLICATION,CONN
; Specify a default or named instance. MSSQLSERVER is the default instance for
; non-Express editions and SQLExpress is for Express editions. This parameter is
; required when installing the SQL Server Database Engine (SQL), Analysis
; Services (AS)
INSTANCENAME="PROSQLADMINCONF1"
; Agent account name
AGTSVCACCOUNT="MyDomain\SQLServiceAccount1"
; Agent account password
AGTSVCPASSWORD="Pa$$w0rd"
; Auto-start service after installation.
AGTSVCSTARTUPTYPE="Automatic"
; Level to enable FILESTREAM feature at (0, 1, 2 or 3).
FILESTREAMLEVEL="1"
; Specifies a Windows collation or an SQL collation to use for the Database
; Engine.
SQLCOLLATION="Latin1_General_CI_AS"
; Account for SQL Server service: Domain\User or system account.
SQLSVCACCOUNT="MyDomain\SQLServiceAccount1"
; Password for the SQL Server service account.
SQLSVCPASSWORD="Pa$$w0rd"
; Windows account(s) to provision as SQL Server system administrators.
SQLSYSADMINACCOUNTS="MyDomain\SQLDBA"
; Specify 0 to disable or 1 to enable the TCP/IP protocol.
TCPENABLED="1"
; Specify 0 to disable or 1 to enable the Named Pipes protocol.
NPENABLED="1"
نکته: اگر Configuration File ایجادشده توسط Installation قبلی SQL Server را Template قرار دهید، Parameterهای داخلی مانند MATRIXCMBRICKCOMMPORT، MATRIXCMSERVERNAME، MATRIXNAME، COMMFABRICENCRYPTION، COMMFABRICNETWORKLEVEL و COMMFABRICPORT را خواهید دید. این Parameterها فقط برای استفاده داخلی Microsoft هستند، باید نادیده گرفته شوند و اثری روی Build ندارند.
اگر این Configuration File با Path مربوط به c:\SQL2019\configuration1.ini ذخیره شده باشد، Listing 3-8 برای اجرای setup.exe از PowerShell استفاده میشود.
Listing 3-8 — Installing SQL Server Using a Configuration File
.\setup.exe /CONFIGURATIONFILE="c:\SQL2019\Configuration1.ini"
PAGE-114 تا PAGE-115این استفاده از Configuration File کاملاً معتبر است، اما میتوان رویکرد پیشرفتهتری داشت و Script قابل استفاده مجددی ساخت که روی هر Server اجرا شود تا Build Process Consistent شود. در اصل نسخه Scripted یک Prepared Stand-alone Image برای Windows Server Core ایجاد میشود. این روش بهویژه زمانی مفید است که Windows Operations Team از Sysprep استفاده نمیکند یا روش دیگری برای Build Server دارد.
Listing 3-9 Configuration File دیگری را نشان میدهد که فقط Static Parameterهایی را شامل میشود که انتظار دارید در کل Estate ثابت باشند. Parameterهایی مانند Instance Name و Service Account Detail که بین Installationها تغییر میکنند حذف شدهاند.
Listing 3-9 — Configuration File for PROSQLADMINCONF2
;SQL Server 2019 Configuration File
[OPTIONS]
; Accept the SQL Server License Agreement
IACCEPTSQLSERVERLICENSETERMS
; Specifies a Setup work flow, like INSTALL, UNINSTALL, or UPGRADE.
; This is a required parameter.
ACTION="Install"
; Setup will display progress only, without any user interaction.
QUIETSIMPLE="True"
; Specifies features to install, uninstall, or upgrade.
FEATURES=SQLENGINE,REPLICATION,CONN
; Auto-start service after installation.
AGTSVCSTARTUPTYPE="Automatic"
; Level to enable FILESTREAM feature at (0, 1, 2 or 3).
FILESTREAMLEVEL="1"
; Specifies a Windows collation or an SQL collation to use for the Database Engine.
SQLCOLLATION="Latin1_General_CI_AS"
; Windows account(s) to provision as SQL Server system administrators.
SQLSYSADMINACCOUNTS="MyDomain\SQLDBA"
; Specify 0 to disable or 1 to enable the TCP/IP protocol.
TCPENABLED="1"
; Specify 0 to disable or 1 to enable the Named Pipes protocol.
NPENABLED="1"
برای Installation موفق باید ترکیبی از Parameterهای Configuration File و Parameterهای Inline در Command اجرای setup.exe استفاده شود. Listing 3-10 فرض میکند File قبلی در C:\SQL2019\Configuration2.ini ذخیره شده و Instance با نام PROSQLADMINCONF2 نصب میشود.
Listing 3-10 — Mix of Parameters and Configuration File
.\SETUP.EXE /INSTANCENAME="PROSQLADMINCONF2"
/SQLSVCACCOUNT="MyDomain\SQLServiceAccount1"
/SQLSVCPASSWORD="Pa$$w0rd"
/AGTSVCACCOUNT="MyDomain\SQLServiceAccount1"
/AGTSVCPASSWORD="Pa$$w0rd"
/CONFIGURATIONFILE="C:\SQL2019\Configuration2.ini"
Automatic Installation Routines
این رویکرد Configuration File ثابتی فراهم میکند که در هر Build جدید نیاز به Modification ندارد. میتوان گام بعدی را برداشت و PowerShell Command را در PowerShell Script ذخیره کرد تا بهجای Rewrite Command در هر بار، Script اجرا و Parameterها به آن ارسال شوند. به این ترتیب Script Consistent برای Build Instanceهای جدید زیر Change Control قرار میگیرد. Listing 3-11 Script پارامتری را نشان میدهد که همان Configuration File را استفاده میکند و فرض میکند D:\ Root Folder مربوط به Installation Media است.
PAGE-116Listing 3-11 — PowerShell Script for Auto-install
param(
[string] $InstanceName,
[string] $SQLServiceAccount,
[string] $SQLServiceAccountPassword,
[string] $AgentServiceAccount,
[string] $AgentServiceAccountPassword
)
D:\SETUP.EXE /INSTANCENAME=$InstanceName
/SQLSVCACCOUNT=$SQLServiceAccount
/SQLSVCPASSWORD=$SQLServiceAccountPassword
/AGTSVCACCOUNT=$AgentServiceAccount
/AGTSVCPASSWORD=$AgentServiceAccountPassword
/CONFIGURATIONFILE="C:\SQL2019\Configuration2.ini"
اگر Script با نام SQLAutoInstall.ps1 ذخیره شود، Listing 3-12 Instance با نام PROSQLADMINAUTO1 را میسازد. Command، PowerShell Script را اجرا کرده و Parameterهایی را ارسال میکند که در setup.exe استفاده میشوند.
Listing 3-12 — Running SQLAutoInstall.ps1
./SQLAutoInstall.ps1 -InstanceName 'PROSQLADMIN1' -SQLServiceAccount
'MyDomain\SQLServiceAccount1' -SQLServiceAccountPassword
'Pa$$w0rd' -AgentServiceAccount 'MyDomain\SQLServiceAccount1'
-AgentServiceAccountPassword 'Pa$$w0rd'
نکته: چون نام Parameterها مشخص شدهاند، لازم نیست به ترتیب Declaration در Script وارد شوند؛ ضمن اینکه Code خواناتر میشود.
بهبود Installation Routine
میتوان SQLAutoInstall.ps1 را بیشتر توسعه داد و Techniqueهای فصل 1 برای OS Configuration و Techniqueهای همین فصل برای Smoke Test را نیز داخل آن قرار داد.
PAGE-117پس از نصب Instance، Script اصلاحشده Listing 3-13 که SQLAutoInstall2.ps1 نامیده میشود، با powercfg گزینه High Performance را تنظیم میکند و با Set-ItemProperty اولویت Background Service را نسبت به Foreground Application بالا میبرد. سپس Smoke Test اجرا میشود تا Running بودن SQL Server و SQL Agent Service و Accessible بودن Instance بررسی شود.
Listing 3-13 — Enhanced PowerShell Auto-install Script
param(
[string] $InstanceName,
[string] $SQLServiceAccount,
[string] $SQLServiceAccountPassword,
[string] $AgentServiceAccount,
[string] $AgentServiceAccountPassword
)
# Initialize ConnectionString variable
$ServerName = $env:computername
$ConnectionString = $ServerName + '\' + $InstanceName
#Install the instance
./SETUP.EXE /INSTANCENAME=$InstanceName
/SQLSVCACCOUNT=$SQLServiceAccount
/SQLSVCPASSWORD=$SQLServiceAccountPassword
/AGTSVCACCOUNT=$AgentServiceAccount
/AGTSVCPASSWORD=$AgentServiceAccountPassword
/CONFIGURATIONFILE="C:\SQL2019\Configuration2.ini"
# Configure OS settings
powercfg -setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
Set-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\ControlPriorityControl -name Win32PrioritySeparation -Type DWORD -Value 24
# Run smoke tests
Get-service -displayname *$InstanceName*
Invoke-sqlcmd -Serverinstance $ConnectionString -Query "SELECT @@SERVERNAME"
PAGE-118علاوه بر ارسال Variableها به setup.exe، Script از $InstanceName بهعنوان Input Smoke Test نیز استفاده میکند. برای Get-Service، Parameter مستقیماً با Wildcard دو طرف ارسال میشود. اما Invoke-Sqlcmd به Full Name Instance شامل Server Name یا Local نیاز دارد. Script نام Server را از Environment Variable مربوط به ComputerName میگیرد، آن را با $InstanceName و یک Backslash میان آنها Concatenate میکند و Result را در $ConnectionString قرار میدهد تا در -Serverinstance استفاده شود.
Production Readiness
در نهایت برای Production-ready کردن Script میتوان Defensive Coding اضافه کرد. با اینکه PowerShell دارای try/catch است، setup.exe یک External Application است که Message و Error خودش را تولید میکند؛ بنابراین مؤثرترین Technique برای اجرای صحیح Script، Mandatory کردن Parameterها است.
Listing 3-14 نسخه اصلاحشدهای با نام SQLAutoInstall3.ps1 است. این Script با Parameter Keyword، Mandatory Attribute را برای هر Parameter روی true قرار میدهد. اگر اجراکننده Parameterی را حذف کند یا در نام آن Typo باشد Installation Fail خواهد شد؛ بنابراین این کار یک Fail-safe ایجاد میکند تا همه Parameterها پیش از اجرای Script وارد شده باشند. همچنین Annotationهایی پیش و پس از هر Step اضافه شدهاند تا هنگام Failure محل Error سریع مشخص شود.
Listing 3-14 — Auto-install Script with Defensive Code
param(
[Parameter(Mandatory=$true)]
[string] $InstanceName,
[Parameter(Mandatory=$true)]
[string] $SQLServiceAccount,
[Parameter(Mandatory=$true)]
[string] $SQLServiceAccountPassword,
[Parameter(Mandatory=$true)]
PAGE-119[string] $AgentServiceAccount,
[Parameter(Mandatory=$true)]
[string] $AgentServiceAccountPassword
)
# Initialize ConnectionString variable
$ServerName = $env:computername
$ConnectionString = $ServerName + '\' + $InstanceName
"Initialize variables complete..."
#Install the instance
./SETUP.EXE /INSTANCENAME=$InstanceName
/SQLSVCACCOUNT=$SQLServiceAccount
/SQLSVCPASSWORD=$SQLServiceAccountPassword
/AGTSVCACCOUNT=$AgentServiceAccount
/AGTSVCPASSWORD=$AgentServiceAccountPassword
/CONFIGURATIONFILE="C:\SQL2019\Configuration2.ini"
"Instance installation complete..."
# Configure OS settings
powercfg -setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
"High Performance power plan configured..."
Set-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\ControlPriorityControl -name Win32PrioritySeparation -Type DWORD -Value 24
"Optimize for background services configured..."
# Run smoke tests
Get-service -displayname *$InstanceName* -ErrorAction Stop
"Service running check complete..."
Invoke-sqlcmd -Serverinstance $ConnectionString -Query "SELECT @@SERVERNAME"
"Instance accessibility check complete..."
PAGE-120SQLAutoInstall3.ps1 بدون Parameter اجرا شده است. در Versionهای قبلی PowerShell Code را اجرا میکرد و setup.exe بعداً به دلیل نبود Value برای Required Parameterها Fail میشد؛ در این Version برای واردکردن Value هر Parameter بهترتیب Prompt نمایش داده میشود.
هنگام اجرای Script پس از هر Phase، Annotationها نمایش داده میشوند. این کار Response به Error را آسانتر میکند، زیرا پیش از تحلیل Error Message مشخص است کدام Command Issue ایجاد کرده است.
جمعبندی
نصب SQL Server روی Windows Server Core میتواند به سادگی اجرای یک PowerShell Command و ارسال Parameterهای مناسب باشد. بااینحال برای Consistency در سراسر Enterprise و کاهش Manual Effort بهتر است Build Process خودکار شود. Configuration File یکی از روشهاست و میتوان فرایند را تا Automation کامل Installation، شامل OS Configuration، گسترش داد. سپس PowerShell Script تحت Change Control نگهداری میشود و هر بار برای Build Instance جدید فقط با Parameterهای مناسب اجرا میگردد.
پس از Installation باید Smoke Test انجام دهید تا Running بودن Serviceها و Accessible بودن Instance تأیید شود و Show-stopping Issueها آشکار شوند. برای Troubleshoot Build، نقطه شروع summary.txt و در صورت نیاز detail.txt است.
همچنین Product Update میتواند جدیدترین Cumulative Update را همراه Base Binaryها نصب کند. Product Update میتواند Microsoft Update، Folder Location یا Network Folder را بررسی کند. اگر Latest Fully Tested Update را روی Network Share نگه دارید، همه Instanceهای جدید Network میتوانند از آن استفاده کنند و برای افزایش Update Level پشتیبانیشده کافی است Update File روی Share را جایگزین کنید.
PAGE-113ادامه Configuration File
فایل Configuration مربوط به نصب SQL Server در این صفحه ادامه مییابد. Collation، Service Account، SQLSYSADMINACCOUNTS، TCP و Named Pipes تنظیم میشوند و سپس setup.exe با /CONFIGURATIONFILE اجرا میشود.
; Specifies a Windows collation or an SQL collation to use for the Database
; Engine.
SQLCOLLATION="Latin1_General_CI_AS"
; Account for SQL Server service: Domain\User or system account.
SQLSVCACCOUNT="MyDomain\SQLServiceAccount1"
; Password for the SQL Server service account.
SQLSVCPASSWORD="Pa$$w0rd"
; Windows account(s) to provision as SQL Server system administrators.
SQLSYSADMINACCOUNTS="MyDomain\SQLDBA"
; Specify 0 to disable or 1 to enable the TCP/IP protocol.
TCPENABLED="1"
; Specify 0 to disable or 1 to enable the Named Pipes protocol.
NPENABLED="1"
Tip If you use a configuration file created by a previous SQL Server installation
as a template for your own config file, you will notice that the following
parameters are specified: MATRIXCMBRICKCOMMPORT, MATRIXCMSERVERNAME,
MATRIXNAME, COMMFABRICENCRYPTION, COMMFABRICNETWORKLEVEL, and
COMMFABRICPORT. These parameters are intended for internal use by Microsoft
only and should be ignored. They have no effect on the build.
Assuming that this configuration file had been saved as c:\SQL2019\configuration1.ini,
then the code in Listing 3-8 could be used to run setup.exe from PowerShell.
Listing 3-8. Installing SQL Server Using a Configuration File
.\setup.exe /CONFIGURATIONFILE="c:\SQL2019\Configuration1.ini"
Chapter 3 Server Core Installation
PAGE-115ترکیب پارامترهای Inline و Configuration File
Configuration2.ini در این صفحه تکمیل میشود و سپس پارامترهای متغیر Instance و Service Account بهصورت Inline در کنار فایل Config به setup.exe داده میشوند. این روش پایه ساخت Script قابل استفاده مجدد است.
SQLCOLLATION="Latin1_General_CI_AS"
; Windows account(s) to provision as SQL Server system administrators.
SQLSYSADMINACCOUNTS="MyDomain\SQLDBA"
; Specify 0 to disable or 1 to enable the TCP/IP protocol.
TCPENABLED="1"
; Specify 0 to disable or 1 to enable the Named Pipes protocol.
NPENABLED="1"
This means that to successfully install the instance, you will need to use a mix of
parameters from the configuration file and also inline with the command that runs
setup.exe, as demonstrated in Listing 3-10. This example assumes that the configuration
in Listing 3-9 has been saved as C:\SQL2019\Configuration2.ini and will install an
instance named PROSQLADMINCONF2.
Listing 3-10. Installing SQL Server Using a Mix of Parameters and a
Configuration File
.\SETUP.EXE /INSTANCENAME="PROSQLADMINCONF2"
/SQLSVCACCOUNT="MyDomain\SQLServiceAccount1"
/SQLSVCPASSWORD="Pa$$w0rd"
/AGTSVCACCOUNT="MyDomain\SQLServiceAccount1"
/AGTSVCPASSWORD="Pa$$w0rd"
/CONFIGURATIONFILE="C:\SQL2019\Configuration2.ini"
Automatic Installation Routines
This approach gives us the benefit of having a consistent configuration file that we do
not need to modify every time we build out a new instance. This idea can be taken even
further, however. If we were to save our PowerShell command as a PowerShell script,
then we could run the script and pass in parameters, rather than rewrite the command
each time. This will give a consistent script for building new instances, which we can
place under change control. The code in Listing 3-11 demonstrates how to construct a
parameterized PowerShell script, which will use the same configuration file. The script
assumes D:\ is the root folder of the installation media.
Chapter 3 Server Core Installation