Get-Test-Set
适用于:Windows PowerShell 4.0 和 Windows PowerShell 5.0
PowerShell Desired State Configuration 是围绕 Get、Test 和 Set 进程构建的。 每个 DSC 资源 都包含完成这些操作的方法。 在配置中,定义资源块来填充成为资源的 Get、Test 和 Set 方法参数的键。
这是 Service 资源块的语法。 Service 资源配置 Windows 服务。
Service [String] #ResourceName
{
Name = [string]
[BuiltInAccount = [string]{ LocalService | LocalSystem | NetworkService }]
[Credential = [PSCredential]]
[Dependencies = [string[]]]
[DependsOn = [string[]]]
[Description = [string]]
[DisplayName = [string]]
[Ensure = [string]{ Absent | Present }]
[Path = [string]]
[PsDscRunAsCredential = [PSCredential]]
[StartupType = [string]{ Automatic | Disabled | Manual }]
[State = [string]{ Running | Stopped }]
}
Service 资源的 Get、Test 和 Set 方法将具有接受这些值的参数块。
param
(
[parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[System.String]
$Name,
[System.String]
[ValidateSet("Automatic", "Manual", "Disabled")]
$StartupType,
[System.String]
[ValidateSet("LocalSystem", "LocalService", "NetworkService")]
$BuiltInAccount,
[System.Management.Automation.PSCredential]
[ValidateNotNull()]
$Credential,
[System.String]
[ValidateSet("Running", "Stopped")]
$State="Running",
[System.String]
[ValidateNotNullOrEmpty()]
$DisplayName,
[System.String]
[ValidateNotNullOrEmpty()]
$Description,
[System.String]
[ValidateNotNullOrEmpty()]
$Path,
[System.String[]]
[ValidateNotNullOrEmpty()]
$Dependencies,
[System.String]
[ValidateSet("Present", "Absent")]
$Ensure="Present"
)
注意
用于定义资源的语言和方法决定了如何定义 Get、Test 和 Set 方法。
由于 Service 资源只有一个必需的键 (Name
),因此 Service 块资源可以非常简单,如下所示:
Configuration TestConfig
{
Import-DSCResource -Name Service
Node localhost
{
Service "MyService"
{
Name = "Spooler"
}
}
}
编译上述配置时,为键指定的值存储在生成的 .mof
文件中。 有关详细信息,请参阅 MOF。
instance of MSFT_ServiceResource as $MSFT_ServiceResource1ref
{
SourceInfo = "::5::1::Service";
ModuleName = "PsDesiredStateConfiguration";
ResourceID = "[Service]MyService";
Name = "Spooler";
ModuleVersion = "1.0";
ConfigurationName = "Test";
};
应用时,本地 Configuration Manager (LCM) 将从 .mof
文件读取值“Spooler”,并将其传递给 Service 资源中“MyService”实例的 Get、Test 和 Set 方法的 Name 参数 。
获取
资源的 Get 方法,检索在目标节点上配置的资源的状态。 此状态作为哈希表返回。 哈希表的键是资源接受的可配置值或参数。
Get 方法直接映射到 Get-DSCConfiguration cmdlet。
调用 Get-DSCConfiguration
时,LCM 运行当前应用配置中每个资源的 Get 方法。 LCM 使用存储在 .mof
中的键值作为每个相应资源实例的参数。
这是配置“Spooler”服务的 Service 资源的示例输出。
ConfigurationName : Test
DependsOn :
ModuleName : PsDesiredStateConfiguration
ModuleVersion : 1.1
PsDscRunAsCredential :
ResourceId : [Service]Spooler
SourceInfo :
BuiltInAccount : LocalSystem
Credential :
Dependencies : {RPCSS, http}
Description : This service spools print jobs and handles interaction with the printer. If you turn off
this service, you won't be able to print or see your printers.
DisplayName : Print Spooler
Ensure :
Name : Spooler
Path : C:\WINDOWS\System32\spoolsv.exe
StartupType : Automatic
State : Running
Status :
PSComputerName :
CimClassName : MSFT_ServiceResource
输出显示了 Service 资源可配置的当前值属性。
Service [String] #ResourceName
{
Name = [string]
[BuiltInAccount = [string]{ LocalService | LocalSystem | NetworkService }]
[Credential = [PSCredential]]
[Dependencies = [string[]]]
[DependsOn = [string[]]]
[Description = [string]]
[DisplayName = [string]]
[Ensure = [string]{ Absent | Present }]
[Path = [string]]
[PsDscRunAsCredential = [PSCredential]]
[StartupType = [string]{ Automatic | Disabled | Manual }]
[State = [string]{ Running | Stopped }]
}
测试
资源的 Test 方法确定目标节点当前是否符合资源的所需状态。 Test 方法返回 $true
或 $false
以仅指示节点是否符合。 调用 Test-DSCConfiguration 时,LCM 调用当前应用配置中每个资源的 Test 方法。 LCM 使用存储在“.mof”中的键值作为每个相应资源实例的参数。
如果任何单个资源的 Test 结果是 $false
,则 Test-DSCConfiguration
返回 $false
,表示该节点不符合。 如果所有资源的 Test 方法都返回 $true
,则 Test-DSCConfiguration
返回 $true
,表示该节点符合。
Test-DSCConfiguration
True
从 PowerShell 5.0 开始,已添加 Detailed 参数。 指定 Detailed 将导致 Test-DSCConfiguration
返回一个对象,该对象包含符合和不符合资源的结果集合。
Test-DSCConfiguration -Detailed
PSComputerName ResourcesInDesiredState ResourcesNotInDesiredState InDesiredState
-------------- ----------------------- -------------------------- --------------
localhost {[Service]Spooler} True
有关详细信息,请参阅 Test-DSCConfiguration。
设置
资源的 Set 方法尝试强制节点符合资源的所需状态。 Set 方法旨在幂等,这意味着 Set 可以多次运行,并始终得到相同的结果而没有错误。 当运行 Start-DSCConfiguration 时,LCM 在当前应用的配置中循环切换每个资源。 LCM 从“.mof”文件检索当前资源实例的键值,并使用它们作为 Test 方法的参数。 如果 Test 方法返回 $true
,则节点符合当前资源,并跳过 Set 方法。 如果 Test 返回 $false
,则节点不符合。 LCM 将资源实例的键值作为参数传递给资源的 Set 方法,使节点恢复符合性。
通过指定 Verbose 和 Wait 参数,可以查看 Start-DSCConfiguration
cmdlet 的进度 。 在此示例中,节点已具有符合性。 Verbose
输出表明跳过了 Set 方法。
PS> Start-DSCConfiguration -Verbose -Wait -UseExisting
VERBOSE: Perform operation 'Invoke CimMethod' with following parameters, ''methodName' =
ApplyConfiguration,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' =
root/Microsoft/Windows/DesiredStateConfiguration'.
VERBOSE: An LCM method call arrived from computer SERVER01 with user sid
S-1-5-21-124525095-708259637-1543119021-1282804.
VERBOSE: [SERVER01]: [] Starting consistency engine.
VERBOSE: [SERVER01]: [] Checking consistency for current configuration.
VERBOSE: [SERVER01]: [DSCEngine] Importing the module
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\DscResources\MSFT_ServiceResource\MSFT
_ServiceResource.psm1 in force mode.
VERBOSE: [SERVER01]: LCM: [ Start Resource ] [[Service]Spooler]
VERBOSE: [SERVER01]: LCM: [ Start Test ] [[Service]Spooler]
VERBOSE: [SERVER01]: [[Service]Spooler] Importing the module MSFT_ServiceResource in
force mode.
VERBOSE: [SERVER01]: LCM: [ End Test ] [[Service]Spooler] in 0.2540 seconds.
VERBOSE: [SERVER01]: LCM: [ Skip Set ] [[Service]Spooler]
VERBOSE: [SERVER01]: LCM: [ End Resource ] [[Service]Spooler]
VERBOSE: [SERVER01]: [] Consistency check completed.
VERBOSE: Operation 'Invoke CimMethod' complete.
VERBOSE: Time taken for configuration job to complete is 1.379 seconds