-
Notifications
You must be signed in to change notification settings - Fork 29
Description
After I lost 2 or 3 days on a stupid oversight and wasted @raandree time I'd like to propose something like a best practices page (if there isn't something already) on composite creation and save someone else a lot of time.
I made a composite where i mixed Get-DscSplattedResource and the conventional Resource definition syntax.
configuration SharePointFarm
{
param
(
# Shortend
)
Import-DscResource -ModuleName SharePointDSC
Import-DscResource -ModuleName xPSDesiredStateConfiguration
$PSBoundParameters.Remove('InstanceName')
# Make the Setup Account a local Administrator
xGroup 'LocalAdministrators' {
Ensure = 'Present'
GroupName = 'Administrators'
MembersToInclude = $SetupAccount.UserName
}
$ExecutionProperties = $PSBoundParameters
$ExecutionProperties.Add('Ensure', 'Present')
$ExecutionProperties.Add('IsSingleInstance', 'Yes')
$ExecutionProperties.Add('PsDscRunAsCredential', $SetupAccount)
if ($ExecutionProperties.ContainsKey('DependsOn'))
{
$ExecutionProperties.DependsOn = '[xGroup]LocalAdministrators'
}
else
{
$ExecutionProperties.Add('DependsOn', '[xGroup]LocalAdministrators')
}
$ExecutionProperties.Remove('SetupAccount')
(Get-DscSplattedResource -ResourceName SPFarm -ExecutionName 'SPFarm' -Properties $ExecutionProperties -NoInvoke).Invoke($ExecutionProperties)
# Setup Wizzard
SPConfigWizard RunConfigWizard
{
IsSingleInstance = "Yes"
PsDscRunAsCredential = $SetupAccount
DependsOn = '[SPFarm]SPFarm'
}
}This code ends up make Composites with the Resouce ID [SharePointFarm] instead of [SharePointFarm]SharePointFarm
What i didn't know is that while Get-DscSplattedResource needs to have the InstanceNameremoved the conventional Resource definition needs it to create the ResourceID correctly.
After moving the .Remove('InstanceName') to the Get-DscSplattedResource Hashtable it works as expected.
configuration SharePointFarm
{
param
(
# Shortend
)
Import-DscResource -ModuleName SharePointDSC
Import-DscResource -ModuleName xPSDesiredStateConfiguration
#
# Make the Setup Account a local Administrator
xGroup 'LocalAdministrators' {
Ensure = 'Present'
GroupName = 'Administrators'
MembersToInclude = $SetupAccount.UserName
}
# Create or Join Farm with SPFarm
$spFarmValidParameters = @('AdminContentDatabaseName', 'ApplicationCredentialKey', 'CentralAdministrationAuth', 'CentralAdministrationPort', 'CentralAdministrationUrl', 'DatabaseCredentials', 'DatabaseServer', 'DeveloperDashboard', 'Ensure', 'FarmAccount', 'FarmConfigDatabaseName', 'Passphrase', 'RunCentralAdmin', 'ServerRole', 'SkipRegisterAsDistributedCacheHost',
'UseSQLAuthentication')
$spFarm = @{
IsSingleInstance = 'Yes'
PsDscRunAsCredential = $SetupAccount
DependsOn = '[xGroup]LocalAdministrators'
}
foreach ($parameter in $spFarmValidParameters)
{
if ($PSBoundParameters.ContainsKey($parameter))
{
$spFarm.Add($parameter, $PSBoundParameters.Item($parameter))
}
}
(Get-DscSplattedResource -ResourceName SPFarm -ExecutionName 'SPFarm' -Properties $spFarm -NoInvoke).Invoke($spFarm)
# Setup Wizzard
SPConfigWizard RunConfigWizard
{
IsSingleInstance = "Yes"
PsDscRunAsCredential = $SetupAccount
DependsOn = '[SPFarm]SPFarm'
}
}For discussion: Could it be a good habit to never remove a Key from the $PSBoundParameters and always call Get-DscSplattedResource with a dedicated Hashtable so you won't stab yourself in the back later if you add a resource.
Alternatively don't mix Get-DscSplattedResource with the conventional definition.