diff --git a/LICENSE b/LICENSE
index 508286bf..b1a429ba 100644
--- a/LICENSE
+++ b/LICENSE
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
- Copyright (c) 2018-2021 Environmental Systems Research Institute, Inc.
+ Copyright (c) 2018-2022 Environmental Systems Research Institute, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/Modules/ArcGIS/ArcGIS.psd1 b/Modules/ArcGIS/ArcGIS.psd1
index 66a950b3..e1be34a0 100644
--- a/Modules/ArcGIS/ArcGIS.psd1
+++ b/Modules/ArcGIS/ArcGIS.psd1
@@ -3,7 +3,7 @@
#
# Generated by: Esri
#
-# Generated on: 11/18/2021
+# Generated on: 02/17/2022
#
@{
@@ -12,7 +12,7 @@
# RootModule = ''
# Version number of this module.
- ModuleVersion = '3.3.0'
+ ModuleVersion = '3.3.1'
# Supported PSEditions
# CompatiblePSEditions = @()
@@ -27,7 +27,7 @@
CompanyName = 'Esri'
# Copyright statement for this module
- Copyright = '(c) 2018-2021 ESRI. All rights reserved.'
+ Copyright = '(c) 2018-2022 ESRI. All rights reserved.'
# Description of the functionality provided by this module
Description = 'ArcGIS Module for PowerShell DSC'
@@ -69,7 +69,7 @@
NestedModules = @('ArcGIS.psm1')
# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
- FunctionsToExport = 'Get-FQDN', 'Invoke-ArcGISConfiguration', 'Invoke-PublishWebApp', 'Invoke-BuildArcGISAzureImage', 'Invoke-PublishGISService', 'Get-ArcGISProductDetails'
+ FunctionsToExport = 'Get-FQDN', 'Invoke-ArcGISConfiguration', 'Invoke-PublishWebApp', 'Invoke-BuildArcGISAzureImage', 'Invoke-PublishGISService', 'Get-ArcGISProductDetails', 'Wait-ForServiceToReachDesiredState'
# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.
CmdletsToExport = @()
@@ -107,7 +107,7 @@
# IconUri = ''
# ReleaseNotes of this module
- ReleaseNotes = 'ArcGIS Module for PowerShell DSC - 3.3.0'
+ ReleaseNotes = 'ArcGIS Module for PowerShell DSC - 3.3.1'
# External dependent modules of this module
# ExternalModuleDependencies = ''
diff --git a/Modules/ArcGIS/ArcGIS.psm1 b/Modules/ArcGIS/ArcGIS.psm1
index 20cb8c9d..18e9eb3c 100644
--- a/Modules/ArcGIS/ArcGIS.psm1
+++ b/Modules/ArcGIS/ArcGIS.psm1
@@ -375,7 +375,10 @@ function Invoke-CreateNodeToAdd
$PortalContext,
[System.Boolean]
- $WebAdaptorAdminAccessEnabled
+ $WebAdaptorAdminAccessEnabled,
+
+ [System.Object]
+ $SslRootOrIntermediate
)
$NodeToAdd = @{ NodeName = $Node.NodeName }
@@ -391,10 +394,19 @@ function Invoke-CreateNodeToAdd
$SSLCertificate = ($Node.SslCertificates | Where-Object { $_.Target -icontains $TargetComponent } | Select-Object -First 1)
$SSLPassword = if($SSLCertificate.PasswordFilePath){ Get-Content $SSLCertificate.PasswordFilePath | ConvertTo-SecureString }else{ ConvertTo-SecureString $SSLCertificate.Password -AsPlainText -Force }
+ #Ignore SslRootOrIntermeditate certs specified in per node of unsupported components.
+ if($TargetComponent -ieq "Server" -or $TargetComponent -ieq "Portal"){
+ if($SSLCertificate.SslRootOrIntermediate)
+ {
+ $SslRootOrIntermediate = $SSLCertificate.SslRootOrIntermediate
+ }
+ }
+
$NodeToAdd["SSLCertificate"] = @{
Path = $SSLCertificate.Path
CName = $SSLCertificate.CNameFQDN
Password = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ("SSLCertPlaceholder",$SSLPassword)
+ SslRootOrIntermediate = if($SslRootOrIntermediate){($SslRootOrIntermediate | ConvertTo-Json)}else{$null}
}
}
@@ -592,6 +604,7 @@ function Invoke-ArcGISConfiguration
$JobFlag = Invoke-DSCJob -ConfigurationName $ConfigurationName -ConfigurationFolderPath "Configurations-OnPrem" -Arguments $InstallArgs -Credential $Credential -UseWinRMSSL $UseWinRMSSL -DebugMode $DebugMode
+ #License Deployment
if($JobFlag[$JobFlag.Count - 1] -eq $True -and ($Mode -ieq "InstallLicense" -or $Mode -ieq "InstallLicenseConfigure")){
$JobFlag = $False
@@ -655,11 +668,9 @@ function Invoke-ArcGISConfiguration
$Role = @()
if($Node.Role -icontains "Server"){
$ServerRole = $null
- $ServerLicenseFilePath = $ConfigurationParamsHashtable.ConfigData.Server.LicenseFilePath
- $ServerLicensePassword = $null
-
- if($ConfigurationParamsHashtable.ConfigData.ServerRole)
- {
+ $NodeToAdd.Role += "Server"
+
+ if($ConfigurationParamsHashtable.ConfigData.ServerRole){
$ServerRole = $ConfigurationParamsHashtable.ConfigData.ServerRole
if($ServerRole -ieq "RasterAnalytics" -or $ServerRole -ieq "ImageHosting"){
$ServerRole = "ImageServer"
@@ -667,49 +678,99 @@ function Invoke-ArcGISConfiguration
}else{
$ServerRole = "GeneralPurposeServer"
}
-
- if($ConfigurationParamsHashtable.ConfigData.Server.LicensePasswordFilePath){
- $ServerLicensePassword = (Get-Content $ConfigurationParamsHashtable.ConfigData.Server.LicensePasswordFilePath | ConvertTo-SecureString )
- }elseif($ConfigurationParamsHashtable.ConfigData.Server.LicensePassword){
- $ServerLicensePassword = (ConvertTo-SecureString $ConfigurationParamsHashtable.ConfigData.Server.LicensePassword -AsPlainText -Force)
+ $NodeToAdd["ServerRole"] = $ServerRole
+
+ #Will ignore additional roles if primary role of server is anything else than GeneralPurposeServer
+ if($ServerRole -ieq "GeneralPurposeServer" -and $ConfigurationParamsHashtable.ConfigData.AdditionalServerRoles){
+ $AdditionalServerRoles = @()
+ foreach($AdditionalRole in $ConfigurationParamsHashtable.ConfigData.AdditionalServerRoles){
+ if($AdditionalRole -ieq "RasterAnalytics" -or $AdditionalRole -ieq "ImageHosting"){
+ $AdditionalServerRoles += "ImageServer"
+ }else{
+ $AdditionalServerRoles += $AdditionalRole
+ }
+ }
+ $NodeToAdd["AdditionalServerRoles"] = $AdditionalServerRoles
}
- if($ServerRole -ieq "GeoEvent"){
- $ServerLicenseFilePath = $ConfigurationParamsHashtable.ConfigData.GeoEventServer.LicenseFilePath
+ if($ServerRole -ine "GeoEvent" -and $ServerRole -ine "WorkflowManagerServer"){
+ $ServerLicenseFilePath = $ConfigurationParamsHashtable.ConfigData.Server.LicenseFilePath
$ServerLicensePassword = $null
+ if($ConfigurationParamsHashtable.ConfigData.Server.LicensePasswordFilePath){
+ $ServerLicensePassword = (Get-Content $ConfigurationParamsHashtable.ConfigData.Server.LicensePasswordFilePath | ConvertTo-SecureString )
+ }elseif($ConfigurationParamsHashtable.ConfigData.Server.LicensePassword){
+ $ServerLicensePassword = (ConvertTo-SecureString $ConfigurationParamsHashtable.ConfigData.Server.LicensePassword -AsPlainText -Force)
+ }
+
+ if($Node.ServerLicenseFilePath)
+ {
+ $ServerLicenseFilePath = $Node.ServerLicenseFilePath
+ $ServerLicensePassword = $null
+ if($Node.ServerLicensePasswordFilePath){
+ $ServerLicensePassword = (Get-Content $Node.ServerLicensePasswordFilePath | ConvertTo-SecureString )
+ }elseif($Node.ServerLicensePassword){
+ $ServerLicensePassword = (ConvertTo-SecureString $Node.ServerLicensePassword -AsPlainText -Force)
+ }
+ }
+
+ $NodeToAdd["ServerLicenseFilePath"] = $ServerLicenseFilePath
+ if($null -ne $ServerLicensePassword){
+ $NodeToAdd["ServerLicensePassword"] = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ("PlaceHolder", $ServerLicensePassword)
+ }
+ }
+
+ if(($ServerRole -ieq "GeoEvent" -or ($ServerRole -ieq "GeneralPurposeServer" -and $ConfigurationParamsHashtable.ConfigData.AdditionalServerRoles -icontains "GeoEvent")) -and $ConfigurationParamsHashtable.ConfigData.GeoEventServer){
+ $GeoeventServerLicenseFilePath = $ConfigurationParamsHashtable.ConfigData.GeoEventServer.LicenseFilePath
+ $GeoeventServerLicensePassword = $null
if($ConfigurationParamsHashtable.ConfigData.GeoEventServer.LicensePasswordFilePath){
- $ServerLicensePassword = (Get-Content $ConfigurationParamsHashtable.ConfigData.GeoEventServer.LicensePasswordFilePath | ConvertTo-SecureString )
+ $GeoeventServerLicensePassword = (Get-Content $ConfigurationParamsHashtable.ConfigData.GeoEventServer.LicensePasswordFilePath | ConvertTo-SecureString )
}elseif($ConfigurationParamsHashtable.ConfigData.GeoEventServer.LicensePassword){
- $ServerLicensePassword = (ConvertTo-SecureString $ConfigurationParamsHashtable.ConfigData.GeoEventServer.LicensePassword -AsPlainText -Force)
+ $GeoeventServerLicensePassword = (ConvertTo-SecureString $ConfigurationParamsHashtable.ConfigData.GeoEventServer.LicensePassword -AsPlainText -Force)
+ }
+
+ # Per Node - Geoevent
+ if($Node.GeoeventServerLicenseFilePath)
+ {
+ $GeoeventServerLicenseFilePath = $Node.GeoeventServerLicenseFilePath
+ $GeoeventServerLicensePassword = $null
+ if($Node.GeoeventServerLicensePasswordFilePath){
+ $GeoeventServerLicensePassword = (Get-Content $Node.GeoeventServerLicensePasswordFilePath | ConvertTo-SecureString )
+ }elseif($Node.ServerLicensePassword){
+ $GeoeventServerLicensePassword = (ConvertTo-SecureString $Node.GeoeventServerLicensePassword -AsPlainText -Force)
+ }
+ }
+
+ $NodeToAdd["GeoeventServerLicenseFilePath"] = $GeoeventServerLicenseFilePath
+ if($null -ne $GeoeventServerLicensePassword){
+ $NodeToAdd["GeoeventServerLicensePassword"] = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ("PlaceHolder", $GeoeventServerLicensePassword)
}
}
- if($ServerRole -ieq "WorkflowManagerServer"){
- $ServerLicenseFilePath = $ConfigurationParamsHashtable.ConfigData.WorkflowManagerServer.LicenseFilePath
- $ServerLicensePassword = $null
+ if(($ServerRole -ieq "WorkflowManagerServer" -or ($ServerRole -ieq "GeneralPurposeServer" -and $ConfigurationParamsHashtable.ConfigData.AdditionalServerRoles -icontains "WorkflowManagerServer")) -and $ConfigurationParamsHashtable.ConfigData.WorkflowManagerServer){
+ $WorkflowManagerServerLicenseFilePath = $ConfigurationParamsHashtable.ConfigData.WorkflowManagerServer.LicenseFilePath
+ $WorkflowManagerServerLicensePassword = $null
if($ConfigurationParamsHashtable.ConfigData.WorkflowManagerServer.LicensePasswordFilePath){
- $ServerLicensePassword = (Get-Content $ConfigurationParamsHashtable.ConfigData.WorkflowManagerServer.LicensePasswordFilePath | ConvertTo-SecureString )
+ $WorkflowManagerServerLicensePassword = (Get-Content $ConfigurationParamsHashtable.ConfigData.WorkflowManagerServer.LicensePasswordFilePath | ConvertTo-SecureString )
}elseif($ConfigurationParamsHashtable.ConfigData.WorkflowManagerServer.LicensePassword){
- $ServerLicensePassword = (ConvertTo-SecureString $ConfigurationParamsHashtable.ConfigData.WorkflowManagerServer.LicensePassword -AsPlainText -Force)
+ $WorkflowManagerServerLicensePassword = (ConvertTo-SecureString $ConfigurationParamsHashtable.ConfigData.WorkflowManagerServer.LicensePassword -AsPlainText -Force)
}
- }
-
- if($Node.ServerLicenseFilePath -and ($Node.ServerLicensePassword -or $Node.ServerLicensePasswordFilePath))
- {
- $ServerLicenseFilePath = $Node.ServerLicenseFilePath
- $ServerLicensePassword = $null
- if($Node.ServerLicensePasswordFilePath){
- $ServerLicensePassword = (Get-Content $Node.ServerLicensePasswordFilePath | ConvertTo-SecureString )
- }elseif($Node.ServerLicensePassword){
- $ServerLicensePassword = (ConvertTo-SecureString $Node.ServerLicensePassword -AsPlainText -Force)
+
+ # Per Node - WorkflowManager
+ if($Node.WorkflowManagerServerLicenseFilePath)
+ {
+ $WorkflowManagerServerLicenseFilePath = $Node.WorkflowManagerServerLicenseFilePath
+ $WorkflowManagerServerLicensePassword = $null
+ if($Node.WorkflowManagerServerLicensePasswordFilePath){
+ $WorkflowManagerServerLicensePassword = (Get-Content $Node.WorkflowManagerServerLicensePasswordFilePath | ConvertTo-SecureString )
+ }elseif($Node.ServerLicensePassword){
+ $WorkflowManagerServerLicensePassword = (ConvertTo-SecureString $Node.WorkflowManagerServerLicensePassword -AsPlainText -Force)
+ }
}
- }
- $NodeToAdd.Role += "Server"
- $NodeToAdd["ServerRole"] = $ServerRole
- $NodeToAdd["ServerLicenseFilePath"] = $ServerLicenseFilePath
- if($null -ne $ServerLicensePassword){
- $NodeToAdd["ServerLicensePassword"] = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ("PlaceHolder", $ServerLicensePassword)
+ $NodeToAdd["WorkflowManagerServerLicenseFilePath"] = $WorkflowManagerServerLicenseFilePath
+ if($null -ne $WorkflowManagerServerLicensePassword){
+ $NodeToAdd["WorkflowManagerServerLicensePassword"] = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ("PlaceHolder", $WorkflowManagerServerLicensePassword)
+ }
}
}
if($Node.Role -icontains "Portal"){
@@ -769,6 +830,7 @@ function Invoke-ArcGISConfiguration
$JobFlag = $True
}
+ #Configure Deployment
$SkipConfigureStep = $False
if(($DesktopCheck -or $ProCheck -or $LicenseManagerCheck) -and -not($ServerCheck -or $PortalCheck)){
$SkipConfigureStep = $True
@@ -782,10 +844,14 @@ function Invoke-ArcGISConfiguration
if($MappedDriveOverrideFlag) {
$ValidatePortalFileShare = $True
} else {
- if($ConfigurationParamsHashtable.ConfigData.Portal.ContentDirectoryLocation.StartsWith('\')) {
+ if($ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount){
$ValidatePortalFileShare = $True
- } else {
- throw "Config Directory Location path is not a fileshare path"
+ }else{
+ if($ConfigurationParamsHashtable.ConfigData.Portal.ContentDirectoryLocation.StartsWith('\')) {
+ $ValidatePortalFileShare = $True
+ } else {
+ throw "Config Directory Location path is not a fileshare path"
+ }
}
}
} else {
@@ -801,17 +867,36 @@ function Invoke-ArcGISConfiguration
if($MappedDriveOverrideFlag){
$ValidateServerFileShare = $True
}else{
- if($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreLocation.StartsWith('\') -and $ConfigurationParamsHashtable.ConfigData.Server.ServerDirectoriesRootLocation.StartsWith('\')){
- if($ConfigurationParamsHashtable.ConfigData.Server.ServerDirectories){
- foreach($dir in $ConfigurationParamsHashtable.ConfigData.Server.ServerDirectories){
- if(-not($dir.physicalPath.StartsWith('\'))){
- throw "One or more of Server Directories Location is not a fileshare path"
+ if($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount){
+ $ValidateServerFileShare = $True
+ }else{
+ if($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreLocation.StartsWith('\')){
+ $ValidateServerFileShare = $True
+ }else{
+ throw "Config Store Location is not a fileshare path"
+ }
+ }
+
+ $ValidateServerFileShare = $False
+ if($ConfigurationParamsHashtable.ConfigData.Server.ServerDirectoriesCloudStorageAccount){
+ if($ConfigurationParamsHashtable.ConfigData.Server.ServerDirectoriesCloudStorageAccount.CloudStorageType -ieq "AzureFiles"){
+ $ValidateServerFileShare = $True
+ }else{
+ throw "Unsupported cloud storage account for server directories"
+ }
+ }else{
+ if($ConfigurationParamsHashtable.ConfigData.Server.ServerDirectoriesRootLocation.StartsWith('\')){
+ if($ConfigurationParamsHashtable.ConfigData.Server.ServerDirectories){
+ foreach($dir in $ConfigurationParamsHashtable.ConfigData.Server.ServerDirectories){
+ if(-not($dir.physicalPath.StartsWith('\'))){
+ throw "One or more of Server Directories Location is not a fileshare path"
+ }
}
}
+ $ValidateServerFileShare = $True
+ } else {
+ throw "Server Directories Root Location is not a fileshare path"
}
- $ValidateServerFileShare = $True
- } else {
- throw "One or both of Config Store Location and Server Directories Root Location is not a fileshare path"
}
}
} else {
@@ -877,19 +962,30 @@ function Invoke-ArcGISConfiguration
$NodeName = $Node.NodeName
if($Node.Role -icontains 'FileShare'){
- if($null -eq $FileShareMachine){ $FileShareMachine = $Node }
- $FileShareCD.AllNodes += (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'FileShare')
+ $FileShareNodeToAdd = (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'FileShare')
+ $FileShareCD.AllNodes += $FileShareNodeToAdd
+ if($null -eq $FileShareMachine){ $FileShareMachine = $FileShareNodeToAdd }
}
if($Node.Role -icontains 'RasterDataStoreItem'){
$RasterDataStoreItemCD.AllNodes += (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'RasterDataStoreItem')
}
if($Node.Role -icontains 'Server') {
- if($null -eq $PrimaryServerMachine){ $PrimaryServerMachine = $Node }
- $ServerCD.AllNodes += (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'Server')
+ $GlobalSslRootOrIntermediate = $null
+ if($ConfigurationParamsHashtable.ConfigData.SslRootOrIntermediate){
+ $GlobalSslRootOrIntermediate = $ConfigurationParamsHashtable.ConfigData.SslRootOrIntermediate
+ }
+ $ServerNodeToAdd = (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'Server' -SslRootOrIntermediate $GlobalSslRootOrIntermediate)
+ $ServerCD.AllNodes += $ServerNodeToAdd
+ if($null -eq $PrimaryServerMachine){ $PrimaryServerMachine = $ServerNodeToAdd }
}
if($Node.Role -icontains 'Portal') {
- if($null -eq $PrimaryPortalMachine){ $PrimaryPortalMachine = $Node }
- $PortalCD.AllNodes += (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'Portal')
+ $GlobalSslRootOrIntermediate = $null
+ if($ConfigurationParamsHashtable.ConfigData.SslRootOrIntermediate){
+ $GlobalSslRootOrIntermediate = $ConfigurationParamsHashtable.ConfigData.SslRootOrIntermediate
+ }
+ $PortalNodeToAdd = (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'Portal' -SslRootOrIntermediate $GlobalSslRootOrIntermediate)
+ $PortalCD.AllNodes += $PortalNodeToAdd
+ if($null -eq $PrimaryPortalMachine){ $PrimaryPortalMachine = $PortalNodeToAdd }
}
if(($Node.Role -icontains 'ServerWebAdaptor') -or ($Node.Role -icontains 'PortalWebAdaptor')) {
$ServerContext = if($ConfigurationParamsHashtable.ConfigData.ServerContext){ $ConfigurationParamsHashtable.ConfigData.ServerContext }else{ $null }
@@ -924,22 +1020,19 @@ function Invoke-ArcGISConfiguration
$DsTypes = $Node.DataStoreTypes
if($DsTypes -icontains "Relational"){
- if($null -eq $PrimaryDataStore){
- $PrimaryDataStore = $Node
- }
- $RelationalDataStoreCD.AllNodes += (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'DataStore' -DataStoreType "Relational")
+ $RelationalDataStoreNodeToAdd = (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'DataStore' -DataStoreType "Relational")
+ $RelationalDataStoreCD.AllNodes += $RelationalDataStoreNodeToAdd
+ if($null -eq $PrimaryDataStore){ $PrimaryDataStore = $RelationalDataStoreNodeToAdd }
}
if($DsTypes -icontains "SpatioTemporal"){
- if($null -eq $PrimaryBigDataStore){
- $PrimaryBigDataStore = $Node
- }
- $BigDataStoreCD.AllNodes += (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'DataStore' -DataStoreType "SpatioTemporal")
+ $PrimaryBigDataStoreNodeToAdd = (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'DataStore' -DataStoreType "SpatioTemporal")
+ $BigDataStoreCD.AllNodes += $PrimaryBigDataStoreNodeToAdd
+ if($null -eq $PrimaryBigDataStore){ $PrimaryBigDataStore = $PrimaryBigDataStoreNodeToAdd }
}
if($DsTypes -icontains "TileCache"){
- if($null -eq $PrimaryTileCache){
- $PrimaryTileCache = $Node
- }
- $TileCacheDataStoreCD.AllNodes += (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'DataStore' -DataStoreType "TileCache")
+ $PrimaryTileCacheNodeToAdd = (Invoke-CreateNodeToAdd -Node $Node -TargetComponent 'DataStore' -DataStoreType "TileCache")
+ $TileCacheDataStoreCD.AllNodes += $PrimaryTileCacheNodeToAdd
+ if($null -eq $PrimaryTileCache){ $PrimaryTileCache = $PrimaryTileCacheNodeToAdd }
}
if($Node.SslCertificates -and (($Node.SslCertificates | Where-Object { $_.Target -icontains 'DataStore' } | Measure-Object).Count -gt 0))
@@ -952,16 +1045,28 @@ function Invoke-ArcGISConfiguration
$JobFlag = $False
$FilePathsArray = @()
if($ConfigurationParamsHashtable.ConfigData.Server){
- if($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreLocation.StartsWith('\') -and $ConfigurationParamsHashtable.ConfigData.Server.ServerDirectoriesRootLocation.StartsWith('\')){
- $FilePathsArray += $ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreLocation
- $FilePathsArray += $ConfigurationParamsHashtable.ConfigData.Server.ServerDirectoriesRootLocation
- }else{
- throw "One or both of the Config Store Location and Server Directories Root Location is not a file share location"
+ if(-not($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount)){
+ if($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreLocation.StartsWith('\')){
+ $FilePathsArray += $ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreLocation
+ }else{
+ throw "Config Store Location is not a fileshare path"
+ }
+ }
+
+ if(-not($ConfigurationParamsHashtable.ConfigData.Server.ServerDirectoriesCloudStorageAccount)){
+ if($ConfigurationParamsHashtable.ConfigData.Server.ServerDirectoriesRootLocation.StartsWith('\')){
+ $FilePathsArray += $ConfigurationParamsHashtable.ConfigData.Server.ServerDirectoriesRootLocation
+ } else {
+ throw "Server Directories Root Location is not a fileshare path"
+ }
}
}
+
if($ConfigurationParamsHashtable.ConfigData.Portal){
- if($ConfigurationParamsHashtable.ConfigData.Portal.ContentDirectoryLocation.StartsWith('\')){
- $FilePathsArray += $ConfigurationParamsHashtable.ConfigData.Portal.ContentDirectoryLocation
+ if(-not($ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount)){
+ if($ConfigurationParamsHashtable.ConfigData.Portal.ContentDirectoryLocation.StartsWith('\')){
+ $FilePathsArray += $ConfigurationParamsHashtable.ConfigData.Portal.ContentDirectoryLocation
+ }
}
}
@@ -993,7 +1098,6 @@ function Invoke-ArcGISConfiguration
ServerDirectoriesRootLocation = $ConfigurationParamsHashtable.ConfigData.Server.ServerDirectoriesRootLocation
ServerDirectories = if($ConfigurationParamsHashtable.ConfigData.Server.ServerDirectories){$ConfigurationParamsHashtable.ConfigData.Server.ServerDirectories}else{$null}
ServerLogsLocation = if($ConfigurationParamsHashtable.ConfigData.Server.ServerLogsLocation){$ConfigurationParamsHashtable.ConfigData.Server.ServerLogsLocation}else{$null}
- SslRootOrIntermediate = ($ConfigurationParamsHashtable.ConfigData.SslRootOrIntermediate | ConvertTo-Json)
UsesSSL = $UseSSL
DebugMode = $DebugMode
}
@@ -1008,6 +1112,11 @@ function Invoke-ArcGISConfiguration
}
}else{
$ServerArgs["ServerRole"] = $ConfigurationParamsHashtable.ConfigData.ServerRole
+ if($ConfigurationParamsHashtable.ConfigData.ServerRole -ieq "GeneralPurposeServer" -and $ConfigurationParamsHashtable.ConfigData.AdditionalServerRoles){
+ $ServerArgs["AdditionalServerRoles"] = $ConfigurationParamsHashtable.ConfigData.AdditionalServerRoles
+ }
+
+ $ServerArgs["DisableServiceDirectory"] = if($ConfigurationParamsHashtable.ConfigData.Server.DisableServiceDirectory){ $true }else{ $false }
$ServerArgs["OpenFirewallPorts"] = ($PortalCheck -or $DataStoreCheck -or $IsServerWAOnSeparateMachine)
$ServerArgs["RegisteredDirectories"] = ($ConfigurationParamsHashtable.ConfigData.Server.RegisteredDirectories | ConvertTo-Json)
$ServerArgs["LocalRepositoryPath"] = if($ConfigurationParamsHashtable.ConfigData.Server.LocalRepositoryPath){$ConfigurationParamsHashtable.ConfigData.Server.LocalRepositoryPath}else{$null}
@@ -1015,17 +1124,20 @@ function Invoke-ArcGISConfiguration
if($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount){
$ServerConfigStoreCloudStorageCredentials = $null
- if($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount){
+ if($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.Username -and ($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.Password -or $ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.PasswordFilePath)){
$ServerConfigStoreCloudStorageAccountPassword = if( $ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.PasswordFilePath ){ Get-Content $ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.PasswordFilePath | ConvertTo-SecureString }else{ ConvertTo-SecureString $ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.Password -AsPlainText -Force }
$ServerConfigStoreCloudStorageCredentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ( $ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.UserName, $ServerConfigStoreCloudStorageAccountPassword )
}else{
- throw "No credentials provided for Cloud Storage for $($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.CloudStorageType)"
+ if($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.CloudStorageType -ne "AWSS3DynamoDB"){
+ throw "No credentials provided for Cloud Storage for $($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.CloudStorageType)"
+ }
}
$ServerArgs["ConfigStoreCloudStorageType"] = $ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.CloudStorageType
$ServerArgs["ConfigStoreAzureFileShareName"] = if($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.CloudStorageType -ieq "AzureFiles"){ $ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.AzureFileShareName }else{ $null }
$ServerArgs["ConfigStoreCloudNamespace"] = $ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.CloudNamespace
$ServerArgs["ConfigStoreCloudStorageCredentials"] = $ServerConfigStoreCloudStorageCredentials
+ $ServerArgs["ConfigStoreAWSRegion"] = if($ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.CloudStorageType -ieq "AWSS3DynamoDB"){ $ConfigurationParamsHashtable.ConfigData.Server.ConfigStoreCloudStorageAccount.AWSRegion }else{ $null }
}
if($ConfigurationParamsHashtable.ConfigData.Server.ServerDirectoriesCloudStorageAccount){
@@ -1117,14 +1229,13 @@ function Invoke-ArcGISConfiguration
$ConfigurationName = "ArcGISMissionServerSettings"
}
- if($ConfigurationParamsHashtable.ConfigData.ServerRole -ne "NotebookServer" -and $ConfigurationParamsHashtable.ConfigData.ServerRole -ne "MissionServer"){
+ if($ConfigurationParamsHashtable.ConfigData.ServerRole -ine "NotebookServer" -and $ConfigurationParamsHashtable.ConfigData.ServerRole -ine "MissionServer"){
$ConfigurationName = "ArcGISServerSettings"
- $ServerSettingsArgs["IsWorkflowManagerDeployment"] = if($ConfigurationParamsHashtable.ConfigData.ServerRole -eq "WorkflowManagerServer"){ $True }else{ $False }
$ServerSettingsArgs["InternalLoadBalancer"] = if($ConfigurationParamsHashtable.ConfigData.Server.InternalLoadBalancer){ $ConfigurationParamsHashtable.ConfigData.Server.InternalLoadBalancer }else{ $null }
}
$JobFlag = Invoke-DSCJob -ConfigurationName $ConfigurationName -ConfigurationFolderPath "Configurations-OnPrem" -Arguments $ServerSettingsArgs -Credential $Credential -UseWinRMSSL $UseWinRMSSL -DebugMode $DebugMode
- }
+ }
$VersionArray = $Version.Split(".")
$MajorVersion = $VersionArray[1]
@@ -1151,22 +1262,25 @@ function Invoke-ArcGISConfiguration
DefaultRoleForUser = if($ConfigurationParamsHashtable.ConfigData.Portal.DefaultRoleForUser){ $ConfigurationParamsHashtable.ConfigData.Portal.DefaultRoleForUser }else{ $null }
DefaultUserLicenseTypeIdForUser = if($ConfigurationParamsHashtable.ConfigData.Portal.DefaultUserLicenseTypeIdForUser -and ($MajorVersion -ge 7)){ $ConfigurationParamsHashtable.ConfigData.Portal.DefaultUserLicenseTypeIdForUser }else{ $null }
DisableServiceDirectory = if($ConfigurationParamsHashtable.ConfigData.Portal.DisableServiceDirectory){ $true }else{ $false }
- SslRootOrIntermediate = ($ConfigurationParamsHashtable.ConfigData.SslRootOrIntermediate | ConvertTo-Json)
UsesSSL = $UseSSL
DebugMode = $DebugMode
}
if($ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount){
$PortalCloudStorageCredentials = $null
- if($ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount){
+ if($ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.Username -and ($ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.Password -or $ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.PasswordFilePath)){
$PortalCloudStorageAccountPassword = if( $ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.PasswordFilePath ){ Get-Content $ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.PasswordFilePath | ConvertTo-SecureString }else{ ConvertTo-SecureString $ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.Password -AsPlainText -Force }
$PortalCloudStorageCredentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ( $ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.UserName, $PortalCloudStorageAccountPassword )
}else{
- throw "No credentials provided for Cloud Storage for $($ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType)"
+ if($ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType -ne "AWSS3DynamoDB"){
+ throw "No credentials provided for Cloud Storage for $($ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType)"
+ }
}
+
$PortalArgs["CloudStorageType"] = $ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType
$PortalArgs["AzureFileShareName"] = if($ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType -ieq "AzureFiles"){ $ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.AzureFileShareName }else{ $null }
$PortalArgs["CloudNamespace"] = $ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.CloudNamespace
$PortalArgs["CloudStorageCredentials"] = $PortalCloudStorageCredentials
+ $PortalArgs["AWSRegion"] = if($ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType -ieq "AWSS3DynamoDB"){ $ConfigurationParamsHashtable.ConfigData.Portal.PortalContentCloudStorageAccount.AWSRegion }else{ $null }
}
if($MajorVersion -gt 8 -or ($MajorVersion -eq 8 -and $MinorVersion -eq 1)){
@@ -1495,9 +1609,9 @@ function Invoke-ArcGISConfiguration
$RemoteSiteAdministrator = $null
if($PortalCheck){
$PortalServerFederation = $True
- $PortalHostName = if($null -ne $PortalExternalDNSHostName){ $PortalExternalDNSHostName }else{ if($PrimaryPortalMachine.SSLCertificate){ $PrimaryPortalMachine.SSLCertificate.CName }else{Get-FQDN $PrimaryPortalMachine.NodeName} }
- $PortalPort = if($null -ne $PortalExternalDNSHostName){ 443 }else{ 7443 }
- $PortalContext = if($null -ne $PortalExternalDNSHostName){ $ConfigurationParamsHashtable.ConfigData.PortalContext }else{ 'arcgis' }
+ $PortalHostName = if($null -ne $ConfigurationParamsHashtable.ConfigData.Portal.InternalLoadBalancer){ $ConfigurationParamsHashtable.ConfigData.Portal.InternalLoadBalancer }else{ if($PrimaryPortalMachine.SSLCertificate){ $PrimaryPortalMachine.SSLCertificate.CName }else{ Get-FQDN $PrimaryPortalMachine.NodeName } }
+ $PortalPort = 7443
+ $PortalContext = 'arcgis'
}elseif($ConfigurationParamsHashtable.ConfigData.Federation){
$RemoteFederation = $True
$PortalHostName = $ConfigurationParamsHashtable.ConfigData.Federation.PortalHostName
@@ -1510,11 +1624,11 @@ function Invoke-ArcGISConfiguration
if($RemoteFederation -or $PortalServerFederation){
$ServerRole = $ConfigurationParamsHashtable.ConfigData.ServerRole
- $ServerServiceURL = if($null -ne $ServerExternalDNSHostName){ $ServerExternalDNSHostName }else{ if($PrimaryServerMachine.SSLCertificate){ $PrimaryServerMachine.SSLCertificate.CName }else{Get-FQDN $PrimaryServerMachine.NodeName} }
+ $ServerServiceURL = if($null -ne $ServerExternalDNSHostName){ $ServerExternalDNSHostName }else{ if($PrimaryServerMachine.SSLCertificate){ $PrimaryServerMachine.SSLCertificate.CName }else{ Get-FQDN $PrimaryServerMachine.NodeName } }
$ServerServiceURLPort = if($null -ne $ServerExternalDNSHostName){ 443 }else{if($ServerRole -ieq 'NotebookServer'){11443}elseif($ServerRole -ieq 'MissionServer'){ 20443 }else{6443}}
$ServerServiceURLContext = if($null -ne $ConfigurationParamsHashtable.ConfigData.ServerContext){ $ConfigurationParamsHashtable.ConfigData.ServerContext }else{ 'arcgis' }
- $ServerSiteAdminURL = if($PrimaryServerMachine.SSLCertificate){ $PrimaryServerMachine.SSLCertificate.CName }else{Get-FQDN $PrimaryServerMachine.NodeName}
+ $ServerSiteAdminURL = if($PrimaryServerMachine.SSLCertificate){ $PrimaryServerMachine.SSLCertificate.CName }else{ Get-FQDN $PrimaryServerMachine.NodeName }
$ServerSiteAdminURLPort = if($ServerRole -ieq 'NotebookServer'){11443}elseif($ServerRole -ieq 'MissionServer'){ 20443 }else{ 6443 }
$ServerSiteAdminURLContext = 'arcgis'
@@ -1538,7 +1652,23 @@ function Invoke-ArcGISConfiguration
}
}
}
+
+ $ServerFunctions = @()
+ $ServerRole = $ConfigurationParamsHashtable.ConfigData.ServerRole
+ if($ServerRole -ieq "GeneralPurposeServer"){
+ if($ConfigurationParamsHashtable.ConfigData.AdditionalServerRoles){
+ foreach($AdditionalRole in $ConfigurationParamsHashtable.ConfigData.AdditionalServerRoles){
+ $ServerFunctions += if($AdditionalRole -ieq "WorkflowManagerServer"){"WorkflowManager"}else{$AdditionalRole}
+ }
+ }
+ }else{
+ if($ServerRole -ieq "WorkflowManagerServer"){
+ $ServerRole = "WorkflowManager"
+ }
+ $ServerFunctions += $ServerRole
+ }
+
$FederationArgs = @{
ConfigurationData = $ServerCD
PrimaryServerMachine = $PrimaryServerMachine.NodeName
@@ -1554,7 +1684,7 @@ function Invoke-ArcGISConfiguration
ServerPrimarySiteAdminCredential = $ServerPrimarySiteAdminCredential
RemoteSiteAdministrator = if($RemoteFederation){ $RemoteSiteAdministrator }else{ $PortalAdministratorCredential }
IsHostingServer = ($ServerCheck -and $PortalCheck -and $DataStoreCheck) #Check for relational ds only
- ServerRole = $ConfigurationParamsHashtable.ConfigData.ServerRole
+ ServerFunctions = [system.String]::Join(",", $ServerFunctions)
}
$JobFlag = Invoke-DSCJob -ConfigurationName "ArcGISFederation" -ConfigurationFolderPath "Configurations-OnPrem" -Arguments $FederationArgs -Credential $Credential -UseWinRMSSL $UseWinRMSSL -DebugMode $DebugMode
}
@@ -1562,7 +1692,7 @@ function Invoke-ArcGISConfiguration
if($JobFlag[$JobFlag.Count - 1] -eq $True){
if($PortalCheck){
- $PrimaryPortalCName = if($PrimaryPortalMachine.SSLCertificate){ $PrimaryPortalMachine.SSLCertificate.CName }else{ Get-FQDN $PrimaryPortalMachine.NodeName}
+ $PrimaryPortalCName = if($PrimaryPortalMachine.SSLCertificate){ $PrimaryPortalMachine.SSLCertificate.CName }else{ Get-FQDN $PrimaryPortalMachine.NodeName }
$PortalUrl = "$($PrimaryPortalCName):7443/arcgis"
$PortalAdminUrl = "$($PrimaryPortalCName):7443/arcgis"
@@ -1580,7 +1710,7 @@ function Invoke-ArcGISConfiguration
Write-Information "Portal URL - https://$PortalUrl/home"
}
if($ServerCheck){
- $PrimaryServerCName = if($PrimaryServerMachine.SSLCertificate){ $PrimaryServerMachine.SSLCertificate.CName }else{Get-FQDN $PrimaryServerMachine.NodeName}
+ $PrimaryServerCName = if($PrimaryServerMachine.SSLCertificate){ $PrimaryServerMachine.SSLCertificate.CName }else{ Get-FQDN $PrimaryServerMachine.NodeName }
$Port = if($ServerRole -ieq 'NotebookServer'){11443}elseif($ServerRole -ieq "MissionServer"){20443}else{6443}
$ServerAdminURL = "$($PrimaryServerCName):$($Port)/arcgis"
$ServerManagerURL = "$($PrimaryServerCName):$($Port)/arcgis"
@@ -1715,6 +1845,8 @@ function Invoke-ArcGISConfiguration
ConfigurationData = $InsightsUpgradeCD
Version = $HostingConfig.ConfigData.InsightsVersion
InstallerPath = $HostingConfig.ConfigData.Insights.Installer.Path
+ PatchesDir = $HostingConfig.ConfigData.Insights.Installer.PatchesDir
+ PatchInstallOrder = $HostingConfig.ConfigData.Insights.Installer.PatchInstallOrder
ServiceAccount = $ServiceAccountCredential
IsServiceAccountDomainAccount = $ServiceAccountIsDomainAccount
IsServiceAccountMSA = $ServiceAccountIsMSA
@@ -1845,6 +1977,8 @@ function Invoke-PortalUpgradeScript {
Version = $PortalConfig.ConfigData.Version
OldVersion = $PortalConfig.ConfigData.OldVersion
InstallerPath = $PortalConfig.ConfigData.Portal.Installer.Path
+ PatchesDir = $PortalConfig.ConfigData.Portal.Installer.PatchesDir
+ PatchInstallOrder = $PortalConfig.ConfigData.Portal.Installer.PatchInstallOrder
ServiceAccount = $PortalServiceAccountCredential
IsServiceAccountDomainAccount = $PortalServiceAccountIsDomainAccount
IsServiceAccountMSA = $PortalServiceAccountIsMSA
@@ -1911,6 +2045,8 @@ function Invoke-PortalUpgradeScript {
Version = $PortalConfig.ConfigData.Version
PrimaryPortalMachine = $PrimaryNodeToAdd.NodeName
InstallerPath = $PortalConfig.ConfigData.Portal.Installer.Path
+ PatchesDir = $PortalConfig.ConfigData.Portal.Installer.PatchesDir
+ PatchInstallOrder = $PortalConfig.ConfigData.Portal.Installer.PatchInstallOrder
Context = $PortalConfig.ConfigData.PortalContext
ServiceAccount = $PortalServiceAccountCredential
IsServiceAccountDomainAccount = $PortalServiceAccountIsDomainAccount
@@ -1951,16 +2087,19 @@ function Invoke-PortalUpgradeScript {
if($PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount){
$PortalCloudStorageCredentials = $null
- if($PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount){
+ if($PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.Username -and ($PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.Password -or $PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.PasswordFilePath)){
$PortalCloudStorageAccountPassword = if( $PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.PasswordFilePath ){ Get-Content $PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.PasswordFilePath | ConvertTo-SecureString }else{ ConvertTo-SecureString $PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.Password -AsPlainText -Force }
$PortalCloudStorageCredentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ( $PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.UserName, $PortalCloudStorageAccountPassword )
}else{
- throw "No credentials provided for Cloud Storage for $($PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType)"
+ if($PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType -ne "AWSS3DynamoDB"){
+ throw "No credentials provided for Cloud Storage for $($PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType)"
+ }
}
$PortalUpgradeStandbyArgs["CloudStorageType"] = $PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType
$PortalUpgradeStandbyArgs["AzureFileShareName"] = if($PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType -ieq "AzureFiles"){ $PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.AzureFileShareName }else{ $null }
$PortalUpgradeStandbyArgs["CloudNamespace"] = $PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.CloudNamespace
$PortalUpgradeStandbyArgs["CloudStorageCredentials"] = $PortalCloudStorageCredentials
+ $PortalUpgradeStandbyArgs["AWSRegion"] = if($PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.CloudStorageType -ieq "AWSS3DynamoDB"){ $PortalConfig.ConfigData.Portal.PortalContentCloudStorageAccount.AWSRegion }else{ $null }
}
$JobFlag = Invoke-DSCJob -ConfigurationName "PortalUpgradeStandbyJoinV1" -ConfigurationFolderPath "Configurations-OnPrem\Upgrades" -Arguments $PortalUpgradeStandbyArgs -Credential $Credential -UseWinRMSSL $UseWinRMSSL -DebugMode $DebugMode
@@ -1982,6 +2121,8 @@ function Invoke-PortalUpgradeScript {
Version = $PortalConfig.ConfigData.Version
OldVersion = $PortalConfig.ConfigData.OldVersion
InstallerPath = $PortalConfig.ConfigData.WebAdaptor.Installer.Path
+ PatchesDir = $PortalConfig.ConfigData.WebAdaptor.Installer.PatchesDir
+ PatchInstallOrder = $PortalConfig.ConfigData.WebAdaptor.Installer.PatchInstallOrder
ComponentHostName = $PrimaryNodeToAdd.NodeName
SiteAdministratorCredential = $PortalSiteAdministratorCredential
WebSiteId = if($PortalConfig.ConfigData.WebAdaptor.WebSiteId){ $PortalConfig.ConfigData.WebAdaptor.WebSiteId }else{ 1 }
@@ -2040,10 +2181,8 @@ function Invoke-ServerUpgradeScript {
Write-Information -InformationAction Continue "Server Upgrade"
$cfPrimaryServerMachine = ""
- $ServerLicenseFilePath = $cf.ConfigData.Server.LicenseFilePath
- $ServerLicensePassword = $null
$ServerRole = $null
- if($cf.ConfigData.ServerRole){
+ if($cf.ConfigData.ServerRole){
$ServerRole = $cf.ConfigData.ServerRole
if($ServerRole -ieq "RasterAnalytics" -or $ServerRole -ieq "ImageHosting"){
$ServerRole = "ImageServer"
@@ -2052,29 +2191,14 @@ function Invoke-ServerUpgradeScript {
$ServerRole = "GeneralPurposeServer"
}
- if($cf.ConfigData.Server.LicensePasswordFilePath){
- $ServerLicensePassword = (Get-Content $cf.ConfigData.Server.LicensePasswordFilePath | ConvertTo-SecureString )
- }elseif($cf.ConfigData.Server.LicensePassword){
- $ServerLicensePassword = (ConvertTo-SecureString $cf.ConfigData.Server.LicensePassword -AsPlainText -Force)
- }
-
- if($ServerRole -ieq "GeoEvent"){
- $ServerLicenseFilePath = $cf.ConfigData.GeoEventServer.LicenseFilePath
- $ServerLicensePassword = $null
- if($cf.ConfigData.GeoEventServer.LicensePasswordFilePath){
- $ServerLicensePassword = (Get-Content $cf.ConfigData.GeoEventServer.LicensePasswordFilePath | ConvertTo-SecureString )
- }elseif($cf.ConfigData.GeoEventServer.LicensePassword){
- $ServerLicensePassword = (ConvertTo-SecureString $cf.ConfigData.GeoEventServer.LicensePassword -AsPlainText -Force)
- }
- }
-
- if($ServerRole -ieq "WorkflowManagerServer"){
- $ServerLicenseFilePath = $cf.ConfigData.WorkflowManagerServer.LicenseFilePath
- $ServerLicensePassword = $null
- if($cf.ConfigData.WorkflowManagerServer.LicensePasswordFilePath){
- $ServerLicensePassword = (Get-Content $cf.ConfigData.WorkflowManagerServer.LicensePasswordFilePath | ConvertTo-SecureString )
- }elseif($cf.ConfigData.WorkflowManagerServer.LicensePassword){
- $ServerLicensePassword = (ConvertTo-SecureString $cf.ConfigData.WorkflowManagerServer.LicensePassword -AsPlainText -Force)
+ $AdditionalServerRoles = @()
+ if($ServerRole -ieq "GeneralPurposeServer" -and $cf.ConfigData.AdditionalServerRoles){
+ foreach($AdditionalRole in $cf.ConfigData.AdditionalServerRoles){
+ if($AdditionalRole -ieq "RasterAnalytics" -or $AdditionalRole -ieq "ImageHosting"){
+ $AdditionalServerRoles += "ImageServer"
+ }else{
+ $AdditionalServerRoles += $AdditionalRole
+ }
}
}
@@ -2096,27 +2220,90 @@ function Invoke-ServerUpgradeScript {
}else{
$NodeToAdd["PSDscAllowPlainTextPassword"] = $true
}
-
- $NodeToAdd["ServerLicenseFilePath"] = if($Node.ServerLicenseFilePath){ $Node.ServerLicenseFilePath }else{ $ServerLicenseFilePath }
- $NodeServerLicensePassword = $null
- if($Node.ServerLicenseFilePath){
- if($Node.ServerLicensePasswordFilePath){
- $NodeServerLicensePassword = (Get-Content $Node.ServerLicensePasswordFilePath | ConvertTo-SecureString )
- }elseif($Node.ServerLicensePassword){
- $NodeServerLicensePassword = (ConvertTo-SecureString $Node.ServerLicensePassword -AsPlainText -Force)
+
+ $NodeToAdd["ServerRole"] = $ServerRole
+ if($ServerRole -ine "GeneralPurposeServer" -and ($AdditionalServerRoles.Count -gt 0)){
+ $NodeToAdd["AdditionalServerRoles"] = $AdditionalServerRoles
+ }
+
+ if($ServerRole -ine "GeoEvent" -and $ServerRole -ine "WorkflowManagerServer"){
+ $ServerLicenseFilePath = $cf.ConfigData.Server.LicenseFilePath
+ $ServerLicensePassword = $null
+ if($cf.ConfigData.Server.LicensePasswordFilePath){
+ $ServerLicensePassword = (Get-Content $cf.ConfigData.Server.LicensePasswordFilePath | ConvertTo-SecureString )
+ }elseif($cf.ConfigData.Server.LicensePassword){
+ $ServerLicensePassword = (ConvertTo-SecureString $cf.ConfigData.Server.LicensePassword -AsPlainText -Force)
}
- }else{
- if($null -ne $ServerLicensePassword){
- $NodeServerLicensePassword = $ServerLicensePassword
+
+ if($Node.ServerLicenseFilePath){
+ $ServerLicenseFilePath = $Node.ServerLicenseFilePath
+ $ServerLicensePassword = $null
+ if($Node.ServerLicensePasswordFilePath){
+ $ServerLicensePassword = (Get-Content $Node.ServerLicensePasswordFilePath | ConvertTo-SecureString )
+ }elseif($Node.ServerLicensePassword){
+ $ServerLicensePassword = (ConvertTo-SecureString $Node.ServerLicensePassword -AsPlainText -Force)
+ }
+ }
+
+ $NodeToAdd["ServerLicenseFilePath"] = $ServerLicenseFilePath
+ if($null -ne $NodeServerLicensePassword){
+ $NodeToAdd["ServerLicensePassword"] = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ("PlaceHolder", $ServerLicensePassword)
}
}
+
+ if(($ServerRole -ieq "GeoEvent" -or ($ServerRole -ieq "GeneralPurposeServer" -and $AdditionalServerRoles -icontains "GeoEvent")) -and $cf.ConfigData.GeoEventServer){
+ $GeoeventServerLicenseFilePath = $cf.ConfigData.GeoEventServer.LicenseFilePath
+ $GeoeventServerLicensePassword = $null
+ if($cf.ConfigData.GeoEventServer.LicensePasswordFilePath){
+ $GeoeventServerLicensePassword = (Get-Content $cf.ConfigData.GeoEventServer.LicensePasswordFilePath | ConvertTo-SecureString )
+ }elseif($cf.ConfigData.GeoEventServer.LicensePassword){
+ $GeoeventServerLicensePassword = (ConvertTo-SecureString $cf.ConfigData.GeoEventServer.LicensePassword -AsPlainText -Force)
+ }
+ # Per Node - Geoevent
+ if($Node.GeoeventServerLicenseFilePath)
+ {
+ $GeoeventServerLicenseFilePath = $Node.GeoeventServerLicenseFilePath
+ $GeoeventServerLicensePassword = $null
+ if($Node.GeoeventServerLicensePasswordFilePath){
+ $GeoeventServerLicensePassword = (Get-Content $Node.GeoeventServerLicensePasswordFilePath | ConvertTo-SecureString )
+ }elseif($Node.ServerLicensePassword){
+ $GeoeventServerLicensePassword = (ConvertTo-SecureString $Node.GeoeventServerLicensePassword -AsPlainText -Force)
+ }
+ }
- if($null -ne $NodeServerLicensePassword){
- $NodeToAdd["ServerLicensePassword"] = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ("PlaceHolder", $NodeServerLicensePassword)
+ $NodeToAdd["GeoeventServerLicenseFilePath"] = $GeoeventServerLicenseFilePath
+ if($null -ne $GeoeventServerLicensePassword){
+ $NodeToAdd["GeoeventServerLicensePassword"] = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ("PlaceHolder", $GeoeventServerLicensePassword)
+ }
}
+
+ if(($ServerRole -ieq "WorkflowManagerServer" -or ($ServerRole -ieq "GeneralPurposeServer" -and $AdditionalServerRoles -icontains "WorkflowManagerServer")) -and $cf.ConfigData.WorkflowManagerServer){
+ $WorkflowManagerServerLicenseFilePath = $cf.ConfigData.WorkflowManagerServer.LicenseFilePath
+ $WorkflowManagerServerLicensePassword = $null
+ if($cf.ConfigData.WorkflowManagerServer.LicensePasswordFilePath){
+ $WorkflowManagerServerLicensePassword = (Get-Content $cf.ConfigData.WorkflowManagerServer.LicensePasswordFilePath | ConvertTo-SecureString )
+ }elseif($cf.ConfigData.WorkflowManagerServer.LicensePassword){
+ $WorkflowManagerServerLicensePassword = (ConvertTo-SecureString $cf.ConfigData.WorkflowManagerServer.LicensePassword -AsPlainText -Force)
+ }
- $NodeToAdd["ServerRole"] = $ServerRole
+ # Per Node - WorkflowManager
+ if($Node.WorkflowManagerServerLicenseFilePath)
+ {
+ $WorkflowManagerServerLicenseFilePath = $Node.WorkflowManagerServerLicenseFilePath
+ $WorkflowManagerServerLicensePassword = $null
+ if($Node.WorkflowManagerServerLicensePasswordFilePath){
+ $WorkflowManagerServerLicensePassword = (Get-Content $Node.WorkflowManagerServerLicensePasswordFilePath | ConvertTo-SecureString )
+ }elseif($Node.ServerLicensePassword){
+ $WorkflowManagerServerLicensePassword = (ConvertTo-SecureString $Node.WorkflowManagerServerLicensePassword -AsPlainText -Force)
+ }
+ }
+ $NodeToAdd["WorkflowManagerServerLicenseFilePath"] = $WorkflowManagerServerLicenseFilePath
+ if($null -ne $WorkflowManagerServerLicensePassword){
+ $NodeToAdd["WorkflowManagerServerLicensePassword"] = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ("PlaceHolder", $WorkflowManagerServerLicensePassword)
+ }
+ }
+
$ServerUpgradeArgs = @{
ConfigurationData = @{ AllNodes = @( $NodeToAdd ) }
OldVersion = $cf.ConfigData.OldVersion
@@ -2125,17 +2312,29 @@ function Invoke-ServerUpgradeScript {
IsServiceAccountDomainAccount = $cfServiceAccountIsDomainAccount
IsServiceAccountMSA = $cfServiceAccountIsMSA
InstallerPath = $cf.ConfigData.Server.Installer.Path
- GeoEventServerInstaller = if($cf.ConfigData.ServerRole -ieq "GeoEvent"){ $cf.ConfigData.GeoEventServer.Installer.Path }else{ $null }
- WorkflowManagerServerInstaller = if($cf.ConfigData.ServerRole -ieq "WorkflowManagerServer"){ $cf.ConfigData.WorkflowManagerServer.Installer.Path }else{ $null }
+ PatchesDir = $cf.ConfigData.Server.Installer.PatchesDir
+ PatchInstallOrder = $cf.ConfigData.Server.Installer.PatchInstallOrder
ContainerImagePaths = if($cf.ConfigData.ServerRole -ieq "NotebookServer"){ $cf.ConfigData.Server.ContainerImagePaths }else{ $null }
InstallDir = $cf.ConfigData.Server.Installer.InstallDir
NotebookServerSamplesDataPath = if(($cf.ConfigData.ServerRole -ieq "NotebookServer") -and ($cf.ConfigData.Version.Split(".")[1] -gt 8) -and $cf.ConfigData.Server.Installer.NotebookServerSamplesDataPath){ $cf.ConfigData.Server.Installer.NotebookServerSamplesDataPath }else{ $null }
IsMultiMachineServerSite = ($cf.AllNodes.count -gt 1)
EnableMSILogging = $EnableMSILogging
- EnableArcMapRuntime = if($Version -ieq "10.9.1"){ if($cf.ConfigData.Server.Installer.ContainsKey("EnableArcMapRuntime")){ $cf.ConfigData.Server.Installer.EnableArcMapRuntime }else{ $True } }else{ $False }
- EnableDotnetSupport = if($Version -ieq "10.9.1"){ $cf.ConfigData.Server.Installer.EnableDotnetSupport }else{ $False }
+ EnableArcMapRuntime = if($cf.ConfigData.Version -ieq "10.9.1"){ if($cf.ConfigData.Server.Installer.ContainsKey("EnableArcMapRuntime")){ $cf.ConfigData.Server.Installer.EnableArcMapRuntime } else { $True } } else { $False }
+ EnableDotnetSupport = if($cf.ConfigData.Version -ieq "10.9.1"){ if($cf.ConfigData.Server.Installer.ContainsKey("EnableDotnetSupport")){ $cf.ConfigData.Server.Installer.EnableDotnetSupport } else { $True } } else { $False }
Extensions = if($cf.ConfigData.Server.Extensions){ $cf.ConfigData.Server.Extensions }else{ $null }
}
+
+ if(($ServerRole -ieq "GeoEvent" -or ($ServerRole -ieq "GeneralPurposeServer" -and $AdditionalServerRoles -icontains "GeoEvent")) -and $cf.ConfigData.GeoEventServer){
+ $ServerUpgradeArgs.Add("GeoEventServerInstaller",$cf.ConfigData.GeoEventServer.Installer.Path)
+ $ServerUpgradeArgs.Add("GeoEventServerPatchesDir",$cf.ConfigData.GeoEventServer.Installer.PatchesDir)
+ $ServerUpgradeArgs.Add("GeoEventServerPatchInstallOrder",$cf.ConfigData.GeoEventServer.Installer.PatchInstallOrder)
+ }
+
+ if(($ServerRole -ieq "WorkflowManagerServer" -or ($ServerRole -ieq "GeneralPurposeServer" -and $AdditionalServerRoles -icontains "WorkflowManagerServer")) -and $cf.ConfigData.WorkflowManagerServer){
+ $ServerUpgradeArgs.Add("WorkflowManagerServerInstaller",$cf.ConfigData.WorkflowManagerServer.Installer.Path)
+ $ServerUpgradeArgs.Add("WorkflowManagerServerPatchesDir",$cf.ConfigData.WorkflowManagerServer.Installer.PatchesDir)
+ $ServerUpgradeArgs.Add("WorkflowManagerServerPatchInstallOrder",$cf.ConfigData.WorkflowManagerServer.Installer.PatchInstallOrder)
+ }
$JobFlag = Invoke-DSCJob -ConfigurationName "ServerUpgrade" -ConfigurationFolderPath "Configurations-OnPrem\Upgrades" -Arguments $ServerUpgradeArgs -Credential $Credential -UseWinRMSSL $UseWinRMSSL -DebugMode $DebugMode
if($JobFlag[$JobFlag.Count - 1] -ne $True){
@@ -2160,7 +2359,9 @@ function Invoke-ServerUpgradeScript {
Component = if($ServerRole -ieq "NotebookServer"){ 'NotebookServer' }elseif($ServerRole -ieq "MissionServer"){ 'MissionServer' }else{ 'Server' }
Version = $cf.ConfigData.Version
OldVersion = $cf.ConfigData.OldVersion
- InstallerPath = $cf.ConfigData.WebAdaptor.Installer.Path
+ InstallerPath = $cf.ConfigData.WebAdaptor.Installer.Path
+ PatchesDir = $cf.ConfigData.WebAdaptor.Installer.PatchesDir
+ PatchInstallOrder = $cf.ConfigData.WebAdaptor.Installer.PatchInstallOrder
ComponentHostName = $cfPrimaryServerMachine
SiteAdministratorCredential = $cfSiteAdministratorCredential
WebSiteId = if($cf.ConfigData.WebAdaptor.WebSiteId){ $cf.ConfigData.WebAdaptor.WebSiteId }else{ 1 }
@@ -2293,6 +2494,8 @@ function Invoke-DataStoreUpgradeScript {
IsServiceAccountDomainAccount = $DSServiceAccountIsDomainAccount
IsServiceAccountMSA = $DSServiceAccountIsMSA
InstallerPath = $DSConfig.ConfigData.DataStore.Installer.Path
+ PatchesDir = $DSConfig.ConfigData.DataStore.Installer.PatchesDir
+ PatchInstallOrder = $DSConfig.ConfigData.DataStore.Installer.PatchInstallOrder
InstallDir = $DSConfig.ConfigData.DataStore.Installer.InstallDir
EnableMSILogging = $EnableMSILoggingMode
}
@@ -2445,6 +2648,67 @@ function Invoke-PublishGISService
Invoke-DSCJob -ConfigurationName $ConfigurationName -ConfigurationFolderPath "Configurations-OnPrem" -Arguments $ConfigData -Credential $Credential -UseWinRMSSL $UseWinRMSSL -DebugMode $DebugMode
}
+function Wait-ForServiceToReachDesiredState
+{
+ [CmdletBinding()]
+ param(
+ [Parameter(Mandatory=$true)]
+ [System.String]
+ $ServiceName,
+
+ [Parameter(Mandatory=$true)]
+ [System.String]
+ $DesiredState,
+
+ [System.Int32]
+ $SleepTimeInSeconds=10,
+
+ [System.Int32]
+ $MaxSeconds=300,
+
+ [System.Int32]
+ $MaxAttempts=-1
+ )
+
+ $Attempts = 0
+ $Done = $false
+ $startTime = Get-Date
+
+ while ($true)
+ {
+ if ($Attempts++ -gt 0) { # to skip the message for first attempt
+ Write-Verbose "Checking state of Service '$ServiceName'. Attempt # $Attempts"
+ }
+
+ $Service = Get-Service -Name $ServiceName -ErrorAction Ignore
+
+ $msg = "Service '$ServiceName' not ready."
+ if ($Service) {
+ $msg = "Service '$ServiceName' is in '$($Service.Status)' state."
+ # exit if done
+ if ($Service.Status -ieq $DesiredState) {
+ Write-Verbose $msg
+ return
+ }
+ }
+
+ Write-Verbose $msg # not there yet, report current state
+
+ # exit on timeout
+ if (($MaxSeconds -gt 0) -and ($(Get-Date) - $startTime).TotalSeconds -ge $MaxSeconds) {
+ return
+ }
+
+ # exit on number of attempts
+ if (($MaxAttempts -gt 0) -and ($Attempts -ge $MaxAttempts)) {
+ return
+ }
+
+ Write-Verbose "Waiting $SleepTimeInSeconds seconds."
+ Start-Sleep -Seconds $SleepTimeInSeconds
+ }
+}
+
function Get-ArcGISProductDetails
{
[CmdletBinding()]
@@ -2469,7 +2733,8 @@ function Get-ArcGISProductDetails
if($DisplayName -imatch $ProductName -and $Publisher -ieq "Environmental Systems Research Institute, Inc."){
if(($ProductName -ieq "ArcGIS Notebook Server" -and -not($DisplayName -imatch "Samples Data")) `
-or ($ProductName -ieq "portal" -and -not($DisplayName -imatch "Web Styles")) `
- -or ($ProductName -ine "portal" -and $ProductName -ine "ArcGIS Notebook Server")){
+ -or ($ProductName -ine "portal" -and $ProductName -ine "ArcGIS Notebook Server") `
+ -or ($ProductName -ieq "ArcGIS Server" -and -not($DisplayName -imatch "Deep Learning Libraries for ArcGIS Server"))){
$ResultsArray += New-Object PSObject -Property @{
Name = $DisplayName
Version = $UninstallSubKey.GetValue("DisplayVersion")
@@ -2484,4 +2749,6 @@ function Get-ArcGISProductDetails
$ResultsArray
}
-Export-ModuleMember -Function Get-FQDN, Invoke-ArcGISConfiguration, Invoke-PublishWebApp, Invoke-BuildArcGISAzureImage, Invoke-PublishGISService, Get-ArcGISProductDetails
+Export-ModuleMember -Function Get-FQDN, Invoke-ArcGISConfiguration, Invoke-PublishWebApp, `
+ Invoke-BuildArcGISAzureImage, Invoke-PublishGISService, `
+ Get-ArcGISProductDetails, Wait-ForServiceToReachDesiredState
diff --git a/Modules/ArcGIS/ArcGISUtility.psm1 b/Modules/ArcGIS/ArcGISUtility.psm1
index f09057c4..e3646b24 100644
--- a/Modules/ArcGIS/ArcGISUtility.psm1
+++ b/Modules/ArcGIS/ArcGISUtility.psm1
@@ -149,66 +149,6 @@ function Get-LastModifiedDateForRemoteFile
}
}
-function Wait-ForServiceToReachDesiredState
-{
- [CmdletBinding()]
- param(
- [Parameter(Mandatory=$true)]
- [System.String]
- $ServiceName,
-
- [Parameter(Mandatory=$true)]
- [System.String]
- $DesiredState,
-
- [System.Int32]
- $SleepTimeInSeconds=10,
-
- [System.Int32]
- $MaxSeconds=300,
-
- [System.Int32]
- $MaxAttempts=-1
- )
-
- $Attempts = 0
- $Done = $false
- $startTime = Get-Date
-
- while ($true)
- {
- if ($Attempts++ -gt 0) { # to skip the message for first attempt
- Write-Verbose "Checking state of Service '$ServiceName'. Attempt # $Attempts"
- }
-
- $Service = Get-Service -Name $ServiceName -ErrorAction Ignore
-
- $msg = "Service '$ServiceName' not ready."
- if ($Service) {
- $msg = "Service '$ServiceName' is in '$($Service.Status)' state."
- # exit if done
- if ($Service.Status -ieq $DesiredState) {
- Write-Verbose $msg
- return
- }
- }
-
- Write-Verbose $msg # not there yet, report current state
-
- # exit on timeout
- if (($MaxSeconds -gt 0) -and ($(Get-Date) - $startTime).TotalSeconds -ge $MaxSeconds) {
- return
- }
-
- # exit on number of attempts
- if (($MaxAttempts -gt 0) -and ($Attempts -ge $MaxAttempts)) {
- return
- }
-
- Write-Verbose "Waiting $SleepTimeInSeconds seconds."
- Start-Sleep -Seconds $SleepTimeInSeconds
- }
-}
function Wait-ForUrl
{
@@ -593,6 +533,65 @@ function Confirm-PropertyInPropertiesFile
}
}
+function Get-NodeAgentAmazonElementsPresent
+{
+ [CmdletBinding()]
+ [OutputType([System.Boolean])]
+ param(
+ [System.String]
+ $InstallDir
+ )
+
+ $Enabled = $false
+ $File = Join-Path $InstallDir 'framework\etc\NodeAgentExt.xml'
+ if(Test-Path $File){
+ [xml]$xml = Get-Content $File
+ if((($xml.NodeAgent.Observers.Observer | Where-Object { $_.platform -ieq 'amazon'}).Length -gt 0) -or `
+ ($xml.NodeAgent.Observers.Observer.platform -ieq 'amazon') -or `
+ (($xml.NodeAgent.Plugins.Plugin | Where-Object { $_.platform -ieq 'amazon'}).Length -gt 0) -or `
+ ($xml.NodeAgent.Plugins.Plugin.platform -ieq 'amazon'))
+ {
+ Write-Verbose "Amazon elements exist in $File"
+ $Enabled = $true
+ }
+ }
+
+ $Enabled
+}
+
+function Remove-NodeAgentAmazonElements
+{
+ [CmdletBinding()]
+ [OutputType([System.Boolean])]
+ param(
+ [System.String]
+ $InstallDir
+ )
+
+ $Changed = $false
+ $File = Join-Path $InstallDir 'framework\etc\NodeAgentExt.xml'
+ if(Test-Path $File){
+ [xml]$xml = Get-Content $File
+ if($xml.NodeAgent.Observers.Observer.platform -ieq 'amazon')
+ {
+ $xml.NodeAgent.Observers.RemoveChild($xml.NodeAgent.Observers.Observer)
+ Write-Verbose "Amazon Observer exists in $File. Removing it"
+ $Changed = $true
+ }
+ if($xml.NodeAgent.Plugins.Plugin.platform -ieq 'amazon')
+ {
+ $xml.NodeAgent.Plugins.RemoveChild($xml.NodeAgent.Plugins.Plugin)
+ Write-Verbose "Amazon plugin exists in $File. Removing it"
+ $Changed = $true
+ }
+ if($Changed) {
+ $xml.Save($File)
+ }
+ }
+
+ $Changed
+}
+
function Add-HostMapping
{
[CmdletBinding()]
@@ -826,6 +825,8 @@ function Get-ArcGISProductName
$ProductName = 'ArcGIS Data Store'
}elseif($Name -ieq "ArcGIS for Server" -or $Name -ieq 'Server'){
$ProductName = 'ArcGIS Server'
+ }elseif($Name -ieq 'ServerDeepLearningLibraries'){
+ $ProductName = 'Deep Learning Libraries for ArcGIS Server'
}elseif($Name -ieq "Mission Server" -or $Name -ieq 'MissionServer'){
$ProductName = 'ArcGIS Mission Server'
}elseif($Name -ieq "Notebook Server" -or $Name -ieq 'NotebookServer'){
@@ -985,7 +986,6 @@ function Get-ComponentCode
WorkflowManagerWebApp = @{
'10.8.1' = '96A58AC8-C040-4E4A-A118-BE963BF1A8CF'
'10.9' = '28F45C9F-9581-4F82-9377-5B165D0D8580'
- '10.9.1' = '62242EB9-BB56-4F73-9A8D-B4891A142D5A'
}
Monitor = @{
'10.7' = '0497042F-0CBB-40C0-8F62-F1922B90E12E'
@@ -1241,24 +1241,28 @@ Function Test-Install{
}
}
- if(-not($resultSetFlag)){
- if(-not($ProdId.StartsWith('{'))){
- $ProdId = '{' + $ProdId
- }
- if(-not($ProdId.EndsWith('}'))){
- $ProdId = $ProdId + '}'
- }
- $PathToCheck = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$($ProdId)"
- Write-Verbose "Testing Presence for Component '$Name' with Path $PathToCheck"
- if (Test-Path $PathToCheck -ErrorAction Ignore){
- $result = $true
- }
- if(-not($result)){
- $PathToCheck = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\$($ProdId)"
+ if($null -eq $ProdId){
+ $result = $false
+ }else{
+ if(-not($resultSetFlag)){
+ if(-not($ProdId.StartsWith('{'))){
+ $ProdId = '{' + $ProdId
+ }
+ if(-not($ProdId.EndsWith('}'))){
+ $ProdId = $ProdId + '}'
+ }
+ $PathToCheck = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$($ProdId)"
Write-Verbose "Testing Presence for Component '$Name' with Path $PathToCheck"
if (Test-Path $PathToCheck -ErrorAction Ignore){
$result = $true
}
+ if(-not($result)){
+ $PathToCheck = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\$($ProdId)"
+ Write-Verbose "Testing Presence for Component '$Name' with Path $PathToCheck"
+ if (Test-Path $PathToCheck -ErrorAction Ignore){
+ $result = $true
+ }
+ }
}
}
@@ -1471,13 +1475,41 @@ function Invoke-DataStoreConfigureBackupLocationTool
$op
}
+function Restart-ArcGISService
+{
+ [CmdletBinding()]
+ param(
+ [System.String]
+ $ServiceName
+ )
+
+ try {
+ Write-Verbose "Restarting Service $ServiceName"
+ Stop-Service -Name $ServiceName -Force -ErrorAction Ignore
+ Write-Verbose 'Stopping the service'
+ Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
+ Write-Verbose 'Stopped the service'
+ }catch {
+ Write-Verbose "[WARNING] Stopping Service $_"
+ }
+
+ try {
+ Write-Verbose 'Starting the service'
+ Start-Service -Name $ServiceName -ErrorAction Ignore
+ Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
+ Write-Verbose "Restarted Service $ServiceName"
+ }catch {
+ Write-Verbose "[WARNING] Starting Service $_"
+ }
+}
-Export-ModuleMember -Function Invoke-ArcGISWebRequest, ConvertTo-HttpBody, Invoke-UploadFile,`
+Export-ModuleMember -Function Invoke-ArcGISWebRequest, ConvertTo-HttpBody, Invoke-UploadFile, `
Wait-ForUrl, Get-LastModifiedDateForRemoteFile, Confirm-ResponseStatus, `
- Get-ServerToken, Get-PortalToken, Wait-ForServiceToReachDesiredState,`
+ Get-ServerToken, Get-PortalToken, `
Get-EsriRegistryKeyForService, Confirm-PropertyInPropertiesFile, `
- Get-PropertyFromPropertiesFile, Set-PropertyFromPropertiesFile, Add-HostMapping,`
- Get-ConfiguredHostIdentifier, Set-ConfiguredHostIdentifier, Get-ConfiguredHostName,`
+ Get-PropertyFromPropertiesFile, Set-PropertyFromPropertiesFile, `
+ Get-NodeAgentAmazonElementsPresent, Remove-NodeAgentAmazonElements, Add-HostMapping, `
+ Get-ConfiguredHostIdentifier, Set-ConfiguredHostIdentifier, Get-ConfiguredHostName, `
Set-ConfiguredHostName, Get-ConfiguredHostIdentifierType, Get-ComponentCode, Get-ArcGISProductName, `
Test-Install, Convert-PSObjectToHashtable, Get-DataStoreBackupLocation, `
- Invoke-DataStoreConfigureBackupLocationTool, Invoke-DescribeDataStore
\ No newline at end of file
+ Invoke-DataStoreConfigureBackupLocationTool, Invoke-DescribeDataStore, Restart-ArcGISService
\ No newline at end of file
diff --git a/Modules/ArcGIS/Configurations-Azure-2/ServerUpgrade.ps1 b/Modules/ArcGIS/Configurations-Azure-2/ServerUpgrade.ps1
index 9c7aebda..45c54698 100644
--- a/Modules/ArcGIS/Configurations-Azure-2/ServerUpgrade.ps1
+++ b/Modules/ArcGIS/Configurations-Azure-2/ServerUpgrade.ps1
@@ -159,7 +159,7 @@ Configuration ServerUpgrade{
if($ServerRole -ieq "NotebookServer"){
$NotebookSamplesDataInstallerFileName = Split-Path $NotebookSamplesDataInstallerPath -Leaf
- $NotebookSamplesDataInstallerPathOnMachine = "$env:TEMP\Server\$NotebookSamplesDataInstallerFileName"
+ $NotebookSamplesDataInstallerPathOnMachine = "$env:TEMP\NBServer\$NotebookSamplesDataInstallerFileName"
File DownloadNotebookSampleInstallerFromFileShare
{
@@ -364,7 +364,7 @@ Configuration ServerUpgrade{
if(Get-Service 'ArcGISGeoEventGateway' -ErrorAction Ignore)
{
- ArcGIS_WindowsService ArcGIS_GeoEventGateway_Service
+ ArcGIS_WindowsService ArcGIS_GeoEventGateway_Service_Start
{
Name = 'ArcGISGeoEventGateway'
Credential = $ServiceCredential
@@ -372,7 +372,7 @@ Configuration ServerUpgrade{
State = 'Running'
DependsOn = $Depends
}
- $Depends += "[ArcGIS_WindowsService]ArcGIS_GeoEventGateway_Service"
+ $Depends += "[ArcGIS_WindowsService]ArcGIS_GeoEventGateway_Service_Start"
}
}
}
diff --git a/Modules/ArcGIS/Configurations-Azure/ServerUpgrade.ps1 b/Modules/ArcGIS/Configurations-Azure/ServerUpgrade.ps1
index e8d1e64c..271c0159 100644
--- a/Modules/ArcGIS/Configurations-Azure/ServerUpgrade.ps1
+++ b/Modules/ArcGIS/Configurations-Azure/ServerUpgrade.ps1
@@ -160,7 +160,7 @@ Configuration ServerUpgrade{
if($ServerRole -ieq "NotebookServer"){
$NotebookSamplesDataInstallerFileName = Split-Path $NotebookSamplesDataInstallerPath -Leaf
- $NotebookSamplesDataInstallerPathOnMachine = "$env:TEMP\Server\$NotebookSamplesDataInstallerFileName"
+ $NotebookSamplesDataInstallerPathOnMachine = "$env:TEMP\NBServer\$NotebookSamplesDataInstallerFileName"
File DownloadNotebookSampleInstallerFromFileShare
{
@@ -362,7 +362,7 @@ Configuration ServerUpgrade{
if(Get-Service 'ArcGISGeoEventGateway' -ErrorAction Ignore)
{
- ArcGIS_WindowsService ArcGIS_GeoEventGateway_Service
+ ArcGIS_WindowsService ArcGIS_GeoEventGateway_Service_Start
{
Name = 'ArcGISGeoEventGateway'
Credential = $ServiceCredential
@@ -370,7 +370,7 @@ Configuration ServerUpgrade{
State = 'Running'
DependsOn = $Depends
}
- $Depends += "[ArcGIS_WindowsService]ArcGIS_GeoEventGateway_Service"
+ $Depends += "[ArcGIS_WindowsService]ArcGIS_GeoEventGateway_Service_Start"
}
}
}
diff --git a/Modules/ArcGIS/Configurations-AzureImageBuild/ArcGISSetupConfiguration.ps1 b/Modules/ArcGIS/Configurations-AzureImageBuild/ArcGISSetupConfiguration.ps1
index 8f83ce54..0f4d9eed 100644
--- a/Modules/ArcGIS/Configurations-AzureImageBuild/ArcGISSetupConfiguration.ps1
+++ b/Modules/ArcGIS/Configurations-AzureImageBuild/ArcGISSetupConfiguration.ps1
@@ -140,6 +140,7 @@
Version = "00"
ProductId = $Installer.ProductId
PatchesDir = $ExecutionContext.InvokeCommand.ExpandString($Installer.PatchesLocalDir)
+ PatchInstallOrder = $Installer.Patches
Ensure = "Present"
}
}
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStore.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStore.ps1
index 79a4abb9..105f7e8b 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStore.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStore.ps1
@@ -65,7 +65,7 @@ Configuration ArcGISDataStore
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_xFirewall
Import-DscResource -Name ArcGIS_Service_Account
Import-DscResource -Name ArcGIS_DataStore
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStoreBackup.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStoreBackup.ps1
index 12a19ce1..0a70462f 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStoreBackup.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStoreBackup.ps1
@@ -27,7 +27,7 @@ Configuration ArcGISDataStoreBackup
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_DataStoreBackup
Node $AllNodes.NodeName
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStoreCertificateUpdate.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStoreCertificateUpdate.ps1
index a1f84877..25742b46 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStoreCertificateUpdate.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISDataStoreCertificateUpdate.ps1
@@ -1,7 +1,7 @@
Configuration ArcGISDataStoreCertificateUpdate
{
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_DataStore_TLS
Node $AllNodes.NodeName
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISFederation.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISFederation.ps1
index 030d81fc..06a6fd37 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISFederation.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISFederation.ps1
@@ -57,11 +57,11 @@ Configuration ArcGISFederation
[Parameter(Mandatory=$False)]
[System.String]
- $ServerRole
+ $ServerFunctions
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_Federation
Node $AllNodes.NodeName
@@ -74,9 +74,6 @@ Configuration ArcGISFederation
}
if($Node.NodeName -ieq $PrimaryServerMachine){
- if($ServerRole -ieq "WorkflowManagerServer"){
- $ServerRole = "WorkflowManager"
- }
ArcGIS_Federation Federate
{
PortalHostName = $PortalHostName
@@ -92,7 +89,7 @@ Configuration ArcGISFederation
RemoteSiteAdministrator = $RemoteSiteAdministrator
SiteAdministrator = $ServerPrimarySiteAdminCredential
ServerRole = if($IsHostingServer){'HOSTING_SERVER'}else{'FEDERATED_SERVER'}
- ServerFunctions = $ServerRole
+ ServerFunctions = $ServerFunctions
}
}
}
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISFileShare.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISFileShare.ps1
index f7f9f8f7..6b252668 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISFileShare.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISFileShare.ps1
@@ -28,7 +28,7 @@ Configuration ArcGISFileShare
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_FileShare
Node $AllNodes.NodeName
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISInstall.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISInstall.ps1
index cad0c7d3..9bb08d33 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISInstall.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISInstall.ps1
@@ -18,7 +18,7 @@ Configuration ArcGISInstall{
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_Install
Import-DscResource -Name ArcGIS_InstallMsiPackage
Import-DscResource -Name ArcGIS_InstallPatch
@@ -152,6 +152,7 @@ Configuration ArcGISInstall{
Name = $ServerTypeName
Version = $ConfigurationData.ConfigData.Version
PatchesDir = $ConfigurationData.ConfigData.Server.Installer.PatchesDir
+ PatchInstallOrder = $ConfigurationData.ConfigData.Server.Installer.PatchInstallOrder
Ensure = "Present"
}
}
@@ -188,6 +189,17 @@ Configuration ArcGISInstall{
EnableMSILogging = $EnableMSILogging
Ensure = "Present"
}
+
+ if ($ConfigurationData.ConfigData.WorkflowManagerServer.Installer.PatchesDir) {
+ ArcGIS_InstallPatch ServerInstallPatch
+ {
+ Name = $ServerTypeName
+ Version = $ConfigurationData.ConfigData.Version
+ PatchesDir = $ConfigurationData.ConfigData.WorkflowManagerServer.Installer.PatchesDir
+ PatchInstallOrder = $ConfigurationData.ConfigData.WorkflowManagerServer.Installer.PatchInstallOrder
+ Ensure = "Present"
+ }
+ }
}
if($ConfigurationData.ConfigData.GeoEventServer)
@@ -211,6 +223,7 @@ Configuration ArcGISInstall{
Name = "GeoEvent"
Version = $ConfigurationData.ConfigData.Version
PatchesDir = $ConfigurationData.ConfigData.GeoEventServer.Installer.PatchesDir
+ PatchInstallOrder = $ConfigurationData.ConfigData.GeoEventServer.Installer.PatchInstallOrder
Ensure = "Present"
}
}
@@ -256,6 +269,7 @@ Configuration ArcGISInstall{
Name = "Portal"
Version = $ConfigurationData.ConfigData.Version
PatchesDir = $ConfigurationData.ConfigData.Portal.Installer.PatchesDir
+ PatchInstallOrder = $ConfigurationData.ConfigData.Portal.Installer.PatchInstallOrder
Ensure = "Present"
}
}
@@ -297,6 +311,7 @@ Configuration ArcGISInstall{
Name = "Insights"
Version = $ConfigurationData.ConfigData.InsightsVersion
PatchesDir = $ConfigurationData.ConfigData.Insights.Installer.PatchesDir
+ PatchInstallOrder = $ConfigurationData.ConfigData.Insights.Installer.PatchInstallOrder
Ensure = "Present"
}
}
@@ -322,6 +337,7 @@ Configuration ArcGISInstall{
Name = "DataStore"
Version = $ConfigurationData.ConfigData.Version
PatchesDir = $ConfigurationData.ConfigData.DataStore.Installer.PatchesDir
+ PatchInstallOrder = $ConfigurationData.ConfigData.DataStore.Installer.PatchInstallOrder
Ensure = "Present"
}
}
@@ -385,6 +401,7 @@ Configuration ArcGISInstall{
Name = "WebAdaptor"
Version = $ConfigurationData.ConfigData.Version
PatchesDir = $ConfigurationData.ConfigData.WebAdaptor.Installer.PatchesDir
+ PatchInstallOrder = $ConfigurationData.ConfigData.WebAdaptor.Installer.PatchInstallOrder
Ensure = "Present"
}
}
@@ -486,6 +503,7 @@ Configuration ArcGISInstall{
Name = "Desktop"
Version = $ConfigurationData.ConfigData.DesktopVersion
PatchesDir = $ConfigurationData.ConfigData.Desktop.Installer.PatchesDir
+ PatchInstallOrder = $ConfigurationData.ConfigData.Desktop.Installer.PatchInstallOrder
Ensure = "Present"
}
}
@@ -578,6 +596,7 @@ Configuration ArcGISInstall{
Name = "Pro"
Version = $ConfigurationData.ConfigData.ProVersion
PatchesDir = $ConfigurationData.ConfigData.Pro.Installer.PatchesDir
+ PatchInstallOrder = $ConfigurationData.ConfigData.Pro.Installer.PatchInstallOrder
Ensure = "Present"
}
}
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISLicense.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISLicense.ps1
index 39892d6f..ddc05dfc 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISLicense.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISLicense.ps1
@@ -6,7 +6,7 @@ Configuration ArcGISLicense
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_License
Node $AllNodes.NodeName
@@ -24,14 +24,41 @@ Configuration ArcGISLicense
{
'Server'
{
- ArcGIS_License "ServerLicense$($Node.NodeName)"
- {
- LicenseFilePath = $Node.ServerLicenseFilePath
- LicensePassword = $Node.ServerLicensePassword
- Ensure = "Present"
- Component = 'Server'
- ServerRole = $Node.ServerRole
- Force = $ForceLicenseUpdate
+ if($Node.ServerRole -ine "GeoEvent" -and $Node.ServerRole -ine "WorkflowManagerServer" -and $Node.ServerLicenseFilePath){
+ ArcGIS_License "ServerLicense$($Node.NodeName)"
+ {
+ LicenseFilePath = $Node.ServerLicenseFilePath
+ LicensePassword = $Node.ServerLicensePassword
+ Ensure = "Present"
+ Component = 'Server'
+ ServerRole = $Node.ServerRole
+ AdditionalServerRoles = if($Node.ServerRole -ieq "GeneralPurposeServer" -and $Node.AdditionalServerRoles){ if(($Node.AdditionalServerRoles | Where-Object {$_ -ine 'GeoEvent' -and $_ -ine 'NotebookServer' -and $_ -ine 'WorkflowManagerServer' -and $_ -ine 'MissionServer'}).Count -gt 0){$Node.AdditionalServerRoles | Where-Object {$_ -ine 'GeoEvent' -and $_ -ine 'NotebookServer' -and $_ -ine 'WorkflowManagerServer' -and $_ -ine 'MissionServer'}}else{$null} }else{ $null }
+ Force = $ForceLicenseUpdate
+ }
+ }
+
+ if(($Node.ServerRole -ieq "GeoEvent" -or ($Node.ServerRole -ieq "GeneralPurposeServer" -and $Node.AdditionalServerRoles -icontains "GeoEvent")) -and $Node.GeoeventServerLicenseFilePath){
+ ArcGIS_License "GeoeventServerLicense$($Node.NodeName)"
+ {
+ LicenseFilePath = $Node.GeoeventServerLicenseFilePath
+ LicensePassword = $Node.GeoeventServerLicensePassword
+ Ensure = "Present"
+ Component = 'Server'
+ ServerRole = "GeoEvent"
+ Force = $ForceLicenseUpdate
+ }
+ }
+
+ if(($Node.ServerRole -ieq "WorkflowManagerServer" -or ($Node.ServerRole -ieq "GeneralPurposeServer" -and $Node.AdditionalServerRoles -icontains "WorkflowManagerServer")) -and $Node.WorkflowManagerServerLicenseFilePath){
+ ArcGIS_License "WorkflowManagerServerLicense$($Node.NodeName)"
+ {
+ LicenseFilePath = $Node.WorkflowManagerServerLicenseFilePath
+ LicensePassword = $Node.WorkflowManagerServerLicensePassword
+ Ensure = "Present"
+ Component = 'Server'
+ ServerRole = "WorkflowManagerServer"
+ Force = $ForceLicenseUpdate
+ }
}
}
'Portal'
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISMissionServer.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISMissionServer.ps1
index 594b76b8..f9e319ab 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISMissionServer.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISMissionServer.ps1
@@ -48,11 +48,7 @@ Configuration ArcGISMissionServer
$ServerLogsLocation = $null,
[Parameter(Mandatory=$False)]
- [System.Object]
- $SslRootOrIntermediate,
-
- [Parameter(Mandatory=$False)]
- [ValidateSet("AzureFiles","AzureBlob")]
+ [ValidateSet("AzureFiles","AzureBlob","AWSS3DynamoDB")]
[AllowNull()]
[System.String]
$ConfigStoreCloudStorageType,
@@ -65,6 +61,10 @@ Configuration ArcGISMissionServer
[System.String]
$ConfigStoreCloudNamespace,
+ [Parameter(Mandatory=$False)]
+ [System.String]
+ $ConfigStoreAWSRegion,
+
[Parameter(Mandatory=$False)]
[System.Management.Automation.PSCredential]
$ConfigStoreCloudStorageCredentials,
@@ -97,7 +97,7 @@ Configuration ArcGISMissionServer
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_MissionServer
Import-DscResource -Name ArcGIS_MissionServerSettings
Import-DscResource -Name ArcGIS_Server_TLS
@@ -105,26 +105,35 @@ Configuration ArcGISMissionServer
Import-DscResource -Name ArcGIS_xFirewall
Import-DscResource -Name ArcGIS_WaitForComponent
- if(($null -ne $ConfigStoreCloudStorageType) -and $ConfigStoreCloudStorageCredentials)
- {
- $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName
- $ConfigStoreEndpointSuffix = ''
- $ConfigStorePos = $ConfigStoreCloudStorageCredentials.UserName.IndexOf('.blob.')
- if($ConfigStorePos -gt -1) {
- $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName.Substring(0, $ConfigStorePos)
- $ConfigStoreEndpointSuffix = $ConfigStoreCloudStorageCredentials.UserName.Substring($ConfigStorePos + 6) # Remove the hostname and .blob. suffix to get the storage endpoint suffix
- $ConfigStoreEndpointSuffix = ";EndpointSuffix=$($ConfigStoreEndpointSuffix)"
- }
-
- if($ConfigStoreCloudStorageType -ieq 'AzureFiles') {
- $ConfigStoreAzureFilesEndpoint = if($ConfigStorePos -gt -1){$ConfigStoreCloudStorageCredentials.UserName.Replace('.blob.','.file.')}else{$ConfigStoreCloudStorageCredentials.UserName}
- $ConfigStoreAzureFileShareName = $ConfigStoreAzureFileShareName.ToLower() # Azure file shares need to be lower case
- $ConfigStoreLocation = "\\$($ConfigStoreAzureFilesEndpoint)\$ConfigStoreAzureFileShareName\$($ConfigStoreCloudNamespace)\missionserver\config-store"
- }
- else {
- $ConfigStoreCloudStorageConnectionString = "NAMESPACE=$($ConfigStoreCloudNamespace)missionserver$($ConfigStoreEndpointSuffix);DefaultEndpointsProtocol=https;"
- $ConfigStoreCloudStorageAccountName = "AccountName=$ConfigStoreAccountName"
- $ConfigStoreCloudStorageConnectionSecret = "AccountKey=$($ConfigStoreCloudStorageCredentials.GetNetworkCredential().Password)"
+ if($null -ne $ConfigStoreCloudStorageType) {
+ if($ConfigStoreCloudStorageType -ieq "AWSS3DynamoDB"){
+ $ConfigStoreCloudStorageConnectionString="NAMESPACE=$($ConfigStoreCloudNamespace);REGION=$($ConfigStoreAWSRegion);"
+ if($ConfigStoreCloudStorageCredentials){
+ $ConfigStoreCloudStorageAccountName = "ACCESS_KEY_ID=$($ConfigStoreCloudStorageCredentials.UserName)"
+ $ConfigStoreCloudStorageConnectionSecret="SECRET_KEY=$($ConfigStoreCloudStorageCredentials.GetNetworkCredential().Password);"
+ }
+ }else{
+ if($ConfigStoreCloudStorageCredentials){
+ $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName
+ $ConfigStoreEndpointSuffix = ''
+ $ConfigStorePos = $ConfigStoreCloudStorageCredentials.UserName.IndexOf('.blob.')
+ if($ConfigStorePos -gt -1) {
+ $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName.Substring(0, $ConfigStorePos)
+ $ConfigStoreEndpointSuffix = $ConfigStoreCloudStorageCredentials.UserName.Substring($ConfigStorePos + 6) # Remove the hostname and .blob. suffix to get the storage endpoint suffix
+ $ConfigStoreEndpointSuffix = ";EndpointSuffix=$($ConfigStoreEndpointSuffix)"
+ }
+
+ if($ConfigStoreCloudStorageType -ieq 'AzureFiles') {
+ $ConfigStoreAzureFilesEndpoint = if($ConfigStorePos -gt -1){$ConfigStoreCloudStorageCredentials.UserName.Replace('.blob.','.file.')}else{$ConfigStoreCloudStorageCredentials.UserName}
+ $ConfigStoreAzureFileShareName = $ConfigStoreAzureFileShareName.ToLower() # Azure file shares need to be lower case
+ $ConfigStoreLocation = "\\$($ConfigStoreAzureFilesEndpoint)\$ConfigStoreAzureFileShareName\$($ConfigStoreCloudNamespace)\missionserver\config-store"
+ }
+ else {
+ $ConfigStoreCloudStorageConnectionString = "NAMESPACE=$($ConfigStoreCloudNamespace)missionserver$($ConfigStoreEndpointSuffix);DefaultEndpointsProtocol=https;"
+ $ConfigStoreCloudStorageAccountName = "AccountName=$ConfigStoreAccountName"
+ $ConfigStoreCloudStorageConnectionSecret = "AccountKey=$($ConfigStoreCloudStorageCredentials.GetNetworkCredential().Password)"
+ }
+ }
}
}
@@ -312,7 +321,7 @@ Configuration ArcGISMissionServer
CertificateFileLocation = $Node.SSLCertificate.Path
CertificatePassword = $Node.SSLCertificate.Password
EnableSSL = $True
- SslRootOrIntermediate = $SslRootOrIntermediate
+ SslRootOrIntermediate = $Node.SSLCertificate.SslRootOrIntermediate
ServerType = "MissionServer"
DependsOn = $DependsOn
}
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISMissionServerSettings.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISMissionServerSettings.ps1
index 4d14a17f..af2cff1a 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISMissionServerSettings.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISMissionServerSettings.ps1
@@ -20,7 +20,7 @@ Configuration ArcGISMissionServerSettings{
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_MissionServerSettings
Node $AllNodes.NodeName
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISNotebookServer.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISNotebookServer.ps1
index 8658ef43..6c285076 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISNotebookServer.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISNotebookServer.ps1
@@ -48,11 +48,7 @@ Configuration ArcGISNotebookServer
$ServerLogsLocation = $null,
[Parameter(Mandatory=$False)]
- [System.Object]
- $SslRootOrIntermediate,
-
- [Parameter(Mandatory=$False)]
- [ValidateSet("AzureFiles","AzureBlob")]
+ [ValidateSet("AzureFiles","AzureBlob","AWSS3DynamoDB")]
[AllowNull()]
[System.String]
$ConfigStoreCloudStorageType,
@@ -65,6 +61,10 @@ Configuration ArcGISNotebookServer
[System.String]
$ConfigStoreCloudNamespace,
+ [Parameter(Mandatory=$False)]
+ [System.String]
+ $ConfigStoreAWSRegion,
+
[Parameter(Mandatory=$False)]
[System.Management.Automation.PSCredential]
$ConfigStoreCloudStorageCredentials,
@@ -105,7 +105,7 @@ Configuration ArcGISNotebookServer
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_NotebookServer
Import-DscResource -Name ArcGIS_NotebookPostInstall
Import-DscResource -Name ArcGIS_NotebookServerSettings
@@ -114,26 +114,35 @@ Configuration ArcGISNotebookServer
Import-DscResource -Name ArcGIS_xFirewall
Import-DscResource -Name ArcGIS_WaitForComponent
- if(($null -ne $ConfigStoreCloudStorageType) -and $ConfigStoreCloudStorageCredentials)
- {
- $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName
- $ConfigStoreEndpointSuffix = ''
- $ConfigStorePos = $ConfigStoreCloudStorageCredentials.UserName.IndexOf('.blob.')
- if($ConfigStorePos -gt -1) {
- $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName.Substring(0, $ConfigStorePos)
- $ConfigStoreEndpointSuffix = $ConfigStoreCloudStorageCredentials.UserName.Substring($ConfigStorePos + 6) # Remove the hostname and .blob. suffix to get the storage endpoint suffix
- $ConfigStoreEndpointSuffix = ";EndpointSuffix=$($ConfigStoreEndpointSuffix)"
- }
+ if($null -ne $ConfigStoreCloudStorageType) {
+ if($ConfigStoreCloudStorageType -ieq "AWSS3DynamoDB"){
+ $ConfigStoreCloudStorageConnectionString="NAMESPACE=$($ConfigStoreCloudNamespace);REGION=$($ConfigStoreAWSRegion);"
+ if($ConfigStoreCloudStorageCredentials){
+ $ConfigStoreCloudStorageAccountName = "ACCESS_KEY_ID=$($ConfigStoreCloudStorageCredentials.UserName)"
+ $ConfigStoreCloudStorageConnectionSecret="SECRET_KEY=$($ConfigStoreCloudStorageCredentials.GetNetworkCredential().Password);"
+ }
+ }else{
+ if($ConfigStoreCloudStorageCredentials){
+ $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName
+ $ConfigStoreEndpointSuffix = ''
+ $ConfigStorePos = $ConfigStoreCloudStorageCredentials.UserName.IndexOf('.blob.')
+ if($ConfigStorePos -gt -1) {
+ $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName.Substring(0, $ConfigStorePos)
+ $ConfigStoreEndpointSuffix = $ConfigStoreCloudStorageCredentials.UserName.Substring($ConfigStorePos + 6) # Remove the hostname and .blob. suffix to get the storage endpoint suffix
+ $ConfigStoreEndpointSuffix = ";EndpointSuffix=$($ConfigStoreEndpointSuffix)"
+ }
- if($ConfigStoreCloudStorageType -ieq 'AzureFiles') {
- $ConfigStoreAzureFilesEndpoint = if($ConfigStorePos -gt -1){$ConfigStoreCloudStorageCredentials.UserName.Replace('.blob.','.file.')}else{$ConfigStoreCloudStorageCredentials.UserName}
- $ConfigStoreAzureFileShareName = $ConfigStoreAzureFileShareName.ToLower() # Azure file shares need to be lower case
- $ConfigStoreLocation = "\\$($ConfigStoreAzureFilesEndpoint)\$ConfigStoreAzureFileShareName\$($ConfigStoreCloudNamespace)\notebookserver\config-store"
- }
- else {
- $ConfigStoreCloudStorageConnectionString = "NAMESPACE=$($ConfigStoreCloudNamespace)notebookserver$($ConfigStoreEndpointSuffix);DefaultEndpointsProtocol=https;"
- $ConfigStoreCloudStorageAccountName = "AccountName=$ConfigStoreAccountName"
- $ConfigStoreCloudStorageConnectionSecret = "AccountKey=$($ConfigStoreCloudStorageCredentials.GetNetworkCredential().Password)"
+ if($ConfigStoreCloudStorageType -ieq 'AzureFiles') {
+ $ConfigStoreAzureFilesEndpoint = if($ConfigStorePos -gt -1){$ConfigStoreCloudStorageCredentials.UserName.Replace('.blob.','.file.')}else{$ConfigStoreCloudStorageCredentials.UserName}
+ $ConfigStoreAzureFileShareName = $ConfigStoreAzureFileShareName.ToLower() # Azure file shares need to be lower case
+ $ConfigStoreLocation = "\\$($ConfigStoreAzureFilesEndpoint)\$ConfigStoreAzureFileShareName\$($ConfigStoreCloudNamespace)\notebookserver\config-store"
+ }
+ else {
+ $ConfigStoreCloudStorageConnectionString = "NAMESPACE=$($ConfigStoreCloudNamespace)notebookserver$($ConfigStoreEndpointSuffix);DefaultEndpointsProtocol=https;"
+ $ConfigStoreCloudStorageAccountName = "AccountName=$ConfigStoreAccountName"
+ $ConfigStoreCloudStorageConnectionSecret = "AccountKey=$($ConfigStoreCloudStorageCredentials.GetNetworkCredential().Password)"
+ }
+ }
}
}
@@ -321,7 +330,7 @@ Configuration ArcGISNotebookServer
CertificateFileLocation = $Node.SSLCertificate.Path
CertificatePassword = $Node.SSLCertificate.Password
EnableSSL = $True
- SslRootOrIntermediate = $SslRootOrIntermediate
+ SslRootOrIntermediate = $Node.SSLCertificate.SslRootOrIntermediate
ServerType = "NotebookServer"
DependsOn = $DependsOn
}
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISNotebookServerSettings.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISNotebookServerSettings.ps1
index c52ac637..4aa2357a 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISNotebookServerSettings.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISNotebookServerSettings.ps1
@@ -20,7 +20,7 @@ Configuration ArcGISNotebookServerSettings{
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_NotebookServerSettings
Node $AllNodes.NodeName
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISPortal.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISPortal.ps1
index 8d9761ac..265d2ef4 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISPortal.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISPortal.ps1
@@ -72,11 +72,7 @@ Configuration ArcGISPortal
$DisableServiceDirectory,
[Parameter(Mandatory=$False)]
- [System.Object]
- $SslRootOrIntermediate,
-
- [Parameter(Mandatory=$False)]
- [ValidateSet("AzureFiles","AzureBlob")]
+ [ValidateSet("AzureFiles","AzureBlob","AWSS3DynamoDB")]
[AllowNull()]
[System.String]
$CloudStorageType,
@@ -87,6 +83,9 @@ Configuration ArcGISPortal
[System.String]
$CloudNamespace,
+ [System.String]
+ $AWSRegion,
+
[Parameter(Mandatory=$False)]
[System.Management.Automation.PSCredential]
$CloudStorageCredentials,
@@ -126,32 +125,41 @@ Configuration ArcGISPortal
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_xFirewall
Import-DscResource -Name ArcGIS_Portal
Import-DscResource -Name ArcGIS_Service_Account
Import-DscResource -Name ArcGIS_WaitForComponent
- if(($null -ne $CloudStorageType) -and $CloudStorageCredentials)
+ if($null -ne $CloudStorageType)
{
- $AccountName = $CloudStorageCredentials.UserName
- $EndpointSuffix = ''
- $Pos = $CloudStorageCredentials.UserName.IndexOf('.blob.')
- if($Pos -gt -1) {
- $AccountName = $CloudStorageCredentials.UserName.Substring(0, $Pos)
- $EndpointSuffix = $CloudStorageCredentials.UserName.Substring($Pos + 6) # Remove the hostname and .blob. suffix to get the storage endpoint suffix
- $EndpointSuffix = ";EndpointSuffix=$($EndpointSuffix)"
- }
-
- if($CloudStorageType -ieq 'AzureFiles') {
- $AzureFilesEndpoint = if($Pos -gt -1){$CloudStorageCredentials.UserName.Replace('.blob.','.file.')}else{$CloudStorageCredentials.UserName}
- $AzureFileShareName = $AzureFileShareName.ToLower() # Azure file shares need to be lower case
- $ContentDirectoryLocation = "\\$($AzureFilesEndpoint)\$AzureFileShareName\$($CloudNamespace)\portal\content"
- }
- else {
- $AccountKey = $CloudStorageCredentials.GetNetworkCredential().Password
- $ContentDirectoryCloudConnectionString = "DefaultEndpointsProtocol=https;AccountName=$($AccountName);AccountKey=$($AccountKey)$($EndpointSuffix)"
- $ContentDirectoryCloudContainerName = "arcgis-portal-content-$($CloudNamespace)portal"
+ if($CloudStorageType -ieq 'AWSS3DynamoDB') {
+ $ContentDirectoryCloudConnectionString = "NAMESPACE=$($CloudNamespace);REGION=$($AWSRegion);"
+ if($null -ne $CloudStorageCredentials){
+ $ContentDirectoryCloudConnectionString += "ACCESS_KEY_ID=$($CloudStorageCredentials.UserName);SECRET_KEY=$($CloudStorageCredentials.GetNetworkCredential().Password)"
+ }
+ }else{
+ if($null -ne $CloudStorageCredentials){
+ $AccountName = $CloudStorageCredentials.UserName
+ $EndpointSuffix = ''
+ $Pos = $CloudStorageCredentials.UserName.IndexOf('.blob.')
+ if($Pos -gt -1) {
+ $AccountName = $CloudStorageCredentials.UserName.Substring(0, $Pos)
+ $EndpointSuffix = $CloudStorageCredentials.UserName.Substring($Pos + 6) # Remove the hostname and .blob. suffix to get the storage endpoint suffix
+ $EndpointSuffix = ";EndpointSuffix=$($EndpointSuffix)"
+ }
+
+ if($CloudStorageType -ieq 'AzureFiles') {
+ $AzureFilesEndpoint = if($Pos -gt -1){$CloudStorageCredentials.UserName.Replace('.blob.','.file.')}else{$CloudStorageCredentials.UserName}
+ $AzureFileShareName = $AzureFileShareName.ToLower() # Azure file shares need to be lower case
+ $ContentDirectoryLocation = "\\$($AzureFilesEndpoint)\$AzureFileShareName\$($CloudNamespace)\portal\content"
+ }
+ else {
+ $AccountKey = $CloudStorageCredentials.GetNetworkCredential().Password
+ $ContentDirectoryCloudConnectionString = "DefaultEndpointsProtocol=https;AccountName=$($AccountName);AccountKey=$($AccountKey)$($EndpointSuffix)"
+ $ContentDirectoryCloudContainerName = "arcgis-portal-content-$($CloudNamespace)portal"
+ }
+ }
}
}
@@ -369,7 +377,7 @@ Configuration ArcGISPortal
CertificateFileLocation = $Node.SSLCertificate.Path
CertificatePassword = $Node.SSLCertificate.Password
DependsOn = $Depends
- SslRootOrIntermediate = $SslRootOrIntermediate
+ SslRootOrIntermediate = $Node.SSLCertificate.SslRootOrIntermediate
}
}
}
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISPortalSettings.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISPortalSettings.ps1
index bcebd303..5555f0e8 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISPortalSettings.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISPortalSettings.ps1
@@ -23,7 +23,7 @@ Configuration ArcGISPortalSettings{
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_PortalSettings
Node $AllNodes.NodeName
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISRasterDataStoreItem.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISRasterDataStoreItem.ps1
index 7fcb0ec3..354a323c 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISRasterDataStoreItem.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISRasterDataStoreItem.ps1
@@ -32,7 +32,7 @@ Configuration ArcGISRasterDataStoreItem
$FileShareLocalPath
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_FileShare
Import-DSCResource -Name ArcGIS_DataStoreItem
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISRegisterSQLEGDB.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISRegisterSQLEGDB.ps1
index 97121ea5..7e4c8e15 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISRegisterSQLEGDB.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISRegisterSQLEGDB.ps1
@@ -45,7 +45,7 @@ Configuration ArcGISRegisterSQLEGDB{
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DSCResource -Name ArcGIS_EGDB
Node $AllNodes.NodeName
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISServer.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISServer.ps1
index c620393c..16bfd6eb 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISServer.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISServer.ps1
@@ -35,6 +35,10 @@ Configuration ArcGISServer
[System.String]
$ServerRole,
+ [Parameter(Mandatory=$False)]
+ [System.Array]
+ $AdditionalServerRoles,
+
[Parameter(Mandatory=$False)]
[System.Boolean]
$OpenFirewallPorts = $False,
@@ -64,11 +68,7 @@ Configuration ArcGISServer
$RegisteredDirectories,
[Parameter(Mandatory=$False)]
- [System.Object]
- $SslRootOrIntermediate,
-
- [Parameter(Mandatory=$False)]
- [ValidateSet("AzureFiles","AzureBlob")]
+ [ValidateSet("AzureFiles","AzureBlob","AWSS3DynamoDB")]
[AllowNull()]
[System.String]
$ConfigStoreCloudStorageType,
@@ -81,6 +81,10 @@ Configuration ArcGISServer
[System.String]
$ConfigStoreCloudNamespace,
+ [Parameter(Mandatory=$False)]
+ [System.String]
+ $ConfigStoreAWSRegion,
+
[Parameter(Mandatory=$False)]
[System.Management.Automation.PSCredential]
$ConfigStoreCloudStorageCredentials,
@@ -103,6 +107,10 @@ Configuration ArcGISServer
[System.Management.Automation.PSCredential]
$ServerDirectoriesCloudStorageCredentials,
+ [Parameter(Mandatory=$False)]
+ [System.Boolean]
+ $DisableServiceDirectory = $False,
+
[Parameter(Mandatory=$False)]
[System.Boolean]
$UsesSSL = $False,
@@ -113,32 +121,41 @@ Configuration ArcGISServer
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_xFirewall
Import-DscResource -Name ArcGIS_Server
Import-DscResource -Name ArcGIS_Service_Account
Import-DscResource -Name ArcGIS_GeoEvent
Import-DscResource -Name ArcGIS_WaitForComponent
- if(($null -ne $ConfigStoreCloudStorageType) -and $ConfigStoreCloudStorageCredentials)
+ if($null -ne $ConfigStoreCloudStorageType)
{
- $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName
- $ConfigStoreEndpointSuffix = ''
- $ConfigStorePos = $ConfigStoreCloudStorageCredentials.UserName.IndexOf('.blob.')
- if($ConfigStorePos -gt -1) {
- $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName.Substring(0, $ConfigStorePos)
- $ConfigStoreEndpointSuffix = $ConfigStoreCloudStorageCredentials.UserName.Substring($ConfigStorePos + 6) # Remove the hostname and .blob. suffix to get the storage endpoint suffix
- $ConfigStoreEndpointSuffix = ";EndpointSuffix=$($ConfigStoreEndpointSuffix)"
- }
+ if($ConfigStoreCloudStorageType -ieq "AWSS3DynamoDB"){
+ $ConfigStoreCloudStorageConnectionString="NAMESPACE=$($ConfigStoreCloudNamespace);REGION=$($ConfigStoreAWSRegion);"
+ if($ConfigStoreCloudStorageCredentials){
+ $ConfigStoreCloudStorageConnectionSecret="ACCESS_KEY_ID=$($ConfigStoreCloudStorageCredentials.UserName);SECRET_KEY=$($ConfigStoreCloudStorageCredentials.GetNetworkCredential().Password);"
+ }
+ }else{
+ if($ConfigStoreCloudStorageCredentials){
+ $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName
+ $ConfigStoreEndpointSuffix = ''
+ $ConfigStorePos = $ConfigStoreCloudStorageCredentials.UserName.IndexOf('.blob.')
+ if($ConfigStorePos -gt -1) {
+ $ConfigStoreAccountName = $ConfigStoreCloudStorageCredentials.UserName.Substring(0, $ConfigStorePos)
+ $ConfigStoreEndpointSuffix = $ConfigStoreCloudStorageCredentials.UserName.Substring($ConfigStorePos + 6) # Remove the hostname and .blob. suffix to get the storage endpoint suffix
+ $ConfigStoreEndpointSuffix = ";EndpointSuffix=$($ConfigStoreEndpointSuffix)"
+ }
- if($ConfigStoreCloudStorageType -ieq 'AzureFiles') {
- $ConfigStoreAzureFilesEndpoint = if($ConfigStorePos -gt -1){$ConfigStoreCloudStorageCredentials.UserName.Replace('.blob.','.file.')}else{$ConfigStoreCloudStorageCredentials.UserName}
- $ConfigStoreAzureFileShareName = $ConfigStoreAzureFileShareName.ToLower() # Azure file shares need to be lower case
- $ConfigStoreLocation = "\\$($ConfigStoreAzureFilesEndpoint)\$ConfigStoreAzureFileShareName\$($ConfigStoreCloudNamespace)\server\config-store"
- }
- else {
- $ConfigStoreCloudStorageConnectionString = "NAMESPACE=$($ConfigStoreCloudNamespace)server$($ConfigStoreEndpointSuffix);DefaultEndpointsProtocol=https;AccountName=$ConfigStoreAccountName"
- $ConfigStoreCloudStorageConnectionSecret = "AccountKey=$($ConfigStoreCloudStorageCredentials.GetNetworkCredential().Password)"
+ if($ConfigStoreCloudStorageType -ieq 'AzureFiles') {
+ $ConfigStoreAzureFilesEndpoint = if($ConfigStorePos -gt -1){$ConfigStoreCloudStorageCredentials.UserName.Replace('.blob.','.file.')}else{$ConfigStoreCloudStorageCredentials.UserName}
+ $ConfigStoreAzureFileShareName = $ConfigStoreAzureFileShareName.ToLower() # Azure file shares need to be lower case
+ $ConfigStoreLocation = "\\$($ConfigStoreAzureFilesEndpoint)\$ConfigStoreAzureFileShareName\$($ConfigStoreCloudNamespace)\server\config-store"
+ }
+ else {
+ $ConfigStoreCloudStorageConnectionString = "NAMESPACE=$($ConfigStoreCloudNamespace)server$($ConfigStoreEndpointSuffix);DefaultEndpointsProtocol=https;AccountName=$ConfigStoreAccountName"
+ $ConfigStoreCloudStorageConnectionSecret = "AccountKey=$($ConfigStoreCloudStorageCredentials.GetNetworkCredential().Password)"
+ }
+ }
}
}
@@ -200,7 +217,7 @@ Configuration ArcGISServer
Protocol = "TCP"
}
- if($ServerRole -ieq 'GeoAnalytics')
+ if($ServerRole -ieq 'GeoAnalytics' -or ($ServerRole -ieq "GeneralPurposeServer" -and $AdditionalServerRoles -icontains "GeoAnalytics"))
{
$Depends += '[ArcGIS_xFirewall]GeoAnalytics_InboundFirewallRules'
$Depends += '[ArcGIS_xFirewall]GeoAnalytics_OutboundFirewallRules'
@@ -405,6 +422,7 @@ Configuration ArcGISServer
PeerServerHostName = Get-FQDN $PrimaryServerMachine
DependsOn = $Depends
LogLevel = if($DebugMode) { 'DEBUG' } else { 'WARNING' }
+ DisableServiceDirectory = if($DisableServiceDirectory) { $true } else { $false }
SingleClusterMode = $true
ConfigStoreCloudStorageConnectionString = $ConfigStoreCloudStorageConnectionString
ConfigStoreCloudStorageConnectionSecret = $ConfigStoreCloudStorageConnectionSecret
@@ -422,7 +440,7 @@ Configuration ArcGISServer
CertificateFileLocation = $Node.SSLCertificate.Path
CertificatePassword = $Node.SSLCertificate.Password
EnableSSL = $True
- SslRootOrIntermediate = $SslRootOrIntermediate
+ SslRootOrIntermediate = $Node.SSLCertificate.SslRootOrIntermediate
ServerType = "GeneralPurposeServer"
DependsOn = $Depends
}
@@ -456,7 +474,7 @@ Configuration ArcGISServer
$Depends += "[ArcGIS_Server_RegisterDirectories]Server$($Node.NodeName)RegisterDirectories"
}
- if($ServerRole -ieq "GeoEvent")
+ if($ServerRole -ieq "GeoEvent" -or ($ServerRole -ieq "GeneralPurposeServer" -and $AdditionalServerRoles -icontains "GeoEvent"))
{
#This condition is an issue
ArcGIS_Service_Account GeoEvent_RunAs_Account
@@ -584,7 +602,7 @@ Configuration ArcGISServer
}
}
- if($ServerRole -ieq "WorkflowManagerServer")
+ if($ServerRole -ieq "WorkflowManagerServer" -or ($ServerRole -ieq "GeneralPurposeServer" -and $AdditionalServerRoles -icontains "WorkflowManagerServer"))
{
#This condition is an issue
ArcGIS_Service_Account WorkflowManager_RunAs_Account
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISServerSettings.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISServerSettings.ps1
index 5e8b7916..ac65ca18 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISServerSettings.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISServerSettings.ps1
@@ -19,16 +19,12 @@ Configuration ArcGISServerSettings{
[Parameter(Mandatory=$false)]
[System.String]
- $InternalLoadBalancer,
-
- [Parameter(Mandatory=$false)]
- [System.Boolean]
- $IsWorkflowManagerDeployment = $False
+ $InternalLoadBalancer
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_ServerSettings
Node $AllNodes.NodeName
@@ -39,7 +35,7 @@ Configuration ArcGISServerSettings{
CertificateId = $Node.Thumbprint
}
}
- $Depends = @()
+
if($Node.NodeName -ieq $PrimaryServerMachine){
ArcGIS_ServerSettings ServerSettings
{
@@ -50,7 +46,6 @@ Configuration ArcGISServerSettings{
ServerEndPoint = if($InternalLoadBalancer){ $InternalLoadBalancer }else{ if($ExternalDNSHostName){ $ExternalDNSHostName }else{ $null } }
ServerEndPointPort = if($InternalLoadBalancer){ 6443 }else{ 443 }
ServerEndPointContext = if($InternalLoadBalancer){ 'arcgis' }else{ $ServerContext }
- IsWorkflowManagerDeployment = if($IsWorkflowManagerDeployment){ $True }else{ $False }
}
}
}
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISUninstall.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISUninstall.ps1
index 552d6d01..bae8e59a 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISUninstall.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISUninstall.ps1
@@ -14,7 +14,7 @@ Configuration ArcGISUninstall
$ServiceCredentialIsMSA = $false
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_Install
Import-DscResource -Name ArcGIS_FileShare
Import-DscResource -Name ArcGIS_InstallMsiPackage
@@ -47,7 +47,7 @@ Configuration ArcGISUninstall
$ServerTypeName = if($ConfigurationData.ConfigData.ServerRole -ieq "NotebookServer" -or $ConfigurationData.ConfigData.ServerRole -ieq "MissionServer" ){ $ConfigurationData.ConfigData.ServerRole }else{ "Server" }
if($ServerTypeName -ieq "Server"){
- if($ConfigurationData.ConfigData.WorkflowMangerServer)
+ if($ConfigurationData.ConfigData.WorkflowManagerServer)
{
ArcGIS_Install WorkflowManagerServerUninstall
{
@@ -221,4 +221,4 @@ Configuration ArcGISUninstall
}
}
}
-}
\ No newline at end of file
+}
diff --git a/Modules/ArcGIS/Configurations-OnPrem/ArcGISWebAdaptor.ps1 b/Modules/ArcGIS/Configurations-OnPrem/ArcGISWebAdaptor.ps1
index 7418096c..4dffc1f6 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/ArcGISWebAdaptor.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/ArcGISWebAdaptor.ps1
@@ -24,7 +24,7 @@ Configuration ArcGISWebAdaptor
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_xFirewall
Import-DscResource -Name ArcGIS_IIS_TLS
Import-DscResource -Name ArcGIS_WebAdaptor
diff --git a/Modules/ArcGIS/Configurations-OnPrem/PublishGISService.ps1 b/Modules/ArcGIS/Configurations-OnPrem/PublishGISService.ps1
index 6b85501f..349fbaf5 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/PublishGISService.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/PublishGISService.ps1
@@ -35,7 +35,7 @@ Configuration PublishGISService
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_Server_Service
Node $AllNodes.NodeName
diff --git a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradeConfigure.ps1 b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradeConfigure.ps1
index 89a3cf0a..94991144 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradeConfigure.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradeConfigure.ps1
@@ -17,7 +17,7 @@ Configuration DataStoreUpgradeConfigure{
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_DataStoreUpgrade
Node $AllNodes.NodeName {
diff --git a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradeInstall.ps1 b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradeInstall.ps1
index c3cacf1f..5e0c376f 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradeInstall.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradeInstall.ps1
@@ -16,6 +16,12 @@ Configuration DataStoreUpgradeInstall{
[System.String]
$InstallerPath,
+
+ [System.String]
+ $PatchesDir,
+
+ [System.Array]
+ $PatchInstallOrder,
[System.String]
$InstallDir,
@@ -26,8 +32,9 @@ Configuration DataStoreUpgradeInstall{
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_Install
+ Import-DscResource -Name ArcGIS_InstallPatch
Import-DscResource -Name ArcGIS_DataStoreUpgrade
Import-DscResource -Name ArcGIS_xFirewall
@@ -60,6 +67,18 @@ Configuration DataStoreUpgradeInstall{
}
$Depends += '[ArcGIS_Install]DataStoreUpgrade'
+ if ($PatchesDir) {
+ ArcGIS_InstallPatch DatastoreInstallPatch
+ {
+ Name = "DataStore"
+ Version = $Version
+ PatchesDir = $PatchesDir
+ PatchInstallOrder = $PatchInstallOrder
+ Ensure = "Present"
+ }
+ $Depends += "[ArcGIS_InstallPatch]DatastoreInstallPatch"
+ }
+
# Fix for BDS Not Upgrading Bug - Setup needs to run as local account system
# But in that case it cannot access (C:\Windows\System32\config\systemprofile\AppData\Local)
if(($MajorVersion -lt 8) -and -not(($MajorVersion -eq 7) -and ($MinorVersion -eq 1)))
diff --git a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradePreInstall.ps1 b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradePreInstall.ps1
index ef0ace8b..afa0d4c8 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradePreInstall.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/DataStoreUpgradePreInstall.ps1
@@ -7,7 +7,7 @@ Configuration DataStoreUpgradePreInstall
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Node $AllNodes.NodeName {
diff --git a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/InsightsUpgradeInstall.ps1 b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/InsightsUpgradeInstall.ps1
index 1b425b41..9346e3ca 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/InsightsUpgradeInstall.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/InsightsUpgradeInstall.ps1
@@ -6,6 +6,12 @@ Configuration InsightsUpgradeInstall{
[System.String]
$InstallerPath,
+ [System.String]
+ $PatchesDir,
+
+ [System.Array]
+ $PatchInstallOrder = $null,
+
[parameter(Mandatory = $true)]
[System.Management.Automation.PSCredential]
$ServiceAccount,
@@ -23,8 +29,9 @@ Configuration InsightsUpgradeInstall{
$EnableMSILogging = $false
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_Install
+ Import-DscResource -Name ArcGIS_InstallPatch
Node $AllNodes.NodeName
{
@@ -47,5 +54,17 @@ Configuration InsightsUpgradeInstall{
EnableMSILogging = $EnableMSILogging
Ensure = "Present"
}
+
+ if ($PatchesDir) {
+ ArcGIS_InstallPatch ServerInstallPatch
+ {
+ Name = "Insights"
+ Version = $Version
+ PatchesDir = $PatchesDir
+ PatchInstallOrder = $PatchInstallOrder
+ Ensure = "Present"
+ DependsOn = @("[ArcGIS_Install]InsightsInstall")
+ }
+ }
}
}
\ No newline at end of file
diff --git a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/InsightsUpgradeUninstall.ps1 b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/InsightsUpgradeUninstall.ps1
index 2e998111..0a296ca1 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/InsightsUpgradeUninstall.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/InsightsUpgradeUninstall.ps1
@@ -4,7 +4,7 @@ Configuration InsightsUpgradeUninstall{
$Version
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_Install
Node $AllNodes.NodeName
diff --git a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalPostUpgradeV2.ps1 b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalPostUpgradeV2.ps1
index 7e495f6b..dc43d8c0 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalPostUpgradeV2.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalPostUpgradeV2.ps1
@@ -15,7 +15,7 @@ Configuration PortalPostUpgradeV2 {
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_PortalUpgrade
Node $AllNodes.NodeName {
diff --git a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeStandbyJoinV1.ps1 b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeStandbyJoinV1.ps1
index 61a51d46..e8173732 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeStandbyJoinV1.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeStandbyJoinV1.ps1
@@ -29,7 +29,7 @@ Configuration PortalUpgradeStandbyJoinV1{
$AdminSecurityAnswer,
[Parameter(Mandatory=$False)]
- [ValidateSet("AzureFiles","AzureBlob")]
+ [ValidateSet("AzureFiles","AzureBlob","AWSS3DynamoDB")]
[AllowNull()]
[System.String]
$CloudStorageType,
@@ -40,35 +40,47 @@ Configuration PortalUpgradeStandbyJoinV1{
[System.String]
$CloudNamespace,
+ [System.String]
+ $AWSRegion,
+
[Parameter(Mandatory=$False)]
[System.Management.Automation.PSCredential]
$CloudStorageCredentials
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_Portal
- if(($null -ne $CloudStorageType) -and $CloudStorageCredentials)
+ if($null -ne $CloudStorageType)
{
- $AccountName = $StorageAccountCredential.UserName
- $EndpointSuffix = ''
- $Pos = $StorageAccountCredential.UserName.IndexOf('.blob.')
- if($Pos -gt -1) {
- $AccountName = $StorageAccountCredential.UserName.Substring(0, $Pos)
- $EndpointSuffix = $StorageAccountCredential.UserName.Substring($Pos + 6) # Remove the hostname and .blob. suffix to get the storage endpoint suffix
- $EndpointSuffix = ";EndpointSuffix=$($EndpointSuffix)"
- }
-
- if($CloudStorageType -ieq 'AzureFiles') {
- $AzureFilesEndpoint = if($Pos -gt -1){$StorageAccountCredential.UserName.Replace('.blob.','.file.')}else{$StorageAccountCredential.UserName}
- $AzureFileShareName = $AzureFileShareName.ToLower() # Azure file shares need to be lower case
- $ContentDirectoryLocation = "\\$($AzureFilesEndpoint)\$AzureFileShareName\$($CloudNamespace)\portal\content"
- }
- else {
- $AccountKey = $StorageAccountCredential.GetNetworkCredential().Password
- $ContentDirectoryCloudConnectionString = "DefaultEndpointsProtocol=https;AccountName=$($AccountName);AccountKey=$($AccountKey)$($EndpointSuffix)"
- $ContentDirectoryCloudContainerName = "arcgis-portal-content-$($CloudNamespace)-portal"
+ if($CloudStorageType -ieq 'AWSS3DynamoDB') {
+ $ContentDirectoryCloudConnectionString = "NAMESPACE=$($CloudNamespace);REGION=$($AWSRegion);"
+ if($null -ne $CloudStorageCredentials){
+ $ContentDirectoryCloudConnectionString += "ACCESS_KEY_ID=$($CloudStorageCredentials.UserName);SECRET_KEY=$($CloudStorageCredentials.UserName)"
+ }
+ }else{
+ if($null -ne $CloudStorageCredentials){
+ $AccountName = $CloudStorageCredentials.UserName
+ $EndpointSuffix = ''
+ $Pos = $CloudStorageCredentials.UserName.IndexOf('.blob.')
+ if($Pos -gt -1) {
+ $AccountName = $CloudStorageCredentials.UserName.Substring(0, $Pos)
+ $EndpointSuffix = $CloudStorageCredentials.UserName.Substring($Pos + 6) # Remove the hostname and .blob. suffix to get the storage endpoint suffix
+ $EndpointSuffix = ";EndpointSuffix=$($EndpointSuffix)"
+ }
+
+ if($CloudStorageType -ieq 'AzureFiles') {
+ $AzureFilesEndpoint = if($Pos -gt -1){$CloudStorageCredentials.UserName.Replace('.blob.','.file.')}else{$CloudStorageCredentials.UserName}
+ $AzureFileShareName = $AzureFileShareName.ToLower() # Azure file shares need to be lower case
+ $ContentDirectoryLocation = "\\$($AzureFilesEndpoint)\$AzureFileShareName\$($CloudNamespace)\portal\content"
+ }
+ else {
+ $AccountKey = $CloudStorageCredentials.GetNetworkCredential().Password
+ $ContentDirectoryCloudConnectionString = "DefaultEndpointsProtocol=https;AccountName=$($AccountName);AccountKey=$($AccountKey)$($EndpointSuffix)"
+ $ContentDirectoryCloudContainerName = "arcgis-portal-content-$($CloudNamespace)portal"
+ }
+ }
}
}
diff --git a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeV1.ps1 b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeV1.ps1
index 988d7da1..7b4baec4 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeV1.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeV1.ps1
@@ -20,6 +20,14 @@ Configuration PortalUpgradeV1{
[System.String]
$InstallerPath,
+ [parameter(Mandatory = $false)]
+ [System.String]
+ $PatchesDir,
+
+ [parameter(Mandatory = $false)]
+ [System.Array]
+ $PatchInstallOrder,
+
[parameter(Mandatory = $false)]
[System.String]
$InstallDir,
@@ -91,8 +99,9 @@ Configuration PortalUpgradeV1{
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
- Import-DscResource -Name ArcGIS_Install
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
+ Import-DscResource -Name ArcGIS_Install
+ Import-DscResource -Name ArcGIS_InstallPatch
Import-DscResource -Name ArcGIS_License
Import-DscResource -Name ArcGIS_Service_Account
Import-DscResource -Name ArcGIS_Portal
@@ -145,6 +154,18 @@ Configuration PortalUpgradeV1{
}
$Depends += '[ArcGIS_Install]PortalUpgrade'
+ if ($PatchesDir) {
+ ArcGIS_InstallPatch PortalInstallPatch
+ {
+ Name = "Portal"
+ Version = $Version
+ PatchesDir = $PatchesDir
+ PatchInstallOrder = $PatchInstallOrder
+ Ensure = "Present"
+ }
+ $Depends += "[ArcGIS_InstallPatch]PortalInstallPatch"
+ }
+
if($PortalLicenseFilePath)
{
ArcGIS_License PortalLicense
@@ -281,6 +302,18 @@ Configuration PortalUpgradeV1{
}
$Depends += "[ArcGIS_Install]PortalInstall"
+ if ($PatchesDir) {
+ ArcGIS_InstallPatch PortalInstallPatch
+ {
+ Name = "Portal"
+ Version = $Version
+ PatchesDir = $PatchesDir
+ PatchInstallOrder = $PatchInstallOrder
+ Ensure = "Present"
+ }
+ $Depends += "[ArcGIS_InstallPatch]PortalInstallPatch"
+ }
+
ArcGIS_License PortalLicense
{
LicenseFilePath = $Node.PortalLicenseFilePath
diff --git a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeV2.ps1 b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeV2.ps1
index 8056e90e..3859497b 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeV2.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/PortalUpgradeV2.ps1
@@ -12,6 +12,14 @@ Configuration PortalUpgradeV2{
[System.String]
$InstallerPath,
+ [parameter(Mandatory = $false)]
+ [System.String]
+ $PatchesDir,
+
+ [parameter(Mandatory = $false)]
+ [System.Array]
+ $PatchInstallOrder,
+
[parameter(Mandatory = $false)]
[System.String]
$WebStylesInstallerPath,
@@ -34,9 +42,10 @@ Configuration PortalUpgradeV2{
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_Install
Import-DscResource -Name ArcGIS_Service_Account
+ Import-DscResource -Name ArcGIS_InstallPatch
Node $AllNodes.NodeName {
if($Node.Thumbprint){
@@ -94,6 +103,18 @@ Configuration PortalUpgradeV2{
$Depends += '[ArcGIS_Install]WebStylesInstall'
}
+ if ($PatchesDir) {
+ ArcGIS_InstallPatch PortalInstallPatch
+ {
+ Name = "Portal"
+ Version = $Version
+ PatchesDir = $PatchesDir
+ PatchInstallOrder = $PatchInstallOrder
+ Ensure = "Present"
+ }
+ $Depends += "[ArcGIS_InstallPatch]PortalInstallPatch"
+ }
+
$DataDirsForPortal = @('HKLM:\SOFTWARE\ESRI\Portal for ArcGIS')
ArcGIS_Service_Account Portal_RunAs_Account
{
diff --git a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/ServerUpgrade.ps1 b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/ServerUpgrade.ps1
index c6d5564e..a7fc4453 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/ServerUpgrade.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/ServerUpgrade.ps1
@@ -22,14 +22,32 @@ Configuration ServerUpgrade{
$InstallerPath,
[System.String]
- $InstallDir,
+ $PatchesDir,
+
+ [System.Array]
+ $PatchInstallOrder,
+ [System.String]
+ $InstallDir,
+
[System.String]
$GeoEventServerInstaller,
+ [System.String]
+ $GeoEventServerPatchesDir,
+
+ [System.Array]
+ $GeoEventServerPatchInstallOrder,
+
[System.String]
$WorkflowManagerServerInstaller,
+ [System.String]
+ $WorkflowManagerServerPatchesDir,
+
+ [System.Array]
+ $WorkflowManagerServerPatchInstallOrder,
+
[System.Array]
$ContainerImagePaths,
@@ -57,7 +75,7 @@ Configuration ServerUpgrade{
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_Install
Import-DscResource -Name ArcGIS_License
Import-DscResource -Name ArcGIS_ServerUpgrade
@@ -65,6 +83,7 @@ Configuration ServerUpgrade{
Import-DscResource -Name ArcGIS_NotebookPostInstall
Import-DscResource -Name ArcGIS_MissionServerUpgrade
Import-DscResource -Name ArcGIS_xFirewall
+ Import-DscResource -Name ArcGIS_InstallPatch
Node $AllNodes.NodeName {
if($Node.Thumbprint){
@@ -84,7 +103,7 @@ Configuration ServerUpgrade{
$ServerTypeName = if($Node.ServerRole -ieq "NotebookServer"){ "NotebookServer" }elseif($Node.ServerRole -ieq "MissionServer"){ "MissionServer" }else{ "Server" }
- if($Node.ServerRole -ieq "GeoEvent"){
+ if($Node.ServerRole -ieq "GeoEvent" -or ($Node.ServerRole -ieq "GeneralPurposeServer" -and $Node.AdditionalServerRoles -icontains "GeoEvent")){
Service ArcGIS_GeoEvent_Service_Stop
{
Name = "ArcGISGeoEvent"
@@ -177,6 +196,18 @@ Configuration ServerUpgrade{
}
}
+ if ($PatchesDir) {
+ ArcGIS_InstallPatch ServerInstallPatch
+ {
+ Name = $ServerTypeName
+ Version = $Version
+ PatchesDir = $PatchesDir
+ PatchInstallOrder = $PatchInstallOrder
+ Ensure = "Present"
+ }
+ $Depends += "[ArcGIS_InstallPatch]ServerInstallPatch"
+ }
+
if((($MajorVersion -gt 8) -and $NotebookServerSamplesDataPath)){
ArcGIS_Install "NotebookServerSamplesData$($Node.NodeName)Upgrade"
{
@@ -194,7 +225,7 @@ Configuration ServerUpgrade{
$Depends += "[ArcGIS_Install]NotebookServerSamplesData$($Node.NodeName)Upgrade"
}
- if(($Node.ServerRole -ieq "GeoAnalytics") -and ($MajorVersion -gt 8) -and $IsMultiMachineServerSite){
+ if((($Node.ServerRole -ieq "GeoAnalytics") -or ($Node.ServerRole -ieq "GeneralPurposeServer" -and $Node.AdditionalServerRoles -icontains "GeoAnalytics")) -and ($MajorVersion -gt 8) -and $IsMultiMachineServerSite){
$GeoAnalyticsPorts = @("7077","12181","12182","12190")
ArcGIS_xFirewall GeoAnalytics_InboundFirewallRules
{
@@ -226,17 +257,46 @@ Configuration ServerUpgrade{
$Depends += '[ArcGIS_xFirewall]GeoAnalytics_OutboundFirewallRules'
}
- ArcGIS_License ServerLicense
- {
- LicenseFilePath = $Node.ServerLicenseFilePath
- LicensePassword = if($Node.ServerLicensePassword){ $Node.ServerLicensePassword }else{ $null }
- Ensure = "Present"
- Component = 'Server'
- ServerRole = $Node.ServerRole
- Force = $True
- DependsOn = $Depends
+ if($Node.ServerRole -ine "GeoEvent" -and $Node.ServerRole -ine "WorkflowManagerServer" -and $Node.ServerLicenseFilePath){
+ ArcGIS_License "ServerLicense$($Node.NodeName)"
+ {
+ LicenseFilePath = $Node.ServerLicenseFilePath
+ LicensePassword = if($Node.ServerLicensePassword){ $Node.ServerLicensePassword }else{ $null }
+ Ensure = "Present"
+ Component = 'Server'
+ ServerRole = $Node.ServerRole
+ AdditionalServerRoles = if($Node.ServerRole -ieq "GeneralPurposeServer" -and $Node.AdditionalServerRoles){ ( $Node.AdditionalServerRoles | Where-Object {$_ -ine 'GeoEvent' -and $_ -ine 'NotebookServer' -and $_ -ine 'WorkflowManagerServer' -and $_ -ine 'MissionServer'}) }else{ $null }
+ Force = $True
+ DependsOn = $Depends
+ }
+ $Depends += "[ArcGIS_License]ServerLicense$($Node.NodeName)"
+ }
+
+ if(($Node.ServerRole -ieq "GeoEvent" -or ($Node.ServerRole -ieq "GeneralPurposeServer" -and $Node.AdditionalServerRoles -icontains "GeoEvent")) -and $Node.GeoeventServerLicenseFilePath){
+ ArcGIS_License "GeoeventServerLicense$($Node.NodeName)"
+ {
+ LicenseFilePath = $Node.GeoeventServerLicenseFilePath
+ LicensePassword = $Node.GeoeventServerLicensePassword
+ Ensure = "Present"
+ Component = 'Server'
+ ServerRole = "GeoEvent"
+ Force = $True
+ }
+ $Depends += "[ArcGIS_License]GeoeventServerLicense$($Node.NodeName)"
+ }
+
+ if(($Node.ServerRole -ieq "WorkflowManagerServer" -or ($Node.ServerRole -ieq "GeneralPurposeServer" -and $Node.AdditionalServerRoles -icontains "WorkflowManagerServer")) -and $Node.WorkflowManagerServerLicenseFilePath){
+ ArcGIS_License "WorkflowManagerServerLicense$($Node.NodeName)"
+ {
+ LicenseFilePath = $Node.WorkflowManagerServerLicenseFilePath
+ LicensePassword = $Node.WorkflowManagerServerLicensePassword
+ Ensure = "Present"
+ Component = 'Server'
+ ServerRole = "WorkflowManagerServer"
+ Force = $True
+ }
+ $Depends += "[ArcGIS_License]WorkflowManagerServerLicense$($Node.NodeName)"
}
- $Depends += '[ArcGIS_License]ServerLicense'
if($ServerRole -ieq "NotebookServer"){
ArcGIS_NotebookServerUpgrade NotebookServerConfigureUpgrade{
@@ -251,7 +311,7 @@ Configuration ServerUpgrade{
if($IsServiceAccountMSA){
ArcGIS_NotebookPostInstall "NotebookPostInstall$($Node.NodeName)" {
- SiteName = 'arcgis'
+ SiteName = "arcgis"
ContainerImagePaths = $ContainerImagePaths
ExtractSamples = $false
DependsOn = $Depends
@@ -282,8 +342,8 @@ Configuration ServerUpgrade{
}
}
- #Upgrade GeoEvents
- if($Node.ServerRole -ieq "WorkflowManagerServer"){
+ #Upgrade Workflow Manager Server
+ if($Node.ServerRole -ieq "WorkflowManagerServer" -or ($Node.ServerRole -ieq "GeneralPurposeServer" -and $Node.AdditionalServerRoles -icontains "WorkflowManagerServer")){
$Depends += '[ArcGIS_ServerUpgrade]ServerConfigureUpgrade'
ArcGIS_Install WorkflowManagerServerUpgrade
@@ -300,10 +360,22 @@ Configuration ServerUpgrade{
DependsOn = $Depends
}
$Depends += "[ArcGIS_Install]WorkflowManagerServerUpgrade"
+
+ if ($WorkflowManagerServerPatchesDir) {
+ ArcGIS_InstallPatch WorkflowManagerServerPatches
+ {
+ Name = "WorkflowManagerServer"
+ Version = $Version
+ PatchesDir = $WorkflowManagerServerPatchesDir
+ PatchInstallOrder = $WorkflowManagerServerPatchInstallOrder
+ Ensure = "Present"
+ }
+ $Depends += "[ArcGIS_InstallPatch]WorkflowManagerServerPatches"
+ }
}
#Upgrade GeoEvents
- if($Node.ServerRole -ieq "GeoEvent"){
+ if($Node.ServerRole -ieq "GeoEvent" -or ($Node.ServerRole -ieq "GeneralPurposeServer" -and $Node.AdditionalServerRoles -icontains "GeoEvent")){
$Depends += '[ArcGIS_ServerUpgrade]ServerConfigureUpgrade'
ArcGIS_Install GeoEventServerUpgrade{
@@ -320,6 +392,18 @@ Configuration ServerUpgrade{
}
$Depends += "[ArcGIS_Install]GeoEventServerUpgrade"
+ if ($GeoEventServerPatchesDir) {
+ ArcGIS_InstallPatch GeoEventServerPatches
+ {
+ Name = "GeoEvent"
+ Version = $Version
+ PatchesDir = $GeoEventServerPatchesDir
+ PatchInstallOrder = $GeoEventServerPatchInstallOrder
+ Ensure = "Present"
+ }
+ $Depends += "[ArcGIS_InstallPatch]GeoEventServerPatches"
+ }
+
ArcGIS_xFirewall GeoEventService_Firewall
{
Name = "ArcGISGeoEventGateway"
diff --git a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/WebAdaptorUpgrade.ps1 b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/WebAdaptorUpgrade.ps1
index e344ea7e..dac3114a 100644
--- a/Modules/ArcGIS/Configurations-OnPrem/Upgrades/WebAdaptorUpgrade.ps1
+++ b/Modules/ArcGIS/Configurations-OnPrem/Upgrades/WebAdaptorUpgrade.ps1
@@ -15,6 +15,14 @@ Configuration WebAdaptorUpgrade{
[System.String]
$InstallerPath,
+
+ [parameter(Mandatory = $false)]
+ [System.String]
+ $PatchesDir,
+
+ [parameter(Mandatory = $false)]
+ [System.Array]
+ $PatchInstallOrder,
[System.String]
$ComponentHostName,
@@ -31,7 +39,7 @@ Configuration WebAdaptorUpgrade{
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
- Import-DSCResource -ModuleName @{ModuleName="ArcGIS";ModuleVersion="3.3.0"}
+ Import-DscResource -ModuleName ArcGIS -ModuleVersion 3.3.1
Import-DscResource -Name ArcGIS_Install
Import-DscResource -Name ArcGIS_WebAdaptor
@@ -52,6 +60,8 @@ Configuration WebAdaptorUpgrade{
$Context = $Node.ServerContext
}
+ $Depends = @()
+
ArcGIS_Install WebAdaptorUninstall
{
Name = $WebAdaptorRole
@@ -60,6 +70,7 @@ Configuration WebAdaptorUpgrade{
Arguments = "WEBSITE_ID=$($WebSiteId)"
Ensure = "Absent"
}
+ $Depends += '[ArcGIS_Install]WebAdaptorUninstall'
$MachineFQDN = (Get-FQDN $Node.NodeName)
$WAArguments = "/qn VDIRNAME=$($Context) WEBSITE_ID=$($WebSiteId)"
@@ -79,7 +90,21 @@ Configuration WebAdaptorUpgrade{
Arguments = $WAArguments
EnableMSILogging = $EnableMSILogging
Ensure = "Present"
- DependsOn = @('[ArcGIS_Install]WebAdaptorUninstall')
+ DependsOn = $Depends
+ }
+ $Depends += '[ArcGIS_Install]WebAdaptorInstall'
+
+ if($PatchesDir){
+ ArcGIS_InstallPatch WebAdaptorInstallPatch
+ {
+ Name = "WebAdaptor"
+ Version = $Version
+ PatchesDir = $PatchesDir
+ PatchInstallOrder = $PatchInstallOrder
+ Ensure = "Present"
+ DependsOn = $Depends
+ }
+ $Depends += '[ArcGIS_InstallPatch]WebAdaptorInstallPatch'
}
ArcGIS_WebAdaptor "Configure$($Component)-$($MachineFQDN)"
@@ -92,7 +117,7 @@ Configuration WebAdaptorUpgrade{
OverwriteFlag = $False
SiteAdministrator = $SiteAdministratorCredential
AdminAccessEnabled = $AdminAccessEnabled
- DependsOn = @('[ArcGIS_Install]WebAdaptorInstall')
+ DependsOn = $Depends
}
}
}
\ No newline at end of file
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/ArcGIS_EGDB.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/ArcGIS_EGDB.psm1
index 4e4dbf49..17760567 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/ArcGIS_EGDB.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/ArcGIS_EGDB.psm1
@@ -312,27 +312,34 @@ function Set-TargetResource
}
try {
- [string]$RealVersion = (Get-ArcGISProductDetails -ProductName "ArcGIS Server").Version
- Write-Verbose "RealVersion of ArcGIS Software Installed:- $RealVersion"
- $Version = $RealVersion.Split('.')[0] + '.' + $RealVersion.Split('.')[1]
- Write-Verbose "Product Version of ArcGIS Software Installed:- $Version"
-
- $DBType = if($IsPostgres){ "POSTGRESQL" }else{ "SQLSERVER" }
-
- $PythonScriptFileName = 'enable_enterprise_gdb.py'
- $PythonScriptPath = Join-Path "$env:ProgramFiles\WindowsPowerShell\Modules\ArcGIS\DSCResources\ArcGIS_EGDB" $PythonScriptFileName
- if(-not(Test-Path $PythonScriptPath)){
- throw "$PythonScriptPath not found"
+ $DBType = if($IsPostgres){ "POSTGRESQL" }else{ "SQLSERVER" }
+
+ $ServiceName = 'ArcGIS Server'
+ $RegKey = Get-EsriRegistryKeyForService -ServiceName $ServiceName
+ $RealVersion = (Get-ItemProperty -Path $RegKey -ErrorAction Ignore).RealVersion
+ $InstallDir =(Get-ItemProperty -Path $RegKey -ErrorAction Ignore).InstallDir
+ Write-Verbose "RealVersion of ArcGIS Software Installed:- $RealVersion"
+ $RealVersionArr = $RealVersion.Split(".")
+ $Version = $RealVersionArr[0] + '.' + $RealVersionArr[1]
+ $UsePython3 = ($RealVersion -eq "10.9.1")
+ if($UsePython3){
+ $PythonInstallDir = Join-Path $InstallDir "\\framework\\runtime\\ArcGIS\\bin\\Python\\envs\\arcgispro-py3"
+ }else{
+ $PythonInstallDir = (Get-ItemProperty -Path "HKLM:\SOFTWARE\ESRI\Python$($Version)").PythonDir
}
- $PythonInstallDir = (Get-ItemProperty -Path "HKLM:\SOFTWARE\ESRI\Python$($Version)").PythonDir
$PythonPath = ((Get-ChildItem -Path $PythonInstallDir -Filter 'python.exe' -Recurse -File) | Select-Object -First 1 -ErrorAction Ignore)
if($null -eq $PythonPath) {
- throw "Python27 not found on machine. Please install Python."
+ throw "Python not found on machine. Please install Python."
}
$PythonInterpreterPath = $PythonPath.FullName
if($EnableGeodatabase)
{
+ $PythonScriptFileName = if($UsePython3){'enable_enterprise_gdb_3x.py'}else{'enable_enterprise_gdb.py'}
+ $PythonScriptPath = Join-Path $PSScriptRoot $PythonScriptFileName
+ if(-not(Test-Path $PythonScriptPath)){
+ throw "$PythonScriptPath not found"
+ }
$LicenseFilePath = "$env:SystemDrive\Program Files\ESRI\License$($Version)\sysgen\keycodes"
if(-not (Test-Path $LicenseFilePath)) {
@@ -389,8 +396,8 @@ function Set-TargetResource
$OpFolder = $env:TEMP
$OpFile = "$($DatabaseServer)_$($DatabaseName)_$($DatabaseUserName).sde"
$SDEFile = Join-Path $OpFolder $OpFile
- $PythonScriptFileName = 'create_connection_file.py'
- $PythonScriptPath = Join-Path "$env:ProgramFiles\WindowsPowerShell\Modules\ArcGIS\DSCResources\ArcGIS_EGDB" $PythonScriptFileName
+ $PythonScriptFileName = if($UsePython3){'create_connection_file_3x.py'}else{'create_connection_file.py'}
+ $PythonScriptPath = Join-Path $PSScriptRoot $PythonScriptFileName
if(-not(Test-Path $PythonScriptPath)){
throw "$PythonScriptPath not found"
}
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/SqlServer_create_connection_file.py b/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/create_connection_file_3x.py
similarity index 74%
rename from Modules/ArcGIS/DSCResources/ArcGIS_EGDB/SqlServer_create_connection_file.py
rename to Modules/ArcGIS/DSCResources/ArcGIS_EGDB/create_connection_file_3x.py
index 763308fe..e5fd8304 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/SqlServer_create_connection_file.py
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/create_connection_file_3x.py
@@ -1,7 +1,7 @@
"""
-Name: SqlServer_create_connection_file.py
-Description: Creates a connection file to a SQL Server database as the input user credentials.
-Type SqlServer_create_connection_file.py -h or SqlServer_create_connection_file.py --help for usage
+Name: create_connection_file.py
+Description: Creates a connection file to a SQL Server or PostgreSQL database as the input user credentials.
+Type create_connection_file.py -h or create_connection_file.py --help for usage
Author: Esri
"""
@@ -15,6 +15,7 @@
# Define usage and versionparser = optparse.OptionParser(usage = "usage: %prog [Options]", version="%prog 1.0 for " + arcpy.GetInstallInfo()['Version'] )
#Define help and options
+parser.add_option ("--DBMS", dest="Database_type", type="choice", choices=['SQLSERVER', 'POSTGRESQL',''], default="", help="Type of enterprise DBMS: SQLSERVER OR POSTGRESQL.")
parser.add_option ("-s", dest="Server", type="string", default="", help="Geodatabase Server Name")
parser.add_option ("-d", dest="Database", type="string", default="", help="Geodatabase name")
parser.add_option ("-u", dest="UserName", type="string", default="", help="Geodatabase administrator username")
@@ -29,13 +30,13 @@
#Check if no system arguments (options) entered
if len(sys.argv) == 1:
- print "%s: error: %s\n" % (sys.argv[0], "No command options given")
+ print("%s: error: %s\n" % (sys.argv[0], "No command options given"))
parser.print_help()
sys.exit(3)
#Usage parameters for spatial database connection
- database_type = 'SQL_SERVER'
+ database_type = options.Database_type.upper()
instance = options.Server
account_authentication = 'DATABASE_AUTH'
username = options.UserName
@@ -44,22 +45,30 @@
opfolder = options.OutputFolder
opfile = options.OutputFile
+ if( database_type ==""):
+ print(" \n%s: error: \n%s\n" % (sys.argv[0], "DBMS type (--DBMS) must be specified."))
+ parser.print_help()
+ sys.exit(3)
+
+ if (database_type == "SQLSERVER"):
+ database_type = "SQL_SERVER"
+
Connection_File_Out_Folder = opfolder
Connection_File_Name = opfile
Connection_File_Name_full_path = Connection_File_Out_Folder + os.sep + Connection_File_Name
- print Connection_File_Out_Folder
- print Connection_File_Name
+ print(Connection_File_Out_Folder)
+ print(Connection_File_Name)
# Check for the egdb .sde file and delete it if present
arcpy.env.overwriteOutput=True
if os.path.exists(Connection_File_Name_full_path):
os.remove(Connection_File_Name_full_path)
- print "Creating egdb Database Connection File..."
+ print("Creating egdb Database Connection File...")
# Process: Create egdb Database Connection File...
# Usage: out_file_location, out_file_name, DBMS_TYPE, instance, database, account_authentication, username, password, save_username_password(must be true)
arcpy.CreateDatabaseConnection_management(out_folder_path=Connection_File_Out_Folder, out_name=Connection_File_Name, database_platform=database_type, instance=instance, database=database, account_authentication=account_authentication, username=username, password=password, save_user_pass="TRUE")
- for i in range(arcpy.GetMessageCount()):
+ for i in range(arcpy.GetMessageCount()):
if "000565" in arcpy.GetMessage(i): #Check if database connection was successful
arcpy.AddReturnMessage(i)
arcpy.AddMessage("Exiting!!")
@@ -71,6 +80,6 @@
except SystemExit as e:
if e.code == 2:
parser.usage = ""
- print "\n"
+ print("\n")
parser.print_help()
parser.exit(2)
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/SqlServer_enable_enterprise_gdb.py b/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/enable_enterprise_gdb_3x.py
similarity index 68%
rename from Modules/ArcGIS/DSCResources/ArcGIS_EGDB/SqlServer_enable_enterprise_gdb.py
rename to Modules/ArcGIS/DSCResources/ArcGIS_EGDB/enable_enterprise_gdb_3x.py
index 6c6eb6c2..628db5aa 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/SqlServer_enable_enterprise_gdb.py
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_EGDB/enable_enterprise_gdb_3x.py
@@ -1,7 +1,7 @@
"""
-Name: SqlServer_enable_enterprise_gdb.py
-Description: Creates a connection file to a SQL Server database as the input user credentials and enables an enterprise geodatabase.
-Type SqlServer_enable_enterprise_gdb.py -h or SqlServer_enable_enterprise_gdb.py --help for usage
+Name: enable_enterprise_gdb.py
+Description: Creates a connection file to a SQL Server or PostgreSQL database as the input user credentials and enables an enterprise geodatabase.
+Type enable_enterprise_gdb.py -h or enable_enterprise_gdb.py --help for usage
Author: Esri
"""
@@ -15,6 +15,7 @@
# Define usage and versionparser = optparse.OptionParser(usage = "usage: %prog [Options]", version="%prog 1.0 for " + arcpy.GetInstallInfo()['Version'] )
#Define help and options
+parser.add_option ("--DBMS", dest="Database_type", type="choice", choices=['SQLSERVER', 'POSTGRESQL',''], default="", help="Type of enterprise DBMS: SQLSERVER OR POSTGRESQL.")
parser.add_option ("-s", dest="Server", type="string", default="", help="Geodatabase Server Name")
parser.add_option ("-d", dest="Database", type="string", default="", help="Geodatabase name")
parser.add_option ("-u", dest="UserName", type="string", default="", help="Geodatabase administrator username")
@@ -27,32 +28,40 @@
(options, args) = parser.parse_args()
-#Check if no system arguments (options) entered
+ #Check if no system arguments (options) entered
if len(sys.argv) == 1:
- print "%s: error: %s\n" % (sys.argv[0], "No command options given")
+ print("%s: error: %s\n" % (sys.argv[0], "No command options given"))
parser.print_help()
sys.exit(3)
#Usage parameters for spatial database connection
- database_type = 'SQL_SERVER'
+ database_type = options.Database_type.upper()
instance = options.Server
account_authentication = 'DATABASE_AUTH'
- username = options.UserName
+ username = options.UserName.lower()
password = options.Password
- database = options.Database
+ database = options.Database.lower()
license = options.Authorization_file
-
+
+ if( database_type ==""):
+ print(" \n%s: error: \n%s\n" % (sys.argv[0], "DBMS type (--DBMS) must be specified."))
+ parser.print_help()
+ sys.exit(3)
+
if (license == ""):
- print " \n%s: error: \n%s\n" % (sys.argv[0], "Authorization file (-l) must be specified.")
+ print(" \n%s: error: \n%s\n" % (sys.argv[0], "Authorization file (-l) must be specified."))
parser.print_help()
sys.exit(3)
+ if (database_type == "SQLSERVER"):
+ database_type = "SQL_SERVER"
+
# Get the current product license
product_license=arcpy.ProductInfo()
if (license == ""):
- print " \n%s: error: %s\n" % (sys.argv[0], "Authorization file (-l) must be specified.")
+ print(" \n%s: error: %s\n" % (sys.argv[0], "Authorization file (-l) must be specified."))
parser.print_help()
sys.exit(3)
@@ -69,18 +78,18 @@
Connection_File_Name = Conn_File_NameT + ".sde"
Connection_File_Name_full_path = temp + os.sep + Conn_File_NameT + ".sde"
- print Connection_File_Name_full_path
+ print(Connection_File_Name_full_path)
# Check for the egdb .sde file and delete it if present
arcpy.env.overwriteOutput=True
if os.path.exists(Connection_File_Name_full_path):
os.remove(Connection_File_Name_full_path)
- print "Creating egdb Database Connection File..."
+ print("Creating egdb Database Connection File...")
# Process: Create egdb Database Connection File...
# Usage: out_file_location, out_file_name, DBMS_TYPE, instance, database, account_authentication, username, password, save_username_password(must be true)
arcpy.CreateDatabaseConnection_management(out_folder_path=temp, out_name=Connection_File_Name, database_platform=database_type, instance=instance, database=database, account_authentication=account_authentication, username=username, password=password, save_user_pass="TRUE")
- for i in range(arcpy.GetMessageCount()):
+ for i in range(arcpy.GetMessageCount()):
if "000565" in arcpy.GetMessage(i): #Check if database connection was successful
arcpy.AddReturnMessage(i)
arcpy.AddMessage("Exiting!!")
@@ -90,10 +99,10 @@
# Process: Enable geodatabase egdb...
try:
- print "Enabling Enterprise Geodatabase egdb..."
- print Connection_File_Name_full_path
- print license
- arcpy.EnableEnterpriseGeodatabase_management(Connection_File_Name_full_path, license)
+ print("Enabling Enterprise Geodatabase egdb...")
+ print(Connection_File_Name_full_path)
+ print(license)
+ arcpy.EnableEnterpriseGeodatabase_management(input_database=Connection_File_Name_full_path, authorization_file=license)
for i in range(arcpy.GetMessageCount()):
arcpy.AddReturnMessage(i)
except:
@@ -107,6 +116,6 @@
except SystemExit as e:
if e.code == 2:
parser.usage = ""
- print "\n"
+ print("\n")
parser.print_help()
parser.exit(2)
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_Federation/ArcGIS_Federation.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_Federation/ArcGIS_Federation.psm1
index a8450727..63696ba2 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_Federation/ArcGIS_Federation.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_Federation/ArcGIS_Federation.psm1
@@ -133,17 +133,17 @@ function Test-TargetResource
$ServerSiteAdminUrl = "https://$($ServerSiteAdminUrlHostName)/$ServerSiteAdminUrlContext"
}
$ServerHostName = $ServerSiteAdminUrlHostName
- $ServerContext = $ServerSiteAdminUrlContext
+ $PortalFQDN = Get-FQDN $PortalHostName
- [System.Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null
- Write-Verbose "Get Portal Token from Deployment '$PortalHostName'"
- $Referer = "https://$($PortalHostName):$($PortalPort)/$PortalContext"
+ [System.Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null
+ Write-Verbose "Get Portal Token from Deployment '$PortalFQDN'"
+ $Referer = "https://$($PortalFQDN):$($PortalPort)/$PortalContext"
$waitForToken = $true
$waitForTokenCounter = 0
while ($waitForToken -and $waitForTokenCounter -lt 25) {
$waitForTokenCounter++
try{
- $token = Get-PortalToken -PortalHostName $PortalHostName -Port $PortalPort -SiteName $PortalContext -Credential $RemoteSiteAdministrator -Referer $Referer
+ $token = Get-PortalToken -PortalHostName $PortalFQDN -Port $PortalPort -SiteName $PortalContext -Credential $RemoteSiteAdministrator -Referer $Referer
} catch {
Write-Verbose "Error getting Token for Federation ! Waiting for 1 Minutes to try again"
Start-Sleep -Seconds 60
@@ -153,13 +153,13 @@ function Test-TargetResource
}
}
if(-not($token.token)) {
- throw "Unable to retrieve Portal Token for '$($RemoteSiteAdministrator.UserName)' from Deployment '$PortalHostName'"
+ throw "Unable to retrieve Portal Token for '$($RemoteSiteAdministrator.UserName)' from Deployment '$PortalFQDN'"
}
Write-Verbose "Site Admin Url:- $ServerSiteAdminUrl Service Url:- $ServiceUrl"
$result = $false
- $fedServers = Get-FederatedServers -PortalHostName $PortalHostName -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
+ $fedServers = Get-FederatedServers -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
$fedServer = $fedServers.servers | Where-Object { $_.url -ieq $ServiceUrl -and $_.adminUrl -ieq $ServerSiteAdminUrl }
if($fedServer) {
Write-Verbose "Federated Server with Admin URL $ServerSiteAdminUrl already exists"
@@ -170,7 +170,7 @@ function Test-TargetResource
if($ServerRole -ieq "HOSTING_SERVER"){
if($result) {
- $servers = Get-RegisteredServersForPortal -PortalHostName $PortalHostName -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
+ $servers = Get-RegisteredServersForPortal -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
$server = $servers.servers | Where-Object { $_.isHosted -eq $true }
if(-not($server)) {
$result = $false
@@ -185,7 +185,7 @@ function Test-TargetResource
}
if($result) {
- $oauthApp = Get-OAuthApplication -PortalHostName $PortalHostName -SiteName $PortalContext -Token $token.token -Port $PortalPort -Referer $Referer
+ $oauthApp = Get-OAuthApplication -PortalHostName $PortalFQDN -SiteName $PortalContext -Token $token.token -Port $PortalPort -Referer $Referer
Write-Verbose "Current list of redirect Uris:- $($oauthApp.redirect_uris)"
$DesiredDomainForRedirect = "https://$($ServerHostName)"
if(-not($oauthApp.redirect_uris -icontains $DesiredDomainForRedirect)){
@@ -207,17 +207,53 @@ function Test-TargetResource
}
Write-Verbose "Server Function for federated server with id '$($fedServer.id)' :- $($fedServer.serverFunction)"
- if($fedServer.serverFunction -ine $ServerFunctions) {
- Write-Verbose "Server Functions for Federated Server with id '$($fedServer.id)' does not match desired value '$ServerFunctions'"
- $result = $false
+ # We will only allow adding server functions and not deleting them.
+ # This is to support any roles that might have been added by user after federation.
+ $ServerFunctionFlag = $false
+ $ExpectedServerFunctionsArray = @()
+ $ServerFunctionsArray = $ServerFunctions.Split(',')
+
+ $ExistingServerFunctionArray = ($fedServer.serverFunction).Split(',')
+ foreach($sf in $ExistingServerFunctionArray){
+ if($sf -ine "GeneralPurposeServer"){
+ $ExpectedServerFunctionsArray += $sf
+ }else{
+ $ServerFunctionFlag = $true
+ }
+ }
+
+ $ServerFunctionsArray = $ServerFunctions.Split(',')
+ foreach($sf in $ServerFunctionsArray){
+ if($sf -ine "GeneralPurposeServer"){
+ if($ExpectedServerFunctionsArray -icontains $sf){
+ # Nothing to add already exists in updated array.
+ }else{
+ $ExpectedServerFunctionsArray += $sf
+ $ServerFunctionFlag = $true
+ }
+ }else{
+ #It is okay not to add it.
+ }
+ }
+
+ $serverFunctionsCompare = Compare-Object -ReferenceObject $ExpectedServerFunctionsArray -DifferenceObject $ExistingServerFunctionArray -PassThru
+ if($serverFunctionsCompare.Count -gt 0) {
+ if(-not($ServerFunctions)){
+ $ServerFunctions = $fedServer.serverFunction
+ }
+ Write-Verbose "Server Functions for Federated Server with id '$($fedServer.id)' does not contain desired value '$ServerFunctions'"
+ $ServerFunctionFlag = $true
}
else {
- Write-Verbose "Server Functions for Federated Server with id '$($fedServer.id)' matches desired value '$ServerFunctions'"
+ Write-Verbose "Server Functions for Federated Server with id '$($fedServer.id)' contains the desired value '$ServerFunctions'"
+ }
+ if($ServerFunctionFlag){
+ $result = $False
}
}
if($Ensure -ieq 'Present') {
- $result
+ $result
}
elseif($Ensure -ieq 'Absent') {
(-not($result))
@@ -304,14 +340,16 @@ function Set-TargetResource
$ServerHostName = $ServerSiteAdminUrlHostName
$ServerContext = $ServerSiteAdminUrlContext
- Write-Verbose "Get Portal Token from Deployment '$PortalHostName'"
- $Referer = "https://$($PortalHostName):$($PortalPort)/$PortalContext"
+ $PortalFQDN = Get-FQDN $PortalHostName
+
+ Write-Verbose "Get Portal Token from Deployment '$PortalFQDN'"
+ $Referer = "https://$($PortalFQDN):$($PortalPort)/$PortalContext"
$waitForToken = $true
$waitForTokenCounter = 0
while ($waitForToken -and $waitForTokenCounter -lt 25) {
$waitForTokenCounter++
try{
- $token = Get-PortalToken -PortalHostName $PortalHostName -Port $PortalPort -SiteName $PortalContext -Credential $RemoteSiteAdministrator -Referer $Referer
+ $token = Get-PortalToken -PortalHostName $PortalFQDN -Port $PortalPort -SiteName $PortalContext -Credential $RemoteSiteAdministrator -Referer $Referer
} catch {
Write-Verbose "Error getting Token for Federation ! Waiting for 1 Minutes to try again"
Start-Sleep -Seconds 60
@@ -321,13 +359,13 @@ function Set-TargetResource
}
}
if(-not($token.token)) {
- throw "Unable to retrieve Portal Token for '$($RemoteSiteAdministrator.UserName)' from Deployment '$PortalHostName'"
+ throw "Unable to retrieve Portal Token for '$($RemoteSiteAdministrator.UserName)' from Deployment '$PortalFQDN'"
}
Write-Verbose "Site Admin Url:- $ServerSiteAdminUrl Service Url:- $ServiceUrl"
if($Ensure -eq "Present"){
- $fedServers = Get-FederatedServers -PortalHostName $PortalHostName -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
+ $fedServers = Get-FederatedServers -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
$fedServer = $fedServers.servers | Where-Object { $_.url -ieq $ServiceUrl -and $_.adminUrl -ieq $ServerSiteAdminUrl }
if($ServerRole -ieq "HOSTING_SERVER"){
if(-not($fedServer) -or ($fedServer.serverRole -ine 'HOSTING_SERVER')){
@@ -338,29 +376,29 @@ function Set-TargetResource
if($existingFedServer.url -ine $ServiceUrl) {
Write-Verbose "Server with admin URL $ServerSiteAdminUrl already exits, but its public URL '$($existingFedServer.url)' does match expected '$ServiceUrl'"
try {
- $resp = Invoke-UnFederateServer -PortalHostName $PortalHostName -SiteName $PortalContext -Port $PortalPort -ServerID $existingFedServer.id -Token $token.token -Referer $Referer
+ $resp = Invoke-UnFederateServer -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -ServerID $existingFedServer.id -Token $token.token -Referer $Referer
if($resp.error) {
Write-Verbose "[ERROR]:- UnFederation returned error. Error:- $($resp.error)"
}else {
Write-Verbose 'UnFederation succeeded'
}
- }catch {
+ } catch {
Write-Verbose "Error during unfederate operation. Error:- $_"
}
Write-Verbose "Unfederate Operation causes a web server restart. Waiting for portaladmin endpoint to come back up"
- Wait-ForUrl -Url "https://$($PortalHostName):$($PortalPort)/$($PortalContext)/portaladmin/" -MaxWaitTimeInSeconds 180 -HttpMethod 'GET'
+ Wait-ForUrl -Url "https://$($PortalFQDN):$($PortalPort)/$($PortalContext)/portaladmin/" -MaxWaitTimeInSeconds 180 -HttpMethod 'GET'
}
}
}
}
- if(-not($fedServer)) {
+ if(-not($fedServer)) {
Write-Verbose "Federated Server with Admin URL $ServerSiteAdminUrl does not exist"
[bool]$Done = $false
[int]$NumOfAttempts = 0
while(($Done -eq $false) -and ($NumOfAttempts -lt 3))
{
- $resp = Invoke-FederateServer -PortalHostName $PortalHostName -SiteName $PortalContext -Port $PortalPort -PortalToken $token.token -Referer $Referer `
+ $resp = Invoke-FederateServer -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -PortalToken $token.token -Referer $Referer `
-ServerServiceUrl $ServiceUrl -ServerAdminUrl $ServerSiteAdminUrl -ServerAdminCredential $SiteAdministrator
if($resp.error) {
Write-Verbose "[ERROR]:- Federation returned error. Error:- $($resp.error)"
@@ -384,58 +422,105 @@ function Set-TargetResource
}
if($ServerRole -ine "HOSTING_SERVER"){
- $oauthApp = Get-OAuthApplication -PortalHostName $PortalHostName -SiteName $PortalContext -Token $token.token -Port $PortalPort -Referer $Referer
+ $oauthApp = Get-OAuthApplication -PortalHostName $PortalFQDN -SiteName $PortalContext -Token $token.token -Port $PortalPort -Referer $Referer
$DesiredDomainForRedirect = "https://$($ServerHostName)"
Write-Verbose "Current list of redirect Uris:- $($oauthApp.redirect_uris)"
if(-not($oauthApp.redirect_uris -icontains $DesiredDomainForRedirect)){
Write-Verbose "Redirect Uri for $DesiredDomainForRedirect does not exist. Adding it"
$oauthApp.redirect_uris += $DesiredDomainForRedirect
Write-Verbose "Updated list of redirect Uris:- $($oauthApp.redirect_uris)"
- Update-OAuthApplication -PortalHostName $PortalHostName -SiteName $PortalContext -Token $token.token -Port $PortalPort -Referer $Referer -AppObject $oauthApp
+ Update-OAuthApplication -PortalHostName $PortalFQDN -SiteName $PortalContext -Token $token.token -Port $PortalPort -Referer $Referer -AppObject $oauthApp
}else {
Write-Verbose "Redirect Uri for $DesiredDomainForRedirect exists as required"
}
}
- if($ServerFunctions -or $ServerRole) {
- if(-not($fedServer)) {
- $fedServers = Get-FederatedServers -PortalHostName $PortalHostName -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
- $fedServer = $fedServers.servers | Where-Object { $_.url -ieq $ServiceUrl -and $_.adminUrl -ieq $ServerSiteAdminUrl }
- }
-
+ if($ServerRole){
+ $fedServers = Get-FederatedServers -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
+ $fedServer = $fedServers.servers | Where-Object { $_.url -ieq $ServiceUrl -and $_.adminUrl -ieq $ServerSiteAdminUrl }
if($fedServer) {
- Write-Verbose "Server Function for federated server with id '$($fedServer.id)' :- $($fedServer.serverFunction)"
Write-Verbose "Server Role for federated server with id '$($fedServer.id)' :- $($fedServer.serverRole)"
- $ServerFunctionFlag = $False
- if($fedServer.serverFunction -ine $ServerFunctions) {
- Write-Verbose "Server Functions for Federated Server with id '$($fedServer.id)' does not match desired value '$ServerFunctions'"
- $ServerFunctionFlag = $true
- if(-not($ServerFunctions)){
- $ServerFunctions = $fedServer.serverFunction
- }
- }
- else {
- Write-Verbose "Server Functions for Federated Server with id '$($fedServer.id)' matches desired value '$ServerFunctions'"
- }
-
$ServerRoleFlag = $False
if($fedServer.serverRole -ine $ServerRole) {
- Write-Verbose "Server Role for Federated Server with id '$($fedServer.id)' does not match desired value '$ServerRole'"
- $ServerRoleFlag = $true
if(-not($ServerRole)){
$ServerRole = $fedServer.serverRole
}
+ Write-Verbose "Server Role for Federated Server with id '$($fedServer.id)' does not match desired value '$ServerRole'"
+ $ServerRoleFlag = $true
}else{
Write-Verbose "Server Role for Federated Server with id '$($fedServer.id)' matches desired value '$ServerRole'"
}
+
+ if($ServerRoleFlag){
+ Write-Verbose "Updating Server Role in Portal"
+ try{
+ $response = Update-FederatedServer -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer `
+ -ServerId $fedServer.id -ServerRole $ServerRole -ServerFunction $fedServer.serverFunction
+ if($response.error) {
+ throw "[WARNING]:- Update operation did not succeed. Error:- $($response.error)"
+ }elseif($response.status -ieq "success"){
+ Write-Verbose "Server Role for Federated Server with id '$($fedServer.id)' was updated to '$ServerRole'"
+ }
+ }catch{
+ throw $_
+ }
+ }
+ }
+ }
+
+ if($ServerFunctions) {
+ $fedServers = Get-FederatedServers -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
+ $fedServer = $fedServers.servers | Where-Object { $_.url -ieq $ServiceUrl -and $_.adminUrl -ieq $ServerSiteAdminUrl }
+ if($fedServer) {
+ Write-Verbose "Server Function for federated server with id '$($fedServer.id)' :- $($fedServer.serverFunction)"
+
+ # We will only allow adding server functions and not deleting them.
+ # This is to support any roles that might have been added by user after federation.
+ $ServerFunctionFlag = $false
+ $ExpectedServerFunctionsArray = @()
+ $ServerFunctionsArray = $ServerFunctions.Split(',')
- if($ServerRoleFlag -or $ServerFunctionFlag){
- Write-Verbose "Updating Portal"
+ $ExistingServerFunctionArray = ($fedServer.serverFunction).Split(',')
+ foreach($sf in $ExistingServerFunctionArray){
+ if($sf -ine "GeneralPurposeServer"){
+ $ExpectedServerFunctionsArray += $sf
+ }else{
+ #Will Remove General Purpose Server if it exists
+ $ServerFunctionFlag = $true
+ }
+ }
+
+ foreach($sf in $ServerFunctionsArray){
+ if($sf -ine "GeneralPurposeServer"){
+ if($ExpectedServerFunctionsArray -icontains $sf){
+ # Nothing to add already exists in updated array.
+ }else{
+ $ExpectedServerFunctionsArray += $sf
+ $ServerFunctionFlag = $true
+ }
+ }else{
+ #We will not add General Purpose Server.
+ }
+ }
+
+ $serverFunctionsCompare = Compare-Object -ReferenceObject $ExpectedServerFunctionsArray -DifferenceObject $ExistingServerFunctionArray -PassThru
+ if($serverFunctionsCompare.Count -gt 0) {
+ if(-not($ServerFunctions)){
+ $ServerFunctions = $fedServer.serverFunction
+ }
+ Write-Verbose "Server Functions for Federated Server with id '$($fedServer.id)' does not match desired value '$ServerFunctions'"
+ $ServerFunctionFlag = $true
+ } else {
+ Write-Verbose "Server Functions for Federated Server with id '$($fedServer.id)' has the desired value '$ServerFunctions'"
+ }
+
+ if($ServerFunctionFlag){
+ Write-Verbose "Updating Server functions in Portal"
try{
- $response = Update-FederatedServer -PortalHostName $PortalHostName -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer `
- -ServerId $fedServer.id -ServerRole $ServerRole -ServerFunction $ServerFunctions
+ $response = Update-FederatedServer -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer `
+ -ServerId $fedServer.id -ServerRole $fedServer.serverRole -ServerFunction $ServerFunctions
if($response.error) {
- Write-Verbose "[WARNING]:- Update operation did not succeed. Error:- $($response.error)"
+ throw "[WARNING]:- Update operation did not succeed. Error:- $($response.error)"
}elseif($response.status -ieq "success"){
Write-Verbose "Server Role for Federated Server with id '$($fedServer.id)' was updated to '$ServerRole'"
}
@@ -447,22 +532,22 @@ function Set-TargetResource
# Hacky fix for Running Spatial Services.
if($IsMultiTierAzureBaseDeployment){
- $servers = Get-RegisteredServersForPortal -PortalHostName $PortalHostName -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
+ $servers = Get-RegisteredServersForPortal -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
$server = $servers.servers | Where-Object { $_.isHosted -eq $true }
if($server -and ($server.url -ieq $ServiceUrl)){
- Update-ServerAdminUrlForPortal -PortalHostName $PortalHostName -SiteName $PortalContext -PortalPort $PortalPort -Token $token.token -Referer $Referer -ServerAdminUrl "https://$($ServiceUrlHostName):$($ServiceUrlPort)/$ServiceUrlContext" -FederatedServer $server
+ Update-ServerAdminUrlForPortal -PortalHostName $PortalFQDN -SiteName $PortalContext -PortalPort $PortalPort -Token $token.token -Referer $Referer -ServerAdminUrl "https://$($ServiceUrlHostName):$($ServiceUrlPort)/$ServiceUrlContext" -FederatedServer $server
}
}
}
}elseif($Ensure -eq 'Absent') {
$ServerHttpsUrl = "https://$($ServerHostName):$($ServerSiteAdminUrlPort)/"
- $fedServers = Get-FederatedServers -PortalHostName $PortalHostName -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
+ $fedServers = Get-FederatedServers -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -Token $token.token -Referer $Referer
$fedServer = $fedServers.servers | Where-Object { $_.url -ieq $ServiceUrl -and $_.adminUrl -ieq $ServerSiteAdminUrl }
if($fedServer) {
Write-Verbose "Server with Admin URL $ServerSiteAdminUrl already exists"
try {
- $resp = Invoke-UnFederateServer -PortalHostName $PortalHostName -SiteName $PortalContext -Port $PortalPort -ServerID $fedServer.id -Token $token.token -Referer $Referer
+ $resp = Invoke-UnFederateServer -PortalHostName $PortalFQDN -SiteName $PortalContext -Port $PortalPort -ServerID $fedServer.id -Token $token.token -Referer $Referer
if($resp.error) {
Write-Verbose "[ERROR]:- UnFederation returned error. Error:- $($resp.error)"
}else {
@@ -484,7 +569,7 @@ function Set-TargetResource
Write-Verbose "Error during unfederate operation. Error:- $_"
}
Write-Verbose "Unfederate Operation causes a web server restart. Waiting for portaladmin endpoint to come back up"
- Wait-ForUrl -Url "https://$($PortalHostName):$($PortalPort)/$($PortalContext)/portaladmin/" -MaxWaitTimeInSeconds 180 -HttpMethod 'GET'
+ Wait-ForUrl -Url "https://$($PortalFQDN):$($PortalPort)/$($PortalContext)/portaladmin/" -MaxWaitTimeInSeconds 180 -HttpMethod 'GET'
}else{
Write-Verbose "Federated Server with Admin URL $ServerSiteAdminUrl doesn't exists"
}
@@ -726,7 +811,7 @@ function Update-FederatedServer
)
try{
- $response = Invoke-ArcGISWebRequest -Url ("https://$($PortalHostName):$Port/$($SiteName)/portaladmin/federation/servers/$($ServerId)/update") -HttpMethod 'POST' -HttpFormParameters @{ f = 'json'; token = $Token; serverRole = $ServerRole; serverFunction = $ServerFunction } -Referer $Referer -TimeOutSec 120 -Verbose
+ $response = Invoke-ArcGISWebRequest -Url ("https://$($PortalHostName):$Port/$($SiteName)/portaladmin/federation/servers/$($ServerId)/update") -HttpMethod 'POST' -HttpFormParameters @{ f = 'json'; token = $Token; serverRole = $ServerRole; serverFunction = $ServerFunction } -Referer $Referer -TimeOutSec 300 -Verbose
Write-Verbose ($response | ConvertTo-Json -Depth 5 -Compress)
$response
}catch{
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_Install/ArcGIS_Install.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_Install/ArcGIS_Install.psm1
index 02651c0d..700ea5c1 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_Install/ArcGIS_Install.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_Install/ArcGIS_Install.psm1
@@ -182,8 +182,12 @@ function Set-TargetResource
}
Write-Verbose "Extracting $Path to $TempFolder"
- Start-Process -FilePath $Path -ArgumentList "/s /d $TempFolder" -Wait -NoNewWindow
- Write-Verbose 'Done Extracting. Waiting 15 seconds to allow the extractor to close files'
+ $SetupExtractProc = (Start-Process -FilePath $Path -ArgumentList "/s /d $TempFolder" -Wait -NoNewWindow -Verbose -PassThru)
+ if($SetupExtractProc.ExitCode -ne 0){
+ throw "Error while extracting setup for '$ComponentName' at Path '$Path' :- exited with status code $($SetupExtractProc.ExitCode)"
+ }else{
+ Write-Verbose 'Done Extracting. Waiting 15 seconds to allow the extractor to close files'
+ }
Start-Sleep -Seconds 15
$SetupExe = Get-ChildItem -Path $TempFolder -Filter 'Setup.exe' -Recurse | Select-Object -First 1
@@ -359,7 +363,13 @@ function Set-TargetResource
$ProdIdObject = $ProdIdObject + '}'
}
Write-Verbose "msiexec /x ""$ProdIdObject"" /quiet"
- Start-Process 'msiexec' -ArgumentList "/x ""$ProdIdObject"" /quiet" -wait
+ $UninstallProc = (Start-Process -FilePath msiexec.exe -ArgumentList "/x ""$ProdIdObject"" /quiet" -Wait -Verbose -PassThru)
+ if($UninstallProc.ExitCode -ne 0){
+ throw "Error while uninstalling '$ComponentName' :- exited with status code $($UninstallProc.ExitCode)"
+ }else{
+ Write-Verbose "Uninstallation successful."
+ }
+
if($Name -ieq 'ServerWebAdaptor' -or $Name -ieq 'PortalWebAdaptor'){
Import-Module WebAdministration | Out-Null
$WebSiteId = 1
@@ -372,6 +382,20 @@ function Set-TargetResource
$IISWebSiteName = (Get-Website | Where-Object {$_.ID -eq $WebSiteId}).Name
Remove-WebConfigurationLocation -Name "$($IISWebSiteName)/$($WebAdaptorContext)"
}
+
+ if($ComponentName -ieq "Server"){
+ $ServerComponenetsInstalled = Get-ArcGISProductDetails -ProductName "ArcGIS Server"
+ foreach($ServerComponent in $ServerComponenetsInstalled){
+ Write-Verbose "Uninstalling '$($ServerComponent.Name)' with Product Id '$($ServerComponent.IdentifyingNumber)' "
+ Write-Verbose "msiexec /x ""$($ServerComponent.IdentifyingNumber)"" /quiet"
+ $UninstallServerCompProc = (Start-Process -FilePath msiexec.exe -ArgumentList "/x ""$($ServerComponent.IdentifyingNumber)"" /quiet" -Wait -Verbose -PassThru)
+ if($UninstallServerCompProc.ExitCode -ne 0){
+ throw "Error while uninstalling Server Component '$($ServerComponent.Name)' :- exited with status code $($UninstallServerCompProc.ExitCode)"
+ }else{
+ Write-Verbose "Uninstallation successful."
+ }
+ }
+ }
}
Write-Verbose "In Set-Resource for $Name"
}
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_InstallPatch/ArcGIS_InstallPatch.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_InstallPatch/ArcGIS_InstallPatch.psm1
index c881d3c5..97b73204 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_InstallPatch/ArcGIS_InstallPatch.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_InstallPatch/ArcGIS_InstallPatch.psm1
@@ -9,6 +9,8 @@
Name of ArcGIS Enterprise Component to be installed.
.PARAMETER PatchesDir
Path to Installer for patches for the Component - Can be a Physical Location or Network Share Address.
+ .PARAMETER PatchInstallOrder
+ Array of Patch Installer file names to specify the Installation order of Patch and the patches to install
.PARAMETER Version
Version of the Component being Installed.
#>
@@ -27,6 +29,10 @@ function Get-TargetResource
[System.String]
$PatchesDir,
+ [parameter(Mandatory = $false)]
+ [System.Array]
+ $PatchInstallOrder,
+
[parameter(Mandatory = $true)]
[System.String]
$Version,
@@ -58,6 +64,10 @@ function Set-TargetResource
[System.String]
$PatchesDir,
+ [parameter(Mandatory = $false)]
+ [System.Array]
+ $PatchInstallOrder,
+
[parameter(Mandatory = $true)]
[System.String]
$Version,
@@ -77,14 +87,36 @@ function Set-TargetResource
# test & install patches
Write-Verbose "Installing Patches"
if ($PatchesDir) {
- $files = Get-ChildItem "$PatchesDir"
- Foreach ($file in $files) {
- Write-Verbose " > PatchFile : $file | Fullname : $($file.Fullname)"
- if (Test-PatchInstalled -mspPath $($file.FullName)) {
- Write-Verbose " > Patch installed - no Action required"
- } else {
- Write-Verbose " > Patch not installed - installing"
- Install-Patch -mspPath $file.FullName
+ if($PatchInstallOrder.Length -gt 0){
+ foreach ($Patch in $PatchInstallOrder) {
+ $PatchFileName = Split-Path $Patch -leaf
+ $PatchLocation = (Join-Path $PatchesDir $PatchFileName)
+ Write-Verbose " > PatchFile : $PatchFileName | Fullname : $($PatchLocation)"
+ if (Test-PatchInstalled -mspPath $PatchLocation) {
+ Write-Verbose " > Patch installed - no Action required"
+ }else{
+ Write-Verbose " > Patch not installed - installing"
+ if(Install-Patch -mspPath $PatchLocation -Verbose){
+ Write-Verbose " > Patch installed - successfully"
+ }else{
+ Write-Verbose " > Patch installation failed"
+ }
+ }
+ }
+ }else{
+ $files = Get-ChildItem "$PatchesDir"
+ Foreach ($file in $files) {
+ Write-Verbose " > PatchFile : $file | Fullname : $($file.Fullname)"
+ if (Test-PatchInstalled -mspPath $($file.FullName)) {
+ Write-Verbose " > Patch installed - no Action required"
+ } else {
+ Write-Verbose " > Patch not installed - installing"
+ if(Install-Patch -mspPath $file.FullName -Verbose){
+ Write-Verbose " > Patch installed - successfully"
+ }else{
+ Write-Verbose " > Patch installation failed"
+ }
+ }
}
}
}
@@ -109,6 +141,10 @@ function Test-TargetResource
[System.String]
$PatchesDir,
+ [parameter(Mandatory = $false)]
+ [System.Array]
+ $PatchInstallOrder,
+
[parameter(Mandatory = $true)]
[System.String]
$Version,
@@ -182,14 +218,28 @@ function Test-TargetResource
#test for installed patches
if($result -and $PatchesDir) {
- $files = Get-ChildItem "$PatchesDir"
- Foreach ($file in $files) {
- Write-Verbose " > PatchFile : $file | Fullname : $($file.Fullname)"
- if (Test-PatchInstalled -mspPath $($file.FullName)) {
- Write-Verbose " > Patch installed"
- } else {
- Write-Verbose " > Patch not installed"
- $result = $false
+ if($PatchInstallOrder.Length -gt 0){
+ foreach ($Patch in $PatchInstallOrder) {
+ $PatchFileName = Split-Path $Patch -leaf
+ $PatchLocation = (Join-Path $PatchesDir $PatchFileName)
+ Write-Verbose " > PatchFile : $PatchFileName | Fullname : $($PatchLocation)"
+ if (Test-PatchInstalled -mspPath $PatchLocation) {
+ Write-Verbose " > Patch installed"
+ }else{
+ Write-Verbose " > Patch not installed"
+ $result = $false
+ }
+ }
+ }else{
+ $files = Get-ChildItem "$PatchesDir"
+ Foreach ($file in $files) {
+ Write-Verbose " > PatchFile : $file | Fullname : $($file.Fullname)"
+ if (Test-PatchInstalled -mspPath $($file.FullName)) {
+ Write-Verbose " > Patch installed"
+ } else {
+ Write-Verbose " > Patch not installed"
+ $result = $false
+ }
}
}
}
@@ -300,12 +350,25 @@ function Install-Patch{
$mspPath
)
- $arguments = "/update "+ '"' + $mspPath +'"' + " /quiet"
- Write-Verbose $arguments
- try {
- Start-Process -FilePath msiexec.exe -ArgumentList $Arguments -Wait
- } catch {
- Write-Verbose "Error in Install-Patch :-$_"
+ if(Test-Path $mspPath){
+ $arguments = "/update "+ '"' + $mspPath +'"' + " /quiet"
+ Write-Verbose $arguments
+ try {
+ $PatchInstallProc = Start-Process -FilePath msiexec.exe -ArgumentList $Arguments -Wait -Verbose -PassThru
+ if($PatchInstallProc.ExitCode -ne 0){
+ Write-Verbose "Error while installing patch :- exited with status code $($PatchInstallProc.ExitCode)"
+ return $false
+ }else{
+ Write-Verbose "Patch Installation successful."
+ return $true
+ }
+ } catch {
+ Write-Verbose "Error in Install-Patch :-$_"
+ return $false
+ }
+ }else{
+ Write-Verbose "Patch '$mspPath' path doesn't exist"
+ return $false
}
}
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_InstallPatch/ArcGIS_InstallPatch.schema.mof b/Modules/ArcGIS/DSCResources/ArcGIS_InstallPatch/ArcGIS_InstallPatch.schema.mof
index 398eee52..a9d0d6a3 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_InstallPatch/ArcGIS_InstallPatch.schema.mof
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_InstallPatch/ArcGIS_InstallPatch.schema.mof
@@ -4,6 +4,7 @@ class ArcGIS_InstallPatch : OMI_BaseResource
{
[Key] String Name;
[Write] String PatchesDir;
+ [Write] String PatchInstallOrder[];
[Key] String Version;
[Write] String ProductId;
[Write, ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure;
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_License/ArcGIS_License.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_License/ArcGIS_License.psm1
index 3f49127b..74c1f09b 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_License/ArcGIS_License.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_License/ArcGIS_License.psm1
@@ -15,6 +15,8 @@
Product being Licensed (Server or Portal)
.PARAMETER ServerRole
(Optional - Required only for Server) Server Role for which the product is being Licensed
+ .PARAMETER AdditionalServerRole
+ (Optional - Only valid for General Purpose Server) Additional Server Role for which the product is being Licensed
.PARAMETER IsSingleUse
Boolean to tell if Pro or Desktop is using Single Use License.
.PARAMETER Force
@@ -66,6 +68,10 @@ function Set-TargetResource
[System.String]
$ServerRole = 'GeneralPurposeServer',
+ [parameter(Mandatory = $False)]
+ [System.Array]
+ $AdditionalServerRoles,
+
[parameter(Mandatory = $false)]
[System.Boolean]
$IsSingleUse,
@@ -145,6 +151,10 @@ function Test-TargetResource
[System.String]
$ServerRole = 'GeneralPurposeServer',
+ [parameter(Mandatory = $False)]
+ [System.Array]
+ $AdditionalServerRoles,
+
[parameter(Mandatory = $false)]
[System.Boolean]
$IsSingleUse,
@@ -186,56 +196,61 @@ function Test-TargetResource
Write-Verbose "TODO:- Check for License Manger license. For now forcing Software Authorization Tool to License."
}
else {
- Write-Verbose "License Check Component:- $Component ServerRole:- $ServerRole"
+ Write-Verbose "License Check Component:- $Component"
$file = "$env:SystemDrive\Program Files\ESRI\License$($LicenseVersion)\sysgen\keycodes"
- if(Test-Path $file) {
+ if(-not($Force) -and (Test-Path $file)){
$searchtexts = @()
- $searchtext = if($RealVersion.StartsWith('10.4')) { 'server' } else { 'svr' }
if($Component -ieq 'Portal') {
+ $searchtext += 'portal_'
$searchtexts += 'portal1_'
$searchtexts += 'portal2_'
- $searchtext = 'portal_'
- }
- elseif($ServerRole -ieq 'ImageServer') {
- $searchtext = 'imgsvr'
- }
- elseif($ServerRole -ieq 'GeoEvent') {
- $searchtext = 'geoesvr'
- }
- elseif($ServerRole -ieq 'WorkflowManagerServer') {
- $searchtexts += 'workflowsvr_4'
- $searchtext = 'workflowsvr'
- }
- elseif($ServerRole -ieq 'GeoAnalytics') {
- $searchtext = 'geoasvr'
- }
- elseif($ServerRole -ieq 'NotebookServer') {
- $searchtexts += 'notebooksstdsvr'
- $searchtext = 'notebooksadvsvr'
+ }elseif($Component -ieq 'Server'){
+ Write-Verbose "ServerRole:- $ServerRole"
+ $searchtexts += if($RealVersion.StartsWith('10.4')) { 'server' } else { 'svr' }
+ if($ServerRole -ieq 'ImageServer' -or ($ServerRole -ieq "GeneralPurposeServer" -and $AdditionalServerRoles -icontains "ImageServer")) {
+ $searchtexts += 'imgsvr'
+ }
+ if($ServerRole -ieq 'GeoEvent' -or ($ServerRole -ieq "GeneralPurposeServer" -and $AdditionalServerRoles -icontains "GeoEvent")) {
+ $searchtexts += 'geoesvr'
+ }
+ if($ServerRole -ieq 'WorkflowManagerServer' -or ($ServerRole -ieq "GeneralPurposeServer" -and $AdditionalServerRoles -icontains "WorkflowManagerServer")) {
+ $searchtexts += 'workflowsvr_4'
+ $searchtexts += 'workflowsvr'
+ }
+ if($ServerRole -ieq 'GeoAnalytics' -or ($ServerRole -ieq "GeneralPurposeServer" -and $AdditionalServerRoles -icontains "GeoAnalytics")) {
+ $searchtexts += 'geoasvr'
+ }
+ if($ServerRole -ieq 'NotebookServer') {
+ $searchtexts += 'notebooksstdsvr'
+ $searchtexts += 'notebooksadvsvr'
+ }
+ if($ServerRole -ieq 'MissionServer') {
+ $searchtexts += 'missionsvr_4'
+ $searchtexts += 'missionsvr'
+ }
}
- elseif($ServerRole -ieq 'MissionServer') {
- $searchtexts += 'missionsvr_4'
- $searchtext = 'missionsvr'
- }
- $searchtexts += $searchtext
+
foreach($text in $searchtexts) {
Write-Verbose "Looking for text '$text' in $file"
- Get-Content $file | ForEach-Object {
- if($_ -and $_.ToString().StartsWith($text)) {
+ $result = $false
+ $KeyCodesFileContents = Get-Content $file
+ foreach($KeyCodeLine in $KeyCodesFileContents){
+ if($KeyCodeLine -and $KeyCodeLine.ToString().StartsWith($text)) {
Write-Verbose "Text '$text' found"
- if($force){
- $result = $false
- }else{
- $result = $true
- }
+ $result = $true
+ break
}
}
+ if($result -ieq $False){
+ Write-Verbose "Text '$text' not found"
+ break
+ }
}
}
}
if($Ensure -ieq 'Present') {
- $result
+ $result
}
elseif($Ensure -ieq 'Absent') {
(-not($result))
@@ -247,19 +262,19 @@ function Invoke-LicenseSoftware
[CmdletBinding()]
param
(
- [string]
+ [System.String]
$Product,
- [string]
- $ServerRole,
+ [System.String]
+ $ServerRole,
- [string]
+ [System.String]
$LicenseFilePath,
[System.Management.Automation.PSCredential]
$LicensePassword,
- [string]
+ [System.String]
$Version,
[System.Boolean]
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_License/ArcGIS_License.schema.mof b/Modules/ArcGIS/DSCResources/ArcGIS_License/ArcGIS_License.schema.mof
index 2522a58a..eccc9169 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_License/ArcGIS_License.schema.mof
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_License/ArcGIS_License.schema.mof
@@ -8,6 +8,7 @@ class ArcGIS_License : OMI_BaseResource
[Write, ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure;
[Write, ValueMap{"Server","Portal","Desktop","Pro","LicenseManager"}, Values{"Server","Portal","Desktop","Pro","LicenseManager"}] String Component;
[Write, ValueMap{"ImageServer","GeoEvent","GeoAnalytics","GeneralPurposeServer","HostingServer", "NotebookServer","MissionServer","WorkflowManagerServer"}, Values{"ImageServer","GeoEvent","GeoAnalytics","GeneralPurposeServer","HostingServer","NotebookServer","MissionServer","WorkflowManagerServer"}] String ServerRole;
+ [Write] String AdditionalServerRoles[];
[Write, Description("Is Pro or Desktop using Single Use License")] Boolean IsSingleUse;
[Write, Description("Forcing to License")] Boolean Force;
};
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_LogHarvester/ArcGIS_LogHarvester.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_LogHarvester/ArcGIS_LogHarvester.psm1
index 9a8a8cfd..9ca350c8 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_LogHarvester/ArcGIS_LogHarvester.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_LogHarvester/ArcGIS_LogHarvester.psm1
@@ -71,7 +71,7 @@ function Set-TargetResource
$NodeAgentFilePath = Join-Path $InstallDir 'framework\etc\NodeAgentExt.xml'
if($EnableLogHarvesterPlugin){
#Create Log4j-XML.jar Archive
- $LogXMLFilePath = Join-Path $env:ProgramFiles 'WindowsPowerShell\Modules\ArcGIS\DSCResources\ArcGIS_LogHarvester\LogHarvesterSample.xml'
+ $LogXMLFilePath = Join-Path $PSScriptRoot 'LogHarvesterSample.xml'
[xml]$xml = Get-Content $LogXMLFilePath
$ServerObserverFolderPath = Join-Path $InstallDir 'framework\lib\server\observers'
$Log4jxmlFilePath = Join-Path $ServerObserverFolderPath 'log4j.xml'
@@ -129,24 +129,7 @@ function Set-TargetResource
}
#Restart Component
- try {
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force -ErrorAction Ignore
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Write-Verbose 'Stopped the service'
- }catch {
- Write-Verbose "[WARNING] Stopping Service $_"
- }
-
- try {
- Write-Verbose 'Starting the service'
- Start-Service -Name $ServiceName -ErrorAction Ignore
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service $ServiceName"
- }catch {
- Write-Verbose "[WARNING] Starting Service $_"
- }
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
if($ComponentType -eq "Server"){
$FQDN = if($HostName){ Get-FQDN $HostName }else{ Get-FQDN $env:COMPUTERNAME }
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_MissionServer/ArcGIS_MissionServer.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_MissionServer/ArcGIS_MissionServer.psm1
index e22efc05..be067068 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_MissionServer/ArcGIS_MissionServer.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_MissionServer/ArcGIS_MissionServer.psm1
@@ -176,26 +176,10 @@ function Set-TargetResource
}
if($RestartRequired) {
- try {
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force -ErrorAction Ignore
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Write-Verbose 'Stopped the service'
- }catch {
- Write-Verbose "[WARNING] Stopping Service $_"
- }
-
- try {
- Write-Verbose 'Starting the service'
- Start-Service -Name $ServiceName -ErrorAction Ignore
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service $ServiceName"
- }catch {
- Write-Verbose "[WARNING] Starting Service $_"
- }
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
Write-Verbose "Waiting for Server 'https://$($FQDN):20443/arcgis/admin' to initialize"
+ Wait-ForUrl "https://$($FQDN):20443/arcgis/admin" -HttpMethod 'GET' -Verbose
}
$ServerUrl = "https://$($FQDN):20443"
@@ -233,14 +217,7 @@ function Set-TargetResource
}catch{
Write-Verbose "[WARNING] Error while creating site on attempt $Attempt Error:- $_"
if($Attempt -lt 1) {
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Write-Verbose 'Starting the service'
- Start-Service -Name $ServiceName
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service $ServiceName"
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
Write-Verbose "Waiting for Server 'https://$($FQDN):20443/arcgis/admin' to initialize"
Wait-ForUrl -Url "https://$($FQDN):20443/arcgis/admin" -HttpMethod 'GET'
@@ -449,46 +426,51 @@ function Invoke-CreateSite
$createNewSiteUrl = $ServerURL.TrimEnd("/") + "/arcgis/admin/createNewSite"
$baseHostUrl = $ServerURL.TrimEnd("/") + "/"
- $VersionObject = (Get-ArcGISProductDetails -ProductName "ArcGIS Mission Server").Version
- Write-Verbose "Mission Server Version - $VersionObject"
- $MajorVersion = $VersionObject.Split('.')[1]
- $MinorVersion = $VersionObject.Split('.')[2]
- if(($ConfigStoreCloudStorageConnectionString) -and ($ConfigStoreCloudStorageConnectionSecret) -and ($ConfigStoreCloudStorageAccountName.IndexOf('AccountName=') -gt -1))
+ $ServiceName = "ArcGIS Mission Server"
+ $RegKey = Get-EsriRegistryKeyForService -ServiceName $ServiceName
+ $RealVersion = (Get-ItemProperty -Path $RegKey -ErrorAction Ignore).RealVersion
+ $BuildNumber = (Get-ItemProperty -Path $RegKey -ErrorAction Ignore).BuildNumber
+ Write-Verbose "Mission Server Version - $RealVersion, Build Number - $BuildNumber"
+
+ $configStoreConnection = $null
+ if($ConfigStoreCloudStorageConnectionString -and $ConfigStoreCloudStorageConnectionString.Length -gt 0)
{
- Write-Verbose "Using Azure Cloud Storage for the config store"
- $configStoreConnection = if($MajorVersion -ge 8){
- @{
- configPersistenceType= "AZURE";
- connectionString = $ConfigStoreCloudStorageConnectionString;
- username = $ConfigStoreCloudStorageAccountName.Replace([regex]::escape("AccountName="),[string]::Empty);
- password = $ConfigStoreCloudStorageConnectionSecret.Replace([regex]::escape("AccountKey="),[string]::Empty);
- className = "com.esri.arcgis.carbon.persistence.impl.azure.AzureConfigPersistence"
- }
- }else{
- @{
- configPersistenceType= "AZURE";
- connectionString = "$($ConfigStoreCloudStorageConnectionString)$($ConfigStoreCloudStorageAccountName);$($ConfigStoreCloudStorageConnectionSecret)";
- className = "com.esri.arcgis.carbon.persistence.impl.azure.AzureConfigPersistence"
- }
- }
+ if(($ConfigStoreCloudStorageAccountName.IndexOf('AccountName=') -gt -1)){
+ Write-Verbose "Using Azure Cloud Storage for the config store"
+ $configStoreConnection = @{
+ configPersistenceType = "AZURE";
+ connectionString = $ConfigStoreCloudStorageConnectionString;
+ username = $ConfigStoreCloudStorageAccountName.Replace([regex]::escape("AccountName="),[string]::Empty);
+ password = $ConfigStoreCloudStorageConnectionSecret.Replace([regex]::escape("AccountKey="),[string]::Empty);
+ className = "com.esri.arcgis.carbon.persistence.impl.azure.AzureConfigPersistence"
+ }
+ } else {
+ Write-Verbose "Using AWS Cloud Storage S3 for the config store"
+ $configStoreConnection = @{
+ configPersistenceType = "AMAZON";
+ connectionString = $ConfigStoreCloudStorageConnectionString;
+ className = "com.esri.arcgis.carbon.persistence.impl.amazon.AmazonConfigPersistence"
+ }
+ if($ConfigStoreCloudStorageAccountName -and $ConfigStoreCloudStorageAccountName.Length -gt 0){
+ $configStoreConnection.Add("username",$ConfigStoreCloudStorageAccountName.Replace([regex]::escape("ACCESS_KEY_ID="),[string]::Empty))
+ $configStoreConnection.Add("password",$ConfigStoreCloudStorageConnectionSecret.Replace([regex]::escape("SECRET_KEY="),[string]::Empty))
+ }
+ }
$Timeout = 2 * $Timeout # Double the timeout if using cloud storage for the config store
- }
- else {
+ } else {
Write-Verbose "Using File System Based Storage for the config store"
$configStoreConnection = @{
configPersistenceType= "FILESYSTEM"
connectionString = $ConfigurationStoreLocation
className = "com.esri.arcgis.carbon.persistence.impl.filesystem.FSConfigPersistence"
}
- }
-
- $directories = @()
+ }
+ $directories = @()
$ServerDirectoriesObject = (ConvertFrom-Json $ServerDirectories)
-
- if($MajorVersion -eq 8 -and $MinorVersion -eq 12790){
+ if($BuildNumber -eq 12790){
$directories += if(($ServerDirectoriesObject | Where-Object {$_.name -ieq "arcgisworkspace"}| Measure-Object).Count -gt 0){
($ServerDirectoriesObject | Where-Object {$_.name -ieq "arcgisworkspace"})
}else{
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_NotebookServer/ArcGIS_NotebookServer.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_NotebookServer/ArcGIS_NotebookServer.psm1
index 7912a301..0288b9f1 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_NotebookServer/ArcGIS_NotebookServer.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_NotebookServer/ArcGIS_NotebookServer.psm1
@@ -172,24 +172,7 @@ function Set-TargetResource
}
if($RestartRequired) {
- try {
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force -ErrorAction Ignore
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Write-Verbose 'Stopped the service'
- }catch {
- Write-Verbose "[WARNING] Stopping Service $_"
- }
-
- try {
- Write-Verbose 'Starting the service'
- Start-Service -Name $ServiceName -ErrorAction Ignore
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service $ServiceName"
- }catch {
- Write-Verbose "[WARNING] Starting Service $_"
- }
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
Write-Verbose "Waiting for Server 'https://$($FQDN):11443/arcgis/admin' to initialize"
Wait-ForUrl "https://$($FQDN):11443/arcgis/admin" -HttpMethod 'GET'
@@ -231,14 +214,7 @@ function Set-TargetResource
}catch{
Write-Verbose "[WARNING] Error while creating site on attempt $Attempt Error:- $_"
if($Attempt -lt 1) {
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Write-Verbose 'Starting the service'
- Start-Service -Name $ServiceName
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service $ServiceName"
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
Write-Verbose "Waiting for Server 'https://$($FQDN):11443/arcgis/admin' to initialize"
Wait-ForUrl -Url "https://$($FQDN):11443/arcgis/admin" -HttpMethod 'GET'
@@ -446,40 +422,63 @@ function Invoke-CreateSite
$createNewSiteUrl = $ServerURL.TrimEnd("/") + "/arcgis/admin/createNewSite"
$baseHostUrl = $ServerURL.TrimEnd("/") + "/"
- $VersionObject = (Get-ArcGISProductDetails -ProductName "ArcGIS Notebook Server").Version
- Write-Verbose "Notebook Server Version - $VersionObject"
- $MajorVersion = $($VersionObject.Split('.')[1])
- $MinorVersion = $($VersionObject.Split('.')[2])
-
- if(($ConfigStoreCloudStorageConnectionString) -and ($ConfigStoreCloudStorageConnectionSecret) -and ($ConfigStoreCloudStorageAccountName.IndexOf('AccountName=') -gt -1))
+ $ServiceName = "ArcGIS Notebook Server"
+ $RegKey = Get-EsriRegistryKeyForService -ServiceName $ServiceName
+ $RealVersion = (Get-ItemProperty -Path $RegKey -ErrorAction Ignore).RealVersion
+ $BuildNumber = (Get-ItemProperty -Path $RegKey -ErrorAction Ignore).BuildNumber
+ Write-Verbose "Notebook Server Version - $RealVersion, Build Number - $BuildNumber"
+ $MajorVersion = $($RealVersion.Split('.')[1])
+
+ $configStoreConnection = $null
+ if($ConfigStoreCloudStorageConnectionString -and $ConfigStoreCloudStorageConnectionString.Length -gt 0)
{
- Write-Verbose "Using Azure Cloud Storage for the config store"
- $configStoreConnection = if($MajorVersion -ge 8){
- @{
- configPersistenceType= "AZURE";
- connectionString = $ConfigStoreCloudStorageConnectionString;
- username = $ConfigStoreCloudStorageAccountName.Replace([regex]::escape("AccountName="),[string]::Empty);
- password = $ConfigStoreCloudStorageConnectionSecret.Replace([regex]::escape("AccountKey="),[string]::Empty);
- className = "com.esri.arcgis.carbon.persistence.impl.azure.AzureConfigPersistence"
- }
- }else{
- @{
- configPersistenceType= "AZURE";
- connectionString = "$($ConfigStoreCloudStorageConnectionString)$($ConfigStoreCloudStorageAccountName);$($ConfigStoreCloudStorageConnectionSecret)";
- className = "com.esri.arcgis.carbon.persistence.impl.azure.AzureConfigPersistence"
- }
- }
+ if(($ConfigStoreCloudStorageAccountName.IndexOf('AccountName=') -gt -1)){
+ Write-Verbose "Using Azure Cloud Storage for the config store"
+ $configStoreConnection = if($MajorVersion -ge 8){
+ @{
+ configPersistenceType = "AZURE";
+ connectionString = $ConfigStoreCloudStorageConnectionString;
+ username = $ConfigStoreCloudStorageAccountName.Replace([regex]::escape("AccountName="),[string]::Empty);
+ password = $ConfigStoreCloudStorageConnectionSecret.Replace([regex]::escape("AccountKey="),[string]::Empty);
+ className = "com.esri.arcgis.carbon.persistence.impl.azure.AzureConfigPersistence"
+ }
+ } else {
+ @{
+ configPersistenceType = "AZURE";
+ connectionString = "$($ConfigStoreCloudStorageConnectionString)$($ConfigStoreCloudStorageAccountName);$($ConfigStoreCloudStorageConnectionSecret)";
+ className = "com.esri.arcgis.carbon.persistence.impl.azure.AzureConfigPersistence"
+ }
+ }
+ } else {
+ Write-Verbose "Using AWS Cloud Storage S3 for the config store"
+ if($MajorVersion -ge 8) {
+ $configStoreConnection = @{
+ configPersistenceType = "AMAZON";
+ connectionString = $ConfigStoreCloudStorageConnectionString;
+ className = "com.esri.arcgis.carbon.persistence.impl.amazon.AmazonConfigPersistence"
+ }
+ if($ConfigStoreCloudStorageAccountName -and $ConfigStoreCloudStorageAccountName.Length -gt 0){
+ $configStoreConnection.Add("username",$ConfigStoreCloudStorageAccountName.Replace([regex]::escape("ACCESS_KEY_ID="),[string]::Empty))
+ $configStoreConnection.Add("password",$ConfigStoreCloudStorageConnectionSecret.Replace([regex]::escape("SECRET_KEY="),[string]::Empty))
+ }
+ }else{
+ $configStoreConnection = @{
+ configPersistenceType = "AMAZON";
+ connectionString = "$($ConfigStoreCloudStorageConnectionString)$($ConfigStoreCloudStorageAccountName);$($ConfigStoreCloudStorageConnectionSecret)";
+ className = "com.esri.arcgis.carbon.persistence.impl.amazon.AmazonConfigPersistence"
+ }
+ }
+ }
$Timeout = 2 * $Timeout # Double the timeout if using cloud storage for the config store
- }
- else {
+ } else {
Write-Verbose "Using File System Based Storage for the config store"
$configStoreConnection = @{
configPersistenceType= "FILESYSTEM"
connectionString = $ConfigurationStoreLocation
className = "com.esri.arcgis.carbon.persistence.impl.filesystem.FSConfigPersistence"
}
- }
+ }
$directories = @()
@@ -515,7 +514,7 @@ function Invoke-CreateSite
}
}
- if($MajorVersion -ge 8 -and $MinorVersion -gt 12790){
+ if($BuildNumber -gt 12790){
$directories += if(($ServerDirectoriesObject | Where-Object {$_.name -ieq "arcgisjobs"}| Measure-Object).Count -gt 0){
($ServerDirectoriesObject | Where-Object {$_.name -ieq "arcgisjobs"})
}else{
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_Portal/ArcGIS_Portal.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_Portal/ArcGIS_Portal.psm1
index b97fcbce..79d74495 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_Portal/ArcGIS_Portal.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_Portal/ArcGIS_Portal.psm1
@@ -108,44 +108,93 @@ function Invoke-CreatePortalSite {
$UserLicenseTypeId = $null
)
- [string]$CreateNewSiteUrl = "https://$($PortalHostNameFQDN):7443/$PortalSiteName/portaladmin/createNewSite"
-
if ($ContentDirectoryCloudConnectionString -and $ContentDirectoryCloudConnectionString.Length -gt 0) {
-
$Splits = $ContentDirectoryCloudConnectionString.Split(';')
- $StorageEndpointSuffix = $null
- $StorageAccessKey = $null
- $StorageAccountName = $null
- $Splits | ForEach-Object {
- $Pos = $_.IndexOf('=')
- $Key = $_.Substring(0, $Pos)
- $Value = $_.Substring($Pos + 1)
- if ($Key -ieq 'AccountName') {
- $StorageAccountName = $Value
+
+ if($ContentDirectoryCloudConnectionString.IndexOf('AccountName=') -gt -1){
+ $StorageEndpointSuffix = $null
+ $StorageAccessKey = $null
+ $StorageAccountName = $null
+ $Splits | ForEach-Object {
+ if(-not([string]::IsNullOrEmpty($_))){
+ $Pos = $_.IndexOf('=')
+ $Key = $_.Substring(0, $Pos)
+ $Value = $_.Substring($Pos + 1)
+ if ($Key -ieq 'AccountName') {
+ $StorageAccountName = $Value
+ }
+ elseif ($Key -ieq 'EndpointSuffix') {
+ $StorageEndpointSuffix = $Value
+ }
+ elseif ($Key -ieq 'AccountKey') {
+ $StorageAccessKey = $Value
+ }
+ }
}
- elseif ($Key -ieq 'EndpointSuffix') {
- $StorageEndpointSuffix = $Value
+
+ $objectStoreLocation = "https://$($StorageAccountName).blob.$($StorageEndpointSuffix)/$ContentDirectoryCloudContainerName"
+ Write-Verbose "Using Content Store on Azure Cloud Storage $objectStoreLocation"
+ $contentStore = @{
+ type = 'cloudStore'
+ provider = 'Azure'
+ connectionString = @{
+ accountName = $StorageAccountName
+ accountKey = $StorageAccessKey
+ accountEndpoint = 'blob.' + $StorageEndpointSuffix
+ credentialType = 'accessKey'
+ }
+ objectStore = $objectStoreLocation
}
- elseif ($Key -ieq 'AccountKey') {
- $StorageAccessKey = $Value
+
+ } else {
+ $AWSRegionName = $null
+ $AWSAccessKeyId = $null
+ $AWSSecretKey = $null
+ $AWSS3BucketName = $null
+ $Splits | ForEach-Object {
+ if(-not([string]::IsNullOrEmpty($_))){
+ $Pos = $_.IndexOf('=')
+ $Key = $_.Substring(0, $Pos)
+ $Value = $_.Substring($Pos + 1)
+ if ($Key -ieq 'REGION') {
+ $AWSRegionName = $Value
+ }
+ elseif ($Key -ieq 'ACCESS_KEY_ID') {
+ $AWSAccessKeyId = $Value
+ }
+ elseif ($Key -ieq 'SECRET_KEY') {
+ $AWSSecretKey = $Value
+ }
+ elseif ($Key -ieq 'NAMESPACE') {
+ $AWSS3BucketName = $Value
+ }
+ }
+ }
+
+ Write-Verbose "Using Content Store in AWS S3 Storage $AWSS3BucketName"
+ $AWSConnectionString = @{}
+ if($null -ne $AWSAccessKeyId -and $null -ne $AWSSecretKey){
+ $AWSConnectionString = @{
+ region = $AWSRegionName
+ credentialType = "accessKey"
+ accessKeyId = $AWSAccessKeyId
+ secretAccessKey = $AWSSecretKey
+ }
+ }else{
+ $AWSConnectionString = @{
+ region = $AWSRegionName
+ credentialType = "IAMRole"
+ }
}
- }
- $objectStoreLocation = "https://$($StorageAccountName).blob.$($StorageEndpointSuffix)/$ContentDirectoryCloudContainerName"
- Write-Verbose "Using Content Store on Azure Cloud Storage $objectStoreLocation"
- $contentStore = @{
- type = 'cloudStore'
- provider = 'Azure'
- connectionString = @{
- accountName = $StorageAccountName
- accountKey = $StorageAccessKey
- accountEndpoint = 'blob.' + $StorageEndpointSuffix
- credentialType = 'accessKey'
+ $contentStore = @{
+ type = 'cloudStore'
+ provider = 'Amazon'
+ connectionString = $AWSConnectionString
+ objectStore = $AWSS3BucketName
}
- objectStore = $objectStoreLocation
}
- }
- else {
+ }else{
Write-Verbose "Using Content Store on File System at location $ContentDirectoryLocation"
$contentStore = @{
type = 'fileStore'
@@ -153,7 +202,8 @@ function Invoke-CreatePortalSite {
connectionString = $ContentDirectoryLocation
}
}
-
+
+ $CreateNewSiteUrl = "https://$($PortalHostNameFQDN):7443/$PortalSiteName/portaladmin/createNewSite"
$WebParams = @{
username = $Credential.UserName
password = $Credential.GetNetworkCredential().Password
@@ -181,7 +231,7 @@ function Invoke-CreatePortalSite {
$Response = Invoke-ArcGISWebRequest -Url $CreateNewSiteUrl -HttpFormParameters $WebParams -Referer 'http://localhost' -TimeOutSec 5400 -Verbose
}
- Write-Verbose "Response received from create site $( $Response |ConvertTo-Json -Depth 10 )"
+ Write-Verbose "Response received from create site $( $Response | ConvertTo-Json -Depth 10 )"
if ($Response.error -and $Response.error.message) {
throw $Response.error.message
}
@@ -192,7 +242,7 @@ function Invoke-CreatePortalSite {
Write-Verbose "Waiting for portal to start."
try {
- $token = Get-PortalToken -PortalHostName $PortalHostNameFQDN -SiteName $PortalSiteName -Credential $Credential -Referer "https://$($PortalHostNameFQDN):7443" -MaxAttempts 40
+ $token = Get-PortalToken -PortalHostName $PortalHostNameFQDN -SiteName $PortalSiteName -Credential $Credential -Referer "https://$($PortalHostNameFQDN):7443" -MaxAttempts 40
if($token.token){
Write-Verbose "Portal Site create successful. Was able to retrieve token from Portal."
}
@@ -263,7 +313,7 @@ function Join-PortalSite {
Write-Verbose "Error from Join Site:- $($Response.error.message)"
$ServiceName = 'Portal for ArcGIS'
- Restart-PortalService -ServiceName $ServiceName
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
Write-Verbose "Wait for endpoint 'https://$($PortalHostNameFQDN):7443/arcgis/portaladmin/' to initialize"
Wait-ForUrl "https://$($PortalHostNameFQDN):7443/arcgis/portaladmin/" -HttpMethod 'GET' -Verbose
@@ -520,9 +570,9 @@ function Set-TargetResource {
}
}
- if ($RestartRequired) {
- Restart-PortalService -ServiceName $ServiceName -Verbose
- Wait-ForUrl "https://$($FQDN):7443/arcgis/portaladmin" -HttpMethod 'GET' -Verbose
+ if ($RestartRequired) {
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
+ Wait-ForUrl "https://$($FQDN):7443/arcgis/portaladmin" -HttpMethod 'GET' -Verbose
}
Write-Verbose "Portal at https://$($FQDN):7443"
@@ -545,7 +595,7 @@ function Set-TargetResource {
$PortalReady = $true
}catch {
Write-Verbose "Sharing API rest endpoint is not available. Error:- $_. Restarting Portal."
- Restart-PortalService -ServiceName $ServiceName -Verbose
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
Wait-ForUrl "https://$($FQDN):7443/arcgis/portaladmin" -HttpMethod 'GET' -Verbose
$Attempts = $Attempts + 1
}
@@ -637,7 +687,7 @@ function Set-TargetResource {
# On the secondary Portal machine,
# Finally set log level to user defined
if(Set-LoggingLevel -EnableDebugLogging $EnableDebugLogging) {
- Restart-PortalService -ServiceName $ServiceName -Verbose
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
Wait-ForUrl "https://$($FQDN):7443/arcgis/portaladmin/healthCheck/?f=json" -HttpMethod 'GET' -Verbose
}
}
@@ -1159,38 +1209,6 @@ function Test-TargetResource {
}
}
-function Restart-PortalService {
- [CmdletBinding()]
- [OutputType([System.Boolean])]
- param
- (
- [Parameter(Mandatory=$false)]
- [System.String]
- $ServiceName = 'Portal for ArcGIS'
- )
-
- try {
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force -ErrorAction Ignore
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Write-Verbose 'Stopped the service'
- }
- catch {
- Write-Verbose "[WARNING] Stopping Service $_"
- }
-
- try {
- Write-Verbose 'Starting the service'
- Start-Service -Name $ServiceName -ErrorAction Ignore
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service '$ServiceName'"
- }
- catch {
- Write-Verbose "[WARNING] Starting Service $_"
- }
-}
-
function Set-LoggingLevel {
[CmdletBinding()]
[OutputType([System.Boolean])]
@@ -1287,7 +1305,7 @@ function Set-PortalSecurityConfig {
$params = @{ f = 'json'; token = $Token; securityConfig = $SecurityParameters;}
$resp = Invoke-ArcGISWebRequest -Url ("https://$($PortalHostName):$($Port)/$SiteName/portaladmin/security/config/update") `
- -HttpFormParameters $params -Referer $Referer -Verbose
+ -HttpFormParameters $params -Referer $Referer -TimeOutSec 100 -Verbose
if($resp.error -and $resp.error.message){
throw "[Error] - Set-PortalSecurityConfig Response:- $($resp.error.message)"
}
@@ -1626,63 +1644,4 @@ function Delete-PortalEmailSettings
}
}
-function Get-NodeAgentAmazonElementsPresent
-{
- [CmdletBinding()]
- [OutputType([System.Boolean])]
- param(
- [System.String]
- $InstallDir
- )
-
- $Enabled = $false
- $File = Join-Path $InstallDir 'framework\etc\NodeAgentExt.xml'
- if(Test-Path $File){
- [xml]$xml = Get-Content $File
- if((($xml.NodeAgent.Observers.Observer | Where-Object { $_.platform -ieq 'amazon'}).Length -gt 0) -or `
- ($xml.NodeAgent.Observers.Observer.platform -ieq 'amazon') -or `
- (($xml.NodeAgent.Plugins.Plugin | Where-Object { $_.platform -ieq 'amazon'}).Length -gt 0) -or `
- ($xml.NodeAgent.Plugins.Plugin.platform -ieq 'amazon'))
- {
- Write-Verbose "Amazon elements exist in $File"
- $Enabled = $true
- }
- }
-
- $Enabled
-}
-
-function Remove-NodeAgentAmazonElements
-{
- [CmdletBinding()]
- [OutputType([System.Boolean])]
- param(
- [System.String]
- $InstallDir
- )
-
- $Changed = $false
- $File = Join-Path $InstallDir 'framework\etc\NodeAgentExt.xml'
- if(Test-Path $File){
- [xml]$xml = Get-Content $File
- if($xml.NodeAgent.Observers.Observer.platform -ieq 'amazon')
- {
- $xml.NodeAgent.Observers.RemoveChild($xml.NodeAgent.Observers.Observer)
- Write-Verbose "Amazon Observer exists in $File. Removing it"
- $Changed = $true
- }
- if($xml.NodeAgent.Plugins.Plugin.platform -ieq 'amazon')
- {
- $xml.NodeAgent.Plugins.RemoveChild($xml.NodeAgent.Plugins.Plugin)
- Write-Verbose "Amazon plugin exists in $File. Removing it"
- $Changed = $true
- }
- if($Changed) {
- $xml.Save($File)
- }
- }
-
- $Changed
-}
-
Export-ModuleMember -Function *-TargetResource
\ No newline at end of file
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_PortalUpgrade/ArcGIS_PortalUpgrade.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_PortalUpgrade/ArcGIS_PortalUpgrade.psm1
index 0b384bcd..82ead0bf 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_PortalUpgrade/ArcGIS_PortalUpgrade.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_PortalUpgrade/ArcGIS_PortalUpgrade.psm1
@@ -86,6 +86,14 @@ function Set-TargetResource
}
}
+ if(Get-NodeAgentAmazonElementsPresent -InstallDir $InstallDir) {
+ Write-Verbose "Removing EC2 Listener from NodeAgent xml file"
+ if(Remove-NodeAgentAmazonElements -InstallDir $InstallDir) {
+ # Need to restart the service to pick up the EC2
+ $RestartRequired = $true
+ }
+ }
+
$InstallDir = Join-Path $InstallDir 'framework\runtime\ds'
$expectedHostIdentifierType = if($FQDN -as [ipaddress]){ 'ip' }else{ 'hostname' }
@@ -102,9 +110,9 @@ function Set-TargetResource
}
}
- if($RestartRequired) {
- Restart-PortalService -ServiceName $ServiceName
- Wait-ForUrl "https://$($FQDN):7443/arcgis/portaladmin/" -HttpMethod 'GET' -Verbose
+ if($RestartRequired) {
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
+ Wait-ForUrl "https://$($FQDN):7443/arcgis/portaladmin/" -HttpMethod 'GET' -Verbose
}
if(-not($SetOnlyHostNamePropertiesFile)){
@@ -343,6 +351,13 @@ function Test-TargetResource
$result = $false
}
+ if($result) {
+ if(Get-NodeAgentAmazonElementsPresent -InstallDir $InstallDir) {
+ Write-Verbose "Amazon Elements present in NodeAgentExt.xml. Will be removed in Set Method"
+ $result = $false
+ }
+ }
+
if ($result) {
$InstallDir = Join-Path $InstallDir 'framework\runtime\ds'
@@ -591,36 +606,4 @@ function Test-IfLivingAtlasUpgraded
$Result
}
-
-function Restart-PortalService
-{
- [CmdletBinding()]
- [OutputType([System.Boolean])]
- param
- (
- [System.String]
- $ServiceName = 'Portal for ArcGIS'
- )
-
- try
- {
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force -ErrorAction Ignore
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Write-Verbose 'Stopped the service'
- }catch {
- Write-Verbose "[WARNING] Stopping Service $_"
- }
-
- try {
- Write-Verbose 'Starting the service'
- Start-Service -Name $ServiceName -ErrorAction Ignore
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service '$ServiceName'"
- }catch {
- Write-Verbose "[WARNING] Starting Service $_"
- }
-}
-
Export-ModuleMember -Function *-TargetResource
\ No newline at end of file
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_Portal_TLS/ArcGIS_Portal_TLS.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_Portal_TLS/ArcGIS_Portal_TLS.psm1
index 6cbc9d4b..edbc2095 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_Portal_TLS/ArcGIS_Portal_TLS.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_Portal_TLS/ArcGIS_Portal_TLS.psm1
@@ -193,7 +193,7 @@ function Set-TargetResource
$Certs = Get-SSLCertificatesForPortal -PortalURL $PortalURL -SiteName $SiteName -Token $token.token -Referer $Referer -MachineName $FQDN -Version $Version -ErrorAction SilentlyContinue
if($CName -ine $Certs.webServerCertificateAlias) {
Write-Verbose "Unable to retrive current alias to verify. Restarting Portal Service"
- Restart-PortalService -ServiceName 'Portal for ArcGIS'
+ Restart-ArcGISService -ServiceName 'Portal for ArcGIS' -Verbose
Start-Sleep -Seconds 120
Write-Verbose "Waiting for '$PortalAdminUrl' to initialize after waiting 150 seconds"
Wait-ForUrl -Url $PortalAdminUrl
@@ -223,37 +223,6 @@ function Set-TargetResource
}
}
-function Restart-PortalService
-{
- [CmdletBinding()]
- [OutputType([System.Boolean])]
- param
- (
- [System.String]
- $ServiceName = 'Portal for ArcGIS'
- )
-
- try
- {
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force -ErrorAction Ignore
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Write-Verbose 'Stopped the service'
- }catch {
- Write-Verbose "[WARNING] Stopping Service $_"
- }
-
- try {
- Write-Verbose 'Starting the service'
- Start-Service -Name $ServiceName -ErrorAction Ignore
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service '$ServiceName'"
- }catch {
- Write-Verbose "[WARNING] Starting Service $_"
- }
-}
-
function Test-TargetResource
{
[CmdletBinding()]
@@ -307,7 +276,7 @@ function Test-TargetResource
$token = Get-PortalToken -PortalHostName $FQDN -SiteName $SiteName -Credential $SiteAdministrator -Referer $Referer -MaxAttempts 30
} catch {
Write-Verbose "[WARNING] Unable to get token:- $_. Restarting portal service and retrying to get the token."
- Restart-PortalService -ServiceName 'Portal for ArcGIS'
+ Restart-ArcGISService -ServiceName 'Portal for ArcGIS' -Verbose
Start-Sleep -Seconds 150
Write-Verbose "Waiting for '$PortalAdminUrl' to initialize after waiting 150 seconds"
Wait-ForUrl -Url $PortalAdminUrl -Verbose
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_Server/ArcGIS_Server.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_Server/ArcGIS_Server.psm1
index d8a6cb39..c608249b 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_Server/ArcGIS_Server.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_Server/ArcGIS_Server.psm1
@@ -33,7 +33,7 @@
Defines the Logging Level of Server. Can have values - "OFF","SEVERE","WARNING","INFO","FINE","VERBOSE","DEBUG"
.PARAMETER DisableServiceDirectory
Boolean to indicate whether to disable the service directory for ArcGIS Server
- .PARAMETER DisableServiceDirectory
+ .PARAMETER EnableUsageMetering
Boolean to indicate whether to enable the internal usage metering plugin
.PARAMETER SharedKey
Secret to use as the Shared Key for token generatiion
@@ -187,13 +187,16 @@ function Set-TargetResource
$ServiceName = 'ArcGIS Server'
$RegKey = Get-EsriRegistryKeyForService -ServiceName $ServiceName
- $InstallDir = (Get-ItemProperty -Path $RegKey -ErrorAction Ignore).InstallDir
+ $InstallDir = (Get-ItemProperty -Path $RegKey -ErrorAction Ignore).InstallDir
+ $RealVersion = (Get-ItemProperty -Path $RegKey -ErrorAction Ignore).RealVersion
+ $ArcGISServerVersion = New-Object 'System.Version' -ArgumentList $RealVersion
+ Write-Verbose "Version of ArcGIS Server is $ArcGISServerVersion"
[System.Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null
Write-Verbose "Waiting for Server 'https://$($FQDN):6443/arcgis/admin' to initialize"
Wait-ForUrl "https://$($FQDN):6443/arcgis/admin" -HttpMethod 'GET'
- if($Ensure -ieq 'Present') {
+ if($Ensure -ieq 'Present') {
$Referer = 'http://localhost'
@@ -205,11 +208,7 @@ function Set-TargetResource
# Need to restart the service to pick up the hostname
$RestartRequired = $true
}
- }
-
- [string]$RealVersion = (Get-ArcGISProductDetails -ProductName "ArcGIS Server").Version
- $DeploymentImageVersion = New-Object 'System.Version' -ArgumentList $RealVersion
- Write-Verbose "Version of ArcGIS Server is $DeploymentImageVersion"
+ }
if(Get-NodeAgentAmazonElementsPresent -InstallDir $InstallDir) {
Write-Verbose "Removing EC2 Listener from NodeAgent xml file"
if(Remove-NodeAgentAmazonElements -InstallDir $InstallDir) {
@@ -219,24 +218,7 @@ function Set-TargetResource
}
if($RestartRequired) {
- try {
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force -ErrorAction Ignore
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Write-Verbose 'Stopped the service'
- }catch {
- Write-Verbose "[WARNING] Stopping Service $_"
- }
-
- try {
- Write-Verbose 'Starting the service'
- Start-Service -Name $ServiceName -ErrorAction Ignore
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service $ServiceName"
- }catch {
- Write-Verbose "[WARNING] Starting Service $_"
- }
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
Write-Verbose "Waiting for Server 'https://$($FQDN):6443/arcgis/admin' to initialize"
Wait-ForUrl "https://$($FQDN):6443/arcgis/admin" -HttpMethod 'GET' -Verbose
@@ -257,7 +239,7 @@ function Set-TargetResource
if($Join) {
if(-not($siteExists)) {
Write-Verbose 'Joining to Server Site'
- Join-Site -ServerName $PeerServerHostName -Credential $SiteAdministrator -Referer $Referer -CurrentMachineServerHostName $FQDN -DeploymentMajorVersion $DeploymentImageVersion.Minor
+ Join-Site -ServerName $PeerServerHostName -Credential $SiteAdministrator -Referer $Referer -CurrentMachineServerHostName $FQDN -DeploymentMajorVersion $ArcGISServerVersion.Minor
Write-Verbose 'Joined to Server Site'
}else{
Write-Verbose "Skipping Join site operation. $FQDN already belongs to a site."
@@ -287,14 +269,7 @@ function Set-TargetResource
Write-Verbose "[WARNING] Error while creating site on attempt $Attempt Error:- $_"
if($Attempt -lt 1) {
# If the site failed to create because of permissions. Restart the service and try again
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Write-Verbose 'Starting the service'
- Start-Service -Name $ServiceName
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service $ServiceName"
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
Write-Verbose "Waiting for Server 'https://$($FQDN):6443/arcgis/admin' to initialize"
Wait-ForUrl -Url "https://$($FQDN):6443/arcgis/admin" -HttpMethod 'GET'
@@ -630,13 +605,26 @@ function Invoke-CreateSite
$createNewSiteUrl = $ServerURL.TrimEnd("/") + "/arcgis/admin/createNewSite"
$baseHostUrl = $ServerURL.TrimEnd("/") + "/"
- if(($ConfigStoreCloudStorageConnectionString) -and ($ConfigStoreCloudStorageConnectionSecret) -and ($ConfigStoreCloudStorageConnectionString.IndexOf('AccountName=') -gt -1)){
- Write-Verbose "Using Azure Cloud Storage for the config store"
- $configStoreConnection = @{ type= "AZURE";
- connectionString = $ConfigStoreCloudStorageConnectionString;
- connectionSecret = $ConfigStoreCloudStorageConnectionSecret
- }
- $Timeout = 2 * $Timeout # Double the timeout if using cloud storage for the config store
+ if($ConfigStoreCloudStorageConnectionString -and $ConfigStoreCloudStorageConnectionString.Length -gt 0){
+ if($ConfigStoreCloudStorageConnectionString.IndexOf('AccountName=') -gt -1){
+ Write-Verbose "Using Azure Cloud Storage for the config store"
+ $configStoreConnection = @{
+ type= "AZURE";
+ connectionString = $ConfigStoreCloudStorageConnectionString;
+ connectionSecret = $ConfigStoreCloudStorageConnectionSecret
+ }
+ }else{
+ Write-Verbose "Using AWS Cloud Storage for the config store"
+ $configStoreConnection = @{
+ type= "AMAZON";
+ connectionString = $ConfigStoreCloudStorageConnectionString;
+ }
+
+ if($ConfigStoreCloudStorageConnectionSecret -and $ConfigStoreCloudStorageConnectionSecret.Length -gt 0){
+ $configStoreConnection.Add("connectionSecret",$ConfigStoreCloudStorageConnectionSecret)
+ }
+ }
+ $Timeout = 2 * $Timeout # Double the timeout if using cloud storage for the config store
}else{
Write-Verbose "Using File System Based Storage for the config store"
$configStoreConnection = @{ type= "FILESYSTEM"; connectionString = $ConfigurationStoreLocation }
@@ -969,7 +957,7 @@ function Wait-ForHostNameResolution
if(-not(Test-Path $JavaExe)){
throw "java.exe not found at $JavaExe"
}
- $JavaClassFilePath = Join-Path $env:ProgramFiles 'WindowsPowerShell\Modules\ArcGIS\DSCResources\ArcGIS_Server\FQDN.class'
+ $JavaClassFilePath = Join-Path $PSScriptRoot 'FQDN.class'
if(-not(Test-Path $JavaClassFilePath)) {
Write-Warning "Java Test Class not found at $JavaClassFilePath"
}
@@ -982,7 +970,7 @@ function Wait-ForHostNameResolution
$psi = New-Object System.Diagnostics.ProcessStartInfo
$psi.FileName = $JavaExe
$psi.Arguments = 'FQDN'
- $psi.WorkingDirectory = (Join-Path $env:ProgramFiles 'WindowsPowerShell\Modules\ArcGIS\DSCResources\ArcGIS_Server')
+ $psi.WorkingDirectory = $PSScriptRoot
$psi.UseShellExecute = $false #start the process from it's own executable file
$psi.RedirectStandardOutput = $true #enable the process to read from standard output
$psi.RedirectStandardError = $true #enable the process to read from standard error
@@ -1003,65 +991,6 @@ function Wait-ForHostNameResolution
}
}
-function Get-NodeAgentAmazonElementsPresent
-{
- [CmdletBinding()]
- [OutputType([System.Boolean])]
- param(
- [System.String]
- $InstallDir
- )
-
- $Enabled = $false
- $File = Join-Path $InstallDir 'framework\etc\NodeAgentExt.xml'
- if(Test-Path $File){
- [xml]$xml = Get-Content $File
- if((($xml.NodeAgent.Observers.Observer | Where-Object { $_.platform -ieq 'amazon'}).Length -gt 0) -or `
- ($xml.NodeAgent.Observers.Observer.platform -ieq 'amazon') -or `
- (($xml.NodeAgent.Plugins.Plugin | Where-Object { $_.platform -ieq 'amazon'}).Length -gt 0) -or `
- ($xml.NodeAgent.Plugins.Plugin.platform -ieq 'amazon'))
- {
- Write-Verbose "Amazon elements exist in $File"
- $Enabled = $true
- }
- }
-
- $Enabled
-}
-
-function Remove-NodeAgentAmazonElements
-{
- [CmdletBinding()]
- [OutputType([System.Boolean])]
- param(
- [System.String]
- $InstallDir
- )
-
- $Changed = $false
- $File = Join-Path $InstallDir 'framework\etc\NodeAgentExt.xml'
- if(Test-Path $File){
- [xml]$xml = Get-Content $File
- if($xml.NodeAgent.Observers.Observer.platform -ieq 'amazon')
- {
- $xml.NodeAgent.Observers.RemoveChild($xml.NodeAgent.Observers.Observer)
- Write-Verbose "Amazon Observer exists in $File. Removing it"
- $Changed = $true
- }
- if($xml.NodeAgent.Plugins.Plugin.platform -ieq 'amazon')
- {
- $xml.NodeAgent.Plugins.RemoveChild($xml.NodeAgent.Plugins.Plugin)
- Write-Verbose "Amazon plugin exists in $File. Removing it"
- $Changed = $true
- }
- if($Changed) {
- $xml.Save($File)
- }
- }
-
- $Changed
-}
-
function Get-SingleClusterModeOnServer
{
[CmdletBinding()]
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_ServerSettings/ArcGIS_ServerSettings.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_ServerSettings/ArcGIS_ServerSettings.psm1
index e474c73c..cf0f1436 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_ServerSettings/ArcGIS_ServerSettings.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_ServerSettings/ArcGIS_ServerSettings.psm1
@@ -20,10 +20,7 @@ function Get-TargetResource
$ServerEndPoint,
[System.Management.Automation.PSCredential]
- $SiteAdministrator,
-
- [System.Boolean]
- $IsWorkflowManagerDeployment = $False
+ $SiteAdministrator
)
Import-Module $PSScriptRoot\..\..\ArcGISUtility.psm1 -Verbose:$false
@@ -59,10 +56,7 @@ function Set-TargetResource
$ServerEndPointContext = 'arcgis',
[System.Management.Automation.PSCredential]
- $SiteAdministrator,
-
- [System.Boolean]
- $IsWorkflowManagerDeployment = $False
+ $SiteAdministrator
)
Import-Module $PSScriptRoot\..\..\ArcGISUtility.psm1 -Verbose:$false
@@ -72,8 +66,7 @@ function Set-TargetResource
$Referer = if($ExternalDNSName){"https://$($ExternalDNSName)/$($ServerContext)"}else{"https://localhost"}
Write-Verbose "Getting Server Token for user '$($SiteAdministrator.UserName)' from 'https://$($ServerFQDN):6443'"
- $RestartRequired = $False
- $serverToken = Get-ServerToken -ServerEndPoint "https://$($ServerFQDN):6443" -ServerSiteName 'arcgis' -Credential $SiteAdministrator -Referer $Referer
+ $serverToken = Get-ServerToken -ServerEndPoint "https://$($ServerFQDN):6443" -ServerSiteName 'arcgis' -Credential $SiteAdministrator -Referer $Referer
if(-not($serverToken.token)) {
Write-Verbose "Get Server Token Response:- $serverToken"
throw "Unable to retrieve Server Token for '$($SiteAdministrator.UserName)'"
@@ -124,26 +117,8 @@ function Set-TargetResource
Write-Verbose "Updating Server System Properties to set WebContextUrl to $ExpectedServerWebContextUrl"
Set-ServerSystemProperties -ServerHostName $ServerFQDN -Token $serverToken.token -Referer $Referer -Properties $serverSysProps
Write-Verbose "Updated Server System Properties to set WebContextUrl to $ExpectedServerWebContextUrl"
- $RestartRequired = $true
}
}
-
- if($RestartRequired)
- {
- $ServiceName = 'ArcGIS Server'
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Start-Service -Name $ServiceName
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service $ServiceName"
- }
-
- if($IsWorkflowManagerDeployment){
- Start-Service -Name "WorkflowManager"
- Wait-ForServiceToReachDesiredState -ServiceName "WorkflowManager" -DesiredState 'Running'
- Write-Verbose "Started Service WorkflowManager"
- }
Write-Verbose "Waiting for Url 'https://$($ServerFQDN):6443/arcgis/rest/info/healthCheck' to respond"
Wait-ForUrl -Url "https://$($ServerFQDN):6443/arcgis/rest/info/healthCheck" -SleepTimeInSeconds 10 -MaxWaitTimeInSeconds 150 -HttpMethod 'GET' -Verbose
@@ -178,10 +153,7 @@ function Test-TargetResource
$ServerEndPointContext = 'arcgis',
[System.Management.Automation.PSCredential]
- $SiteAdministrator,
-
- [System.Boolean]
- $IsWorkflowManagerDeployment = $False
+ $SiteAdministrator
)
Import-Module $PSScriptRoot\..\..\ArcGISUtility.psm1 -Verbose:$false
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_ServerSettings/ArcGIS_ServerSettings.schema.mof b/Modules/ArcGIS/DSCResources/ArcGIS_ServerSettings/ArcGIS_ServerSettings.schema.mof
index 24d4f637..f94a51f6 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_ServerSettings/ArcGIS_ServerSettings.schema.mof
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_ServerSettings/ArcGIS_ServerSettings.schema.mof
@@ -9,6 +9,5 @@ class ArcGIS_ServerSettings : OMI_BaseResource
[Write] String ServerEndPoint;
[Write] String ServerEndPointPort;
[Write] String ServerEndPointContext;
- [Write, Description("IsWorkflowManagerDeployment")] Boolean IsWorkflowManagerDeployment;
};
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_ServerUpgrade/ArcGIS_ServerUpgrade.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_ServerUpgrade/ArcGIS_ServerUpgrade.psm1
index 179ad15c..298ee924 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_ServerUpgrade/ArcGIS_ServerUpgrade.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_ServerUpgrade/ArcGIS_ServerUpgrade.psm1
@@ -53,15 +53,54 @@ function Set-TargetResource
Import-Module $PSScriptRoot\..\..\ArcGISUtility.psm1 -Verbose:$false
#$MachineFQDN = Get-FQDN $env:COMPUTERNAME
- Write-Verbose "Fully Qualified Domain Name :- $ServerHostName"
+ $FQDN = if($ServerHostName){ Get-FQDN $ServerHostName }else{ Get-FQDN $env:COMPUTERNAME }
+ Write-Verbose "Fully Qualified Domain Name :- $FQDN"
[System.Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null
- Write-Verbose "Waiting for Server 'https://$($ServerHostName):6443/arcgis/admin'"
- Wait-ForUrl "https://$($ServerHostName):6443/arcgis/admin" -HttpMethod 'GET'
+ Write-Verbose "Waiting for Server 'https://$($FQDN):6443/arcgis/admin'"
+ Wait-ForUrl "https://$($FQDN):6443/arcgis/admin" -HttpMethod 'GET'
+
+ if($Ensure -ieq 'Present') {
+
+ $ServiceName = 'ArcGIS Server'
+ $RegKey = Get-EsriRegistryKeyForService -ServiceName $ServiceName
+ $InstallDir = (Get-ItemProperty -Path $RegKey -ErrorAction Ignore).InstallDir
+
+ $RestartRequired = $false
+ $configuredHostName = Get-ConfiguredHostName -InstallDir $InstallDir
+ if($configuredHostName -ine $FQDN){
+ Write-Verbose "Configured Host Name '$configuredHostName' is not equal to '$($FQDN)'. Setting it"
+ if(Set-ConfiguredHostName -InstallDir $InstallDir -HostName $FQDN) {
+ # Need to restart the service to pick up the hostname
+ $RestartRequired = $true
+ }
+ }
+
+ if(Test-Install -Name "Server" -Version $Version){
+ Write-Verbose "Installed Version of ArcGIS Server is $Version"
+ }else{
+ throw "ArcGIS Server version $Version not installed"
+ }
+
+ if(Get-NodeAgentAmazonElementsPresent -InstallDir $InstallDir) {
+ Write-Verbose "Removing EC2 Listener from NodeAgent xml file"
+ if(Remove-NodeAgentAmazonElements -InstallDir $InstallDir) {
+ # Need to restart the service to pick up the EC2
+ $RestartRequired = $true
+ }
+ }
+
+ if($RestartRequired) {
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
+
+ Write-Verbose "Waiting for Server 'https://$($FQDN):6443/arcgis/admin' to initialize"
+ Wait-ForUrl "https://$($FQDN):6443/arcgis/admin" -HttpMethod 'GET' -Verbose
+ Start-Sleep -Seconds 30
+ }
+
- if($Ensure -ieq 'Present') {
$Referer = "http://localhost"
- $ServerSiteURL = "https://$($ServerHostName):6443"
+ $ServerSiteURL = "https://$($FQDN):6443"
[string]$ServerUpgradeUrl = $ServerSiteURL.TrimEnd('/') + "/arcgis/admin/upgrade"
Write-Verbose "Making request to $ServerUpgradeUrl to Upgrade the site"
@@ -150,9 +189,9 @@ function Test-TargetResource
[System.Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null
$result = Test-Install -Name "Server" -Version $Version
-
+ $FQDN = if($ServerHostName){ Get-FQDN $ServerHostName }else{ Get-FQDN $env:COMPUTERNAME }
$Referer = "http://localhost"
- $ServerUpgradeUrl = "https://$($ServerHostName):6443/arcgis/admin/upgrade"
+ $ServerUpgradeUrl = "https://$($FQDN):6443/arcgis/admin/upgrade"
$ResponseStatus = Invoke-ArcGISWebRequest -Url $ServerUpgradeUrl -HttpFormParameters @{f = 'json'} -Referer $Referer -Verbose -HttpMethod 'GET'
if($result) {
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_Server_TLS/ArcGIS_Server_TLS.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_Server_TLS/ArcGIS_Server_TLS.psm1
index d498c42c..9b67ef7e 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_Server_TLS/ArcGIS_Server_TLS.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_Server_TLS/ArcGIS_Server_TLS.psm1
@@ -260,24 +260,11 @@ function Set-TargetResource
###
### If the SSL Certificate is changed. Restart the GeoEvent Service so that it will pick up the new certificate
###
- try {
- Write-Verbose "Restarting Service $GeoEventServiceName"
- Stop-Service -Name $GeoEventServiceName -Force -ErrorAction Ignore
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $GeoEventServiceName -DesiredState 'Stopped'
- Write-Verbose 'Stopped the service'
- }catch {
- Write-Verbose "[WARNING] While Stopping Service $_"
- }
- try {
- Write-Verbose 'Starting the service'
- Start-Service -Name $GeoEventServiceName -ErrorAction Ignore
- Wait-ForServiceToReachDesiredState -ServiceName $GeoEventServiceName -DesiredState 'Running'
- Wait-ForUrl -Url "$GeoEventServerHttpsUrl/geoevent/rest" -SleepTimeInSeconds 20 -MaxWaitTimeInSeconds 150 -HttpMethod 'GET' -Verbose
- Write-Verbose "Restarted Service $GeoEventServiceName"
- }catch {
- Write-Verbose "[WARNING] While Starting Service $_"
- }
+ Restart-ArcGISService -ServiceName $GeoEventServiceName -Verbose
+
+ Write-Verbose "Waiting for Url '$GeoEventServerHttpsUrl/geoevent/rest' to respond"
+ Wait-ForUrl -Url "$GeoEventServerHttpsUrl/geoevent/rest" -SleepTimeInSeconds 20 -MaxWaitTimeInSeconds 150 -HttpMethod 'GET' -Verbose
+ Write-Verbose "Restarted Service $GeoEventServiceName"
}
}
@@ -298,12 +285,7 @@ function Set-TargetResource
if($RestartRequired)
{
- Write-Verbose "Restarting Service $ServiceName"
- Stop-Service -Name $ServiceName -Force
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
- Start-Service -Name $ServiceName
- Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Running'
- Write-Verbose "Restarted Service $ServiceName"
+ Restart-ArcGISService -ServiceName $ServiceName -Verbose
}
Write-Verbose "Waiting for Url '$ServerURL/$SiteName/admin' to respond"
diff --git a/Modules/ArcGIS/DSCResources/ArcGIS_Service_Account/ArcGIS_Service_Account.psm1 b/Modules/ArcGIS/DSCResources/ArcGIS_Service_Account/ArcGIS_Service_Account.psm1
index 3ac59607..2b8bfa67 100644
--- a/Modules/ArcGIS/DSCResources/ArcGIS_Service_Account/ArcGIS_Service_Account.psm1
+++ b/Modules/ArcGIS/DSCResources/ArcGIS_Service_Account/ArcGIS_Service_Account.psm1
@@ -109,6 +109,11 @@ function Set-TargetResource
Write-Verbose "Removing the machine prefix for the expected RunAsAccount to $ExpectedRunAsUserName"
}
+ #Add Run As account to
+ Write-Verbose "Adding Log On As a Service Policy for RunAsAccount Username:- $ExpectedRunAsUserName"
+ Set-LogOnAsServicePolicy -UserName $ExpectedRunAsUserName
+ Write-Verbose "Successfully added Log On As a Service Policy for RunAsAccount Username:- $ExpectedRunAsUserName"
+
$RegKey = Get-EsriRegistryKeyForService -ServiceName $Name
$InstallDir = (Get-ItemProperty -Path $RegKey -ErrorAction Ignore).InstallDir
Write-Verbose "Install Dir for $Name is $InstallDir"
@@ -288,7 +293,7 @@ function Set-TargetResource
@('ArcGISGeoEvent', 'ArcGISGeoEventGateway') | ForEach-Object{
try {
$ServiceName = $_
- Write-Verbose "Restarting Service $ServiceName"
+ Write-Verbose "Stopping Service $ServiceName"
Stop-Service -Name $ServiceName -Force -ErrorAction Ignore
Write-Verbose 'Stopping the service'
Wait-ForServiceToReachDesiredState -ServiceName $ServiceName -DesiredState 'Stopped'
@@ -333,6 +338,10 @@ function Set-TargetResource
}
}
+ if($Name -ieq 'WorkflowManager') {
+ $RestartService = $True
+ }
+
if($SetStartupToAutomatic){
try{
if($Name -ieq 'ArcGISGeoEvent'){
@@ -362,27 +371,12 @@ function Set-TargetResource
### If the Service Credentials are changed. Restart the Service (just in case) TODO:- Revisit if this is needed
###
if($RestartService){
- try {
- Write-Verbose "Restarting Service $Name"
- Stop-Service -Name $Name -Force -ErrorAction Ignore
- Write-Verbose 'Stopping the service'
- Wait-ForServiceToReachDesiredState -ServiceName $Name -DesiredState 'Stopped'
- Write-Verbose 'Stopped the service'
- }catch {
- Write-Verbose "[WARNING] Stopping Service $_"
- }
- try {
- Write-Verbose 'Starting the service'
- Start-Service -Name $Name -ErrorAction Ignore
- Wait-ForServiceToReachDesiredState -ServiceName $Name -DesiredState 'Running'
- Write-Verbose "Restarted Service $Name"
- if($Name -ieq 'ArcGISGeoEvent'){
- Start-Sleep -Seconds 180
- }elseif( $Name -ieq 'ArcGIS Data Store'){
- Wait-ForUrl -Url "https://localhost:2443/arcgis/datastoreadmin/configure?f=json" -MaxWaitTimeInSeconds 180 -SleepTimeInSeconds 10 -HttpMethod 'GET' -Verbose
- }
- }catch {
- Write-Verbose "[WARNING] Starting Service $_"
+ Restart-ArcGISService -ServiceName $Name -Verbose
+
+ if($Name -ieq 'ArcGISGeoEvent'){
+ Start-Sleep -Seconds 180
+ }elseif( $Name -ieq 'ArcGIS Data Store'){
+ Wait-ForUrl -Url "https://localhost:2443/arcgis/datastoreadmin/configure?f=json" -MaxWaitTimeInSeconds 180 -SleepTimeInSeconds 10 -HttpMethod 'GET' -Verbose
}
}
}else{
@@ -630,7 +624,413 @@ function Test-Acl {
$result
}
+<#
+.Synopsis
+Grants log on as service right to the given user
+#>
+function Set-LogOnAsServicePolicy
+{
+ [CmdletBinding()]
+ param
+ (
+ [System.String]
+ $UserName
+ )
+
+ $logOnAsServiceText=@"
+ namespace LogOnAsServiceHelper
+ {
+ using Microsoft.Win32.SafeHandles;
+ using System;
+ using System.Runtime.ConstrainedExecution;
+ using System.Runtime.InteropServices;
+ using System.Security;
+
+ public class NativeMethods
+ {
+ #region constants
+ // from ntlsa.h
+ private const int POLICY_LOOKUP_NAMES = 0x00000800;
+ private const int POLICY_CREATE_ACCOUNT = 0x00000010;
+ private const uint ACCOUNT_ADJUST_SYSTEM_ACCESS = 0x00000008;
+ private const uint ACCOUNT_VIEW = 0x00000001;
+ private const uint SECURITY_ACCESS_SERVICE_LOGON = 0x00000010;
+
+ // from LsaUtils.h
+ private const uint STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034;
+
+ // from lmcons.h
+ private const int UNLEN = 256;
+ private const int DNLEN = 15;
+
+ // Extra characteres for "\","@" etc.
+ private const int EXTRA_LENGTH = 3;
+ #endregion constants
+
+ #region interop structures
+ ///
+ /// Used to open a policy, but not containing anything meaqningful
+ ///
+ [StructLayout(LayoutKind.Sequential)]
+ private struct LSA_OBJECT_ATTRIBUTES
+ {
+ public UInt32 Length;
+ public IntPtr RootDirectory;
+ public IntPtr ObjectName;
+ public UInt32 Attributes;
+ public IntPtr SecurityDescriptor;
+ public IntPtr SecurityQualityOfService;
+
+ public void Initialize()
+ {
+ this.Length = 0;
+ this.RootDirectory = IntPtr.Zero;
+ this.ObjectName = IntPtr.Zero;
+ this.Attributes = 0;
+ this.SecurityDescriptor = IntPtr.Zero;
+ this.SecurityQualityOfService = IntPtr.Zero;
+ }
+ }
+
+ ///
+ /// LSA string
+ ///
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+ private struct LSA_UNICODE_STRING
+ {
+ internal ushort Length;
+ internal ushort MaximumLength;
+ [MarshalAs(UnmanagedType.LPWStr)]
+ internal string Buffer;
+
+ internal void Set(string src)
+ {
+ this.Buffer = src;
+ this.Length = (ushort)(src.Length * sizeof(char));
+ this.MaximumLength = (ushort)(this.Length + sizeof(char));
+ }
+ }
+
+ ///
+ /// Structure used as the last parameter for LSALookupNames
+ ///
+ [StructLayout(LayoutKind.Sequential)]
+ private struct LSA_TRANSLATED_SID2
+ {
+ public uint Use;
+ public IntPtr SID;
+ public int DomainIndex;
+ public uint Flags;
+ };
+ #endregion interop structures
+
+ #region safe handles
+ ///
+ /// Handle for LSA objects including Policy and Account
+ ///
+ private class LsaSafeHandle : SafeHandleZeroOrMinusOneIsInvalid
+ {
+ [DllImport("advapi32.dll")]
+ private static extern uint LsaClose(IntPtr ObjectHandle);
+
+ ///
+ /// Prevents a default instance of the LsaPolicySafeHAndle class from being created.
+ ///
+ private LsaSafeHandle(): base(true)
+ {
+ }
+
+ ///
+ /// Calls NativeMethods.CloseHandle(handle)
+ ///
+ /// the return of NativeMethods.CloseHandle(handle)
+ [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
+ protected override bool ReleaseHandle()
+ {
+ long returnValue = LsaSafeHandle.LsaClose(this.handle);
+ return returnValue != 0;
+
+ }
+ }
+
+ ///
+ /// Handle for IntPtrs returned from Lsa calls that have to be freed with
+ /// LsaFreeMemory
+ ///
+ private class SafeLsaMemoryHandle : SafeHandleZeroOrMinusOneIsInvalid
+ {
+ [DllImport("advapi32")]
+ internal static extern int LsaFreeMemory(IntPtr Buffer);
+
+ private SafeLsaMemoryHandle() : base(true) { }
+
+ private SafeLsaMemoryHandle(IntPtr handle)
+ : base(true)
+ {
+ SetHandle(handle);
+ }
+
+ private static SafeLsaMemoryHandle InvalidHandle
+ {
+ get { return new SafeLsaMemoryHandle(IntPtr.Zero); }
+ }
+
+ override protected bool ReleaseHandle()
+ {
+ return SafeLsaMemoryHandle.LsaFreeMemory(handle) == 0;
+ }
+
+ internal IntPtr Memory
+ {
+ get
+ {
+ return this.handle;
+ }
+ }
+ }
+ #endregion safe handles
+
+ #region interop function declarations
+ ///
+ /// Opens LSA Policy
+ ///
+ [DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)]
+ private static extern uint LsaOpenPolicy(
+ IntPtr SystemName,
+ ref LSA_OBJECT_ATTRIBUTES ObjectAttributes,
+ uint DesiredAccess,
+ out LsaSafeHandle PolicyHandle
+ );
+ ///
+ /// Convert the name into a SID which is used in remaining calls
+ ///
+ [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
+ private static extern uint LsaLookupNames2(
+ LsaSafeHandle PolicyHandle,
+ uint Flags,
+ uint Count,
+ LSA_UNICODE_STRING[] Names,
+ out SafeLsaMemoryHandle ReferencedDomains,
+ out SafeLsaMemoryHandle Sids
+ );
-Export-ModuleMember -Function *-TargetResource
+ ///
+ /// Opens the LSA account corresponding to the user's SID
+ ///
+ [DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)]
+ private static extern uint LsaOpenAccount(
+ LsaSafeHandle PolicyHandle,
+ IntPtr Sid,
+ uint Access,
+ out LsaSafeHandle AccountHandle);
+
+ ///
+ /// Creates an LSA account corresponding to the user's SID
+ ///
+ [DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)]
+ private static extern uint LsaCreateAccount(
+ LsaSafeHandle PolicyHandle,
+ IntPtr Sid,
+ uint Access,
+ out LsaSafeHandle AccountHandle);
+
+ ///
+ /// Gets the LSA Account access
+ ///
+ [DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)]
+ private static extern uint LsaGetSystemAccessAccount(
+ LsaSafeHandle AccountHandle,
+ out uint SystemAccess);
+
+ ///
+ /// Sets the LSA Account access
+ ///
+ [DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)]
+ private static extern uint LsaSetSystemAccessAccount(
+ LsaSafeHandle AccountHandle,
+ uint SystemAccess);
+ #endregion interop function declarations
+
+ ///
+ /// Sets the Log On As A Service Policy for , if not already set.
+ ///
+ /// the user name we want to allow logging on as a service
+ /// If the is null or empty.
+ /// In the following cases:
+ /// Failure opening the LSA Policy.
+ /// The is too large.
+ /// Failure looking up the user name.
+ /// Failure opening LSA account (other than account not found).
+ /// Failure creating LSA account.
+ /// Failure getting LSA account policy access.
+ /// Failure setting LSA account policy access.
+ ///
+ public static void SetLogOnAsServicePolicy(string userName)
+ {
+ if (String.IsNullOrEmpty(userName))
+ {
+ throw new ArgumentNullException("userName");
+ }
+
+ LSA_OBJECT_ATTRIBUTES objectAttributes = new LSA_OBJECT_ATTRIBUTES();
+ objectAttributes.Initialize();
+
+ // All handles are delcared in advance so they can be closed on finally
+ LsaSafeHandle policyHandle = null;
+ SafeLsaMemoryHandle referencedDomains = null;
+ SafeLsaMemoryHandle sids = null;
+ LsaSafeHandle accountHandle = null;
+
+ try
+ {
+ uint status = LsaOpenPolicy(
+ IntPtr.Zero,
+ ref objectAttributes,
+ POLICY_LOOKUP_NAMES | POLICY_CREATE_ACCOUNT,
+ out policyHandle);
+
+ if (status != 0)
+ {
+ throw new InvalidOperationException("CannotOpenPolicyErrorMessage");
+ }
+
+ // Unicode strings have a maximum length of 32KB. We don't want to create
+ // LSA strings with more than that. User lengths are much smaller so this check
+ // ensures userName's length is useful
+ if (userName.Length > UNLEN + DNLEN + EXTRA_LENGTH)
+ {
+ throw new InvalidOperationException("UserNameTooLongErrorMessage");
+ }
+
+ LSA_UNICODE_STRING lsaUserName = new LSA_UNICODE_STRING();
+ lsaUserName.Set(userName);
+
+ LSA_UNICODE_STRING[] names = new LSA_UNICODE_STRING[1];
+ names[0].Set(userName);
+
+ status = LsaLookupNames2(
+ policyHandle,
+ 0,
+ 1,
+ new LSA_UNICODE_STRING[] { lsaUserName },
+ out referencedDomains,
+ out sids);
+
+ if (status != 0)
+ {
+ throw new InvalidOperationException("CannotLookupNamesErrorMessage");
+ }
+
+ LSA_TRANSLATED_SID2 sid = (LSA_TRANSLATED_SID2)Marshal.PtrToStructure(sids.Memory, typeof(LSA_TRANSLATED_SID2));
+
+ status = LsaOpenAccount(policyHandle,
+ sid.SID,
+ ACCOUNT_VIEW | ACCOUNT_ADJUST_SYSTEM_ACCESS,
+ out accountHandle);
+
+ uint currentAccess = 0;
+
+ if (status == 0)
+ {
+ status = LsaGetSystemAccessAccount(accountHandle, out currentAccess);
+
+ if (status != 0)
+ {
+ throw new InvalidOperationException("CannotGetAccountAccessErrorMessage");
+ }
+
+ }
+ else if (status == STATUS_OBJECT_NAME_NOT_FOUND)
+ {
+ status = LsaCreateAccount(
+ policyHandle,
+ sid.SID,
+ ACCOUNT_ADJUST_SYSTEM_ACCESS,
+ out accountHandle);
+
+ if (status != 0)
+ {
+ throw new InvalidOperationException("CannotCreateAccountAccessErrorMessage");
+ }
+ }
+ else
+ {
+ throw new InvalidOperationException("CannotOpenAccountErrorMessage");
+ }
+
+ if ((currentAccess & SECURITY_ACCESS_SERVICE_LOGON) == 0)
+ {
+ status = LsaSetSystemAccessAccount(
+ accountHandle,
+ currentAccess | SECURITY_ACCESS_SERVICE_LOGON);
+ if (status != 0)
+ {
+ throw new InvalidOperationException("CannotSetAccountAccessErrorMessage");
+ }
+ }
+ }
+ finally
+ {
+ if (policyHandle != null) { policyHandle.Close(); }
+ if (referencedDomains != null) { referencedDomains.Close(); }
+ if (sids != null) { sids.Close(); }
+ if (accountHandle != null) { accountHandle.Close(); }
+ }
+ }
+ }
+ }
+"@
+
+ try
+ {
+ $existingType=[LogOnAsServiceHelper.NativeMethods]
+ }
+ catch
+ {
+ $logOnAsServiceText=$logOnAsServiceText.Replace("CannotOpenPolicyErrorMessage",$LocalizedData.CannotOpenPolicyErrorMessage)
+ $logOnAsServiceText=$logOnAsServiceText.Replace("UserNameTooLongErrorMessage",$LocalizedData.UserNameTooLongErrorMessage)
+ $logOnAsServiceText=$logOnAsServiceText.Replace("CannotLookupNamesErrorMessage",$LocalizedData.CannotLookupNamesErrorMessage)
+ $logOnAsServiceText=$logOnAsServiceText.Replace("CannotOpenAccountErrorMessage",$LocalizedData.CannotOpenAccountErrorMessage)
+ $logOnAsServiceText=$logOnAsServiceText.Replace("CannotCreateAccountAccessErrorMessage",$LocalizedData.CannotCreateAccountAccessErrorMessage)
+ $logOnAsServiceText=$logOnAsServiceText.Replace("CannotGetAccountAccessErrorMessage",$LocalizedData.CannotGetAccountAccessErrorMessage)
+ $logOnAsServiceText=$logOnAsServiceText.Replace("CannotSetAccountAccessErrorMessage",$LocalizedData.CannotSetAccountAccessErrorMessage)
+ Add-Type $logOnAsServiceText -Verbose
+ }
+
+ if($userName.StartsWith(".\"))
+ {
+ $userName = $userName.Substring(2)
+ }
+
+ try
+ {
+ [LogOnAsServiceHelper.NativeMethods]::SetLogOnAsServicePolicy($userName)
+ }
+ catch
+ {
+ $errorMessage = $LocalizedData.ErrorSetingLogOnAsServiceRightsForUser -f $userName,$_.Exception.Message
+
+ $errorCategory=[System.Management.Automation.ErrorCategory]::InvalidArgument
+ $exception = New-Object System.ArgumentException $errorMessage;
+ $errorRecord = New-Object System.Management.Automation.ErrorRecord $exception,"ErrorSetingLogOnAsServiceRightsForUser", $errorCategory, $null
+ throw $errorRecord
+ }
+}
+
+data LocalizedData
+{
+ # culture="en-US"
+ ConvertFrom-StringData @"
+ErrorSetingLogOnAsServiceRightsForUser=Error granting '{0}' the right to log on as a service. Message: '{1}'.
+CannotOpenPolicyErrorMessage=Cannot open policy manager
+UserNameTooLongErrorMessage=User name is too long
+CannotLookupNamesErrorMessage=Failed to lookup user name
+CannotOpenAccountErrorMessage=Failed to open policy for user
+CannotCreateAccountAccessErrorMessage=Failed to create policy for user
+CannotGetAccountAccessErrorMessage=Failed to get user policy rights
+CannotSetAccountAccessErrorMessage=Failed to set user policy rights
+"@
+}
+Export-ModuleMember -Function *-TargetResource
\ No newline at end of file
diff --git a/Modules/ArcGIS/License.txt b/Modules/ArcGIS/License.txt
index 508286bf..b1a429ba 100644
--- a/Modules/ArcGIS/License.txt
+++ b/Modules/ArcGIS/License.txt
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
- Copyright (c) 2018-2021 Environmental Systems Research Institute, Inc.
+ Copyright (c) 2018-2022 Environmental Systems Research Institute, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-DualMachine.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-DualMachine.json
new file mode 100644
index 00000000..b52aeb5a
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-DualMachine.json
@@ -0,0 +1,94 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name 1]",
+ "DataStoreTypes": [
+ "Relational"
+ ],
+ "Role": [
+ "DataStore"
+ ]
+ },
+ {
+ "NodeName": "[Machine Name 2]",
+ "Role": [
+ "Server",
+ "Portal",
+ "FileShare"
+ ]
+ },
+ {
+ "NodeName": "[Machine Name 3]",
+ "Role": [
+ "Server",
+ "Portal",
+ "ServerWebAdaptor",
+ "PortalWebAdaptor"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "FileShareLocalPath": "[File Share Local Path]",
+ "FileShareName": "[File Share Name]",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "\\\\[Fileshare Machine Name 1]\\[Fileshare Name]\\arcgisserver\\directories",
+ "ConfigStoreLocation": "\\\\[Fileshare Machine Name 1]\\[Fileshare Name]\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal ]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal"
+ },
+ "ContentDirectoryLocation": "\\\\[File Share Machine 1]\\[File Share Name]\\arcgisportal\\content",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]"
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-MultiMachine.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-MultiMachine.json
new file mode 100644
index 00000000..4b6e26c5
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-MultiMachine.json
@@ -0,0 +1,125 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine 1 Name]",
+ "Role": [
+ "FileShare"
+ ]
+ },
+ {
+ "NodeName": "[Machine 2 Name]",
+ "DataStoreTypes": [
+ "Relational"
+ ],
+ "Role": [
+ "DataStore"
+ ]
+ },
+ {
+ "NodeName": "[Machine 3 Name]",
+ "Role": [
+ "ServerWebAdaptor",
+ "PortalWebAdaptor"
+ ]
+ },
+ {
+ "NodeName": "[Machine 4 Name]",
+ "Role": [
+ "ServerWebAdaptor",
+ "PortalWebAdaptor"
+ ]
+ },
+ {
+ "NodeName": "[Machine 5 Name]",
+ "Role": [
+ "Portal"
+ ]
+ },
+ {
+ "NodeName": "[Machine 6 Name]",
+ "Role": [
+ "Portal"
+ ]
+ },
+ {
+ "NodeName": "[Machine 7 Name]",
+ "Role": [
+ "Server"
+ ]
+ },
+ {
+ "NodeName": "[Machine 8 Name]",
+ "Role": [
+ "Server"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "FileShareLocalPath": "[File Share Local Path]",
+ "FileShareName": "[File Share Name]",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "\\\\[Fileshare Machine Name 1]\\[Fileshare Name]\\arcgisserver\\directories",
+ "ConfigStoreLocation": "\\\\[Fileshare Machine Name 1]\\[Fileshare Name]\\arcgisserver\\config-store",
+ "ExternalLoadBalancer": "",
+ "InternalLoadBalancer": "",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal ]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal"
+ },
+ "ContentDirectoryLocation": "\\\\[File Share Machine 1]\\[File Share Name]\\arcgisportal\\content",
+ "ExternalLoadBalancer": "",
+ "InternalLoadBalancer": "",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]"
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-CloudStore.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-CloudStore.json
new file mode 100644
index 00000000..9447a16f
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-CloudStore.json
@@ -0,0 +1,214 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "DataStoreTypes": [
+ "Relational"
+ ],
+ "Role": [
+ "Server",
+ "Portal",
+ "DataStore",
+ "ServerWebAdaptor",
+ "PortalWebAdaptor"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "Password": "[ServiceAccount Password]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ },
+ "ADServiceUser": {
+ "UserName": "[ADServiceUser Username - Active Directory Service user for enabling use of Integrated Windows Authentication with your portal.]",
+ "Password": "[ADServiceUser Password]"
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "PatchesDir": "[Path to Directory with Patches for Server]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ],
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "LocalRepositoryPath": "C:\\arcgisserver\\local",
+ "ServerLogsLocation": "C:\\arcgisserver\\logs",
+ "ServerDirectories": [
+ {
+ "name": "arcgiscache",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgiscache",
+ "directoryType": "CACHE",
+ "cleanupMode": "NONE",
+ "maxFileAge": 0
+ },
+ {
+ "name": "arcgisjobs",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgisjobs",
+ "directoryType": "JOBS",
+ "cleanupMode": "TIME_ELAPSED_SINCE_LAST_MODIFIED",
+ "maxFileAge": 360
+ },
+ {
+ "name": "arcgisoutput",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgisoutput",
+ "directoryType": "OUTPUT",
+ "cleanupMode": "TIME_ELAPSED_SINCE_LAST_MODIFIED",
+ "maxFileAge": 10
+ },
+ {
+ "name": "arcgissystem",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgissystem",
+ "directoryType": "SYSTEM",
+ "cleanupMode": "NONE",
+ "maxFileAge": 0
+ }
+ ],
+ "RegisteredDirectories": [
+ {
+ "name": "BasemapsCacheDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\cache",
+ "directoryType": "CACHE"
+ },
+ {
+ "name": "TestOutputDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\testOutput",
+ "directoryType": "OUTPUT"
+ },
+ {
+ "name": "TestJobsDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\testJobs",
+ "directoryType": "JOBS"
+ }
+ ],
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ },
+ "ConfigStoreCloudStorageAccount":{
+ "UserName": "[CloudStorageAccount Account Name/ Access Id]",
+ "Password": "[CloudStorageAccount SAS Token/Secret Key/Password ]",
+ "CloudStorageType": "[Required - 'AzureBlob','AzureFiles','AWSS3DynamoDB']",
+ "AzureFileShareName": "[Required if CloudStorageType is 'AzureFiles']",
+ "CloudNamespace": "[Required if using cloud storage - Unique identifiable string for your deployment to avoid conflicts.The namespace used for the S3 bucket/Azure Blob Storage Container must be unique for this ArcGIS Server site. ArcGIS appends the text arcgis-config-store- to the name you provide]",
+ "AWSRegion": "[Required if CloudStorageType is 'AWSS3DynamoDB']"
+ },
+ "ServerDirectoriesCloudStorageAccount":{
+ "UserName": "[CloudStorageAccount Account Name/ Access Id]",
+ "Password": "[CloudStorageAccount SAS Token/Secret Key/Password ]",
+ "CloudStorageType": "AzureFiles",
+ "AzureFileShareName": "[Required if CloudStorageType is 'AzureFiles']",
+ "CloudNamespace": "[Required id using cloud storage - Unique identifiable string for your deployment to avoid conflicts]"
+ }
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal ]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal",
+ "PatchesDir": "[Path to Directory with Patches for Portal]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "ContentDirectoryLocation":"C:\\arcgisportal\\content",
+ "EnableAutomaticAccountCreation": true,
+ "DefaultRoleForUser": "[Optional - Values: account_user | account_publisher | ]",
+ "DefaultUserLicenseTypeIdForUser": "[Optional (Valid for 10.7 and later) - Values: fieldWorkerUT | GISProfessionalStdUT | GISProfessionalBasicUT | GISProfessionalAdvUT | creatorUT | editorUT | viewerUT]",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ },
+ "PortalContentCloudStorageAccount":{
+ "UserName": "[CloudStorageAccount Account Name/ Access Id]",
+ "Password": "[CloudStorageAccount SAS Token/Secret Key/Password ]",
+ "CloudStorageType": "[Required - 'AzureBlob','AzureFiles','AWSS3DynamoDB']",
+ "AzureFileShareName": "[Required if CloudStorageType is 'AzureFiles']",
+ "CloudNamespace": "[Required if using cloud storage - Unique identifiable string for your deployment to avoid conflicts. The namespace used for the Azure Blob Storage Container must be unique for this ArcGIS portal site. For Azure, Powershell DSC Module will prepend the text arcgis-portal-content- to the name you provide. For AWS, this variable corresponds to Bucket Name which should have been created before running this module]",
+ "AWSRegion": "[Required if CloudStorageType is 'AWSS3DynamoDB']"
+
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]",
+ "PatchesDir": "[Path to Directory with Patches for DataStore]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "Backups":{
+ "Relational":[{
+ "Name": "[Required - Backup Name]",
+ "Type": "[Required - fs / s3 /Azure]",
+ "Location": "[Required - fs - fileshare location / s3 - Bucket Name / Azure - Container Name ]",
+ "ForceBackupLocationUpdate": false,
+ "IsDefault": false,
+ "CloudStorageAccount":{
+ "UserName": "[s3 - AWS Access Id / Azure - Cloud Storage Account Account Name/ ]",
+ "Password": "[s3 - AWS secret key / Azure - Cloud Storage Secret Key]",
+ "PasswordFile": "[s3 - AWS secret key / Azure - Cloud Storage Secret Key]",
+ "ForceUpdate": false
+ }
+ }],
+ "TileCache":[{
+ "Name": "[Required - Backup Name]",
+ "Type": "[Required - fs / s3 /Azure]",
+ "Location": "[Required - fs - fileshare location / s3 - Bucket Name / Azure -Container Name ]",
+ "IsDefault": false,
+ "CloudStorageAccount":{
+ "UserName": "[s3 - AWS Access Id / Azure - Cloud Storage Account Account Name/ ]",
+ "Password": "[s3 - AWS secret key / Azure - Cloud Storage Secret Key]",
+ "PasswordFile": "[s3 - AWS secret key / Azure - Cloud Storage Secret Key]",
+ "ForceUpdate": false
+ }
+ }],
+ "SpatioTemporal":[{
+ "Name": "[Required - Backup Name]",
+ "Type": "[Required - fs / s3 /Azure]",
+ "Location": "[ fs - fileshare location / s3 - Bucket Name / Azure -Container Name ]",
+ "IsDefault": false,
+ "CloudStorageAccount":{
+ "UserName": "[s3 - AWS Access Id / Azure - Cloud Storage Account Account Name/ ]",
+ "Password": "[s3 - AWS secret key / Azure - Cloud Storage Secret Key]",
+ "PasswordFile": "[s3 - AWS secret key / Azure - Cloud Storage Secret Key]",
+ "ForceUpdate": false
+ }
+ }]
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]",
+ "PatchesDir": "[Path to Directory with Patches for Web Adaptor]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-Insights.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-Insights.json
new file mode 100644
index 00000000..897551b0
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-Insights.json
@@ -0,0 +1,174 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "DataStoreTypes": [
+ "Relational"
+ ],
+ "Role": [
+ "Server",
+ "Portal",
+ "DataStore",
+ "ServerWebAdaptor",
+ "PortalWebAdaptor"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "InsightsVersion": "[Version of ArcGIS Insights]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "Password": "[ServiceAccount Password]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ },
+ "ADServiceUser": {
+ "UserName": "[ADServiceUser Username - Active Directory Service user for enabling use of Integrated Windows Authentication with your portal.]",
+ "Password": "[ADServiceUser Password]"
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "PatchesDir": "[Path to Directory with Patches for Server]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ],
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "LocalRepositoryPath": "C:\\arcgisserver\\local",
+ "ServerLogsLocation": "C:\\arcgisserver\\logs",
+ "ServerDirectories": [
+ {
+ "name": "arcgiscache",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgiscache",
+ "directoryType": "CACHE",
+ "cleanupMode": "NONE",
+ "maxFileAge": 0
+ },
+ {
+ "name": "arcgisjobs",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgisjobs",
+ "directoryType": "JOBS",
+ "cleanupMode": "TIME_ELAPSED_SINCE_LAST_MODIFIED",
+ "maxFileAge": 360
+ },
+ {
+ "name": "arcgisoutput",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgisoutput",
+ "directoryType": "OUTPUT",
+ "cleanupMode": "TIME_ELAPSED_SINCE_LAST_MODIFIED",
+ "maxFileAge": 10
+ },
+ {
+ "name": "arcgissystem",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgissystem",
+ "directoryType": "SYSTEM",
+ "cleanupMode": "NONE",
+ "maxFileAge": 0
+ }
+ ],
+ "RegisteredDirectories": [
+ {
+ "name": "BasemapsCacheDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\cache",
+ "directoryType": "CACHE"
+ },
+ {
+ "name": "TestOutputDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\testOutput",
+ "directoryType": "OUTPUT"
+ },
+ {
+ "name": "TestJobsDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\testJobs",
+ "directoryType": "JOBS"
+ }
+ ],
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal ]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal",
+ "PatchesDir": "[Path to Directory with Patches for Portal]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "ContentDirectoryLocation":"C:\\arcgisportal\\content",
+ "EnableAutomaticAccountCreation": true,
+ "DefaultRoleForUser": "[Optional - Values: account_user | account_publisher | ]",
+ "DefaultUserLicenseTypeIdForUser": "[Optional (Valid for 10.7 and later) - Values: fieldWorkerUT | GISProfessionalStdUT | GISProfessionalBasicUT | GISProfessionalAdvUT | creatorUT | editorUT | viewerUT]",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ },
+ "EmailSettings":{
+ "SMTPServerAddress":"[SMTP Server Host Address]",
+ "From":"[SMTP Server Host Email From]",
+ "Label":"[SMTP Server Host Email From Label]",
+ "AuthenticationRequired":"[SMTP Server Host Authentication required flag - False | True]",
+ "SMTPPort":"[SMTP Server Host Port]",
+ "UserName": "[SMTP Server Host Authentication Username]",
+ "Password": "[SMTP Server Host Authentication Password]",
+ "PasswordFilePath": "[SMTP Server Host Authentication Password File Path]",
+ "EncryptionMethod": "[SMTP Server Host Encryption Method - SSL,TLS,NONE]"
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "EnablePointInTimeRecovery": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]",
+ "PatchesDir": "[Path to Directory with Patches for DataStore]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]",
+ "PatchesDir": "[Path to Directory with Patches for Web Adaptor]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "WebSiteId": 1
+ },
+ "Insights": {
+ "Installer": {
+ "Path": "[Insights Installer Path]",
+ "PatchesDir": "[Path to Directory with Patches for Insights]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-MultipleServerRoles.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-MultipleServerRoles.json
new file mode 100644
index 00000000..2e86c799
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-MultipleServerRoles.json
@@ -0,0 +1,188 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "DataStoreTypes": [
+ "Relational"
+ ],
+ "Role": [
+ "Server",
+ "Portal",
+ "DataStore",
+ "ServerWebAdaptor",
+ "PortalWebAdaptor"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "ServerRole": "GeneralPurposeServer",
+ "AdditionalServerRoles":[
+ "Geoevent",
+ "RasterAnalytics",
+ "WorkflowManagerServer",
+ "GeoAnalytics",
+ "ImageHosting"
+ ],
+ "Credentials": {
+ "ServiceAccount": {
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "Password": "[ServiceAccount Password]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ },
+ "ADServiceUser": {
+ "UserName": "[ADServiceUser Username - Active Directory Service user for enabling use of Integrated Windows Authentication with your portal.]",
+ "Password": "[ADServiceUser Password]"
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "PatchesDir": "[Path to Directory with Patches for Server]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ],
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "LocalRepositoryPath": "C:\\arcgisserver\\local",
+ "ServerLogsLocation": "C:\\arcgisserver\\logs",
+ "ServerDirectories": [
+ {
+ "name": "arcgiscache",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgiscache",
+ "directoryType": "CACHE",
+ "cleanupMode": "NONE",
+ "maxFileAge": 0
+ },
+ {
+ "name": "arcgisjobs",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgisjobs",
+ "directoryType": "JOBS",
+ "cleanupMode": "TIME_ELAPSED_SINCE_LAST_MODIFIED",
+ "maxFileAge": 360
+ },
+ {
+ "name": "arcgisoutput",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgisoutput",
+ "directoryType": "OUTPUT",
+ "cleanupMode": "TIME_ELAPSED_SINCE_LAST_MODIFIED",
+ "maxFileAge": 10
+ },
+ {
+ "name": "arcgissystem",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgissystem",
+ "directoryType": "SYSTEM",
+ "cleanupMode": "NONE",
+ "maxFileAge": 0
+ }
+ ],
+ "RegisteredDirectories": [
+ {
+ "name": "BasemapsCacheDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\cache",
+ "directoryType": "CACHE"
+ },
+ {
+ "name": "TestOutputDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\testOutput",
+ "directoryType": "OUTPUT"
+ },
+ {
+ "name": "TestJobsDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\testJobs",
+ "directoryType": "JOBS"
+ }
+ ],
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "WorkflowManagerServer": {
+ "LicenseFilePath": "[License File Path - Workflow Manager Server ]",
+ "Installer": {
+ "Path": "[Workflow Manager Server Installer Path]"
+ }
+ },
+ "GeoEventServer": {
+ "LicenseFilePath": "[License File Path - GeoEvent Server ]",
+ "Installer": {
+ "Path": "[GeoEvent Server Installer Path]",
+ "PatchesDir": "[Path to Directory with Patches for GeoEvent Server]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "EnableGeoeventSDK": "[ Optional - True | False(Default) - Enables GeoEvent SDK during installation.]"
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal ]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal",
+ "PatchesDir": "[Path to Directory with Patches for Portal]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "ContentDirectoryLocation":"C:\\arcgisportal\\content",
+ "EnableAutomaticAccountCreation": true,
+ "DefaultRoleForUser": "[Optional - Values: account_user | account_publisher | ]",
+ "DefaultUserLicenseTypeIdForUser": "[Optional (Valid for 10.7 and later) - Values: fieldWorkerUT | GISProfessionalStdUT | GISProfessionalBasicUT | GISProfessionalAdvUT | creatorUT | editorUT | viewerUT]",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ },
+ "EmailSettings":{
+ "SMTPServerAddress":"[SMTP Server Host Address]",
+ "From":"[SMTP Server Host Email From]",
+ "Label":"[SMTP Server Host Email From Label]",
+ "AuthenticationRequired":"[SMTP Server Host Authentication required flag - False | True]",
+ "SMTPPort":"[SMTP Server Host Port]",
+ "UserName": "[SMTP Server Host Authentication Username]",
+ "Password": "[SMTP Server Host Authentication Password]",
+ "PasswordFilePath": "[SMTP Server Host Authentication Password File Path]",
+ "EncryptionMethod": "[SMTP Server Host Encryption Method - SSL,TLS,NONE]"
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "EnablePointInTimeRecovery": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]",
+ "PatchesDir": "[Path to Directory with Patches for DataStore]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]",
+ "PatchesDir": "[Path to Directory with Patches for Web Adaptor]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "WebSiteId": 1
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-WorkflowManagerWebapp-10.8.1-10.9.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-WorkflowManagerWebapp-10.8.1-10.9.json
new file mode 100644
index 00000000..a1fa6c20
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine-WorkflowManagerWebapp-10.8.1-10.9.json
@@ -0,0 +1,165 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "DataStoreTypes": [
+ "Relational"
+ ],
+ "Role": [
+ "Server",
+ "Portal",
+ "DataStore",
+ "ServerWebAdaptor",
+ "PortalWebAdaptor"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment - 10.8.1 or 10.9]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "Password": "[ServiceAccount Password]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ },
+ "ADServiceUser": {
+ "UserName": "[ADServiceUser Username - Active Directory Service user for enabling use of Integrated Windows Authentication with your portal.]",
+ "Password": "[ADServiceUser Password]"
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "PatchesDir": "[Path to Directory with Patches for Server]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ],
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "LocalRepositoryPath": "C:\\arcgisserver\\local",
+ "ServerLogsLocation": "C:\\arcgisserver\\logs",
+ "ServerDirectories": [
+ {
+ "name": "arcgiscache",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgiscache",
+ "directoryType": "CACHE",
+ "cleanupMode": "NONE",
+ "maxFileAge": 0
+ },
+ {
+ "name": "arcgisjobs",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgisjobs",
+ "directoryType": "JOBS",
+ "cleanupMode": "TIME_ELAPSED_SINCE_LAST_MODIFIED",
+ "maxFileAge": 360
+ },
+ {
+ "name": "arcgisoutput",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgisoutput",
+ "directoryType": "OUTPUT",
+ "cleanupMode": "TIME_ELAPSED_SINCE_LAST_MODIFIED",
+ "maxFileAge": 10
+ },
+ {
+ "name": "arcgissystem",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgissystem",
+ "directoryType": "SYSTEM",
+ "cleanupMode": "NONE",
+ "maxFileAge": 0
+ }
+ ],
+ "RegisteredDirectories": [
+ {
+ "name": "BasemapsCacheDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\cache",
+ "directoryType": "CACHE"
+ },
+ {
+ "name": "TestOutputDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\testOutput",
+ "directoryType": "OUTPUT"
+ },
+ {
+ "name": "TestJobsDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\testJobs",
+ "directoryType": "JOBS"
+ }
+ ],
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal ]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal",
+ "PatchesDir": "[Path to Directory with Patches for Portal]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "ContentDirectoryLocation":"C:\\arcgisportal\\content",
+ "EnableAutomaticAccountCreation": true,
+ "DefaultRoleForUser": "[Optional - Values: account_user | account_publisher | ]",
+ "DefaultUserLicenseTypeIdForUser": "[Optional (Valid for 10.7 and later) - Values: fieldWorkerUT | GISProfessionalStdUT | GISProfessionalBasicUT | GISProfessionalAdvUT | creatorUT | editorUT | viewerUT]",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ },
+ "EmailSettings":{
+ "SMTPServerAddress":"[SMTP Server Host Address]",
+ "From":"[SMTP Server Host Email From]",
+ "Label":"[SMTP Server Host Email From Label]",
+ "AuthenticationRequired":"[SMTP Server Host Authentication required flag - False | True]",
+ "SMTPPort":"[SMTP Server Host Port]",
+ "UserName": "[SMTP Server Host Authentication Username]",
+ "Password": "[SMTP Server Host Authentication Password]",
+ "PasswordFilePath": "[SMTP Server Host Authentication Password File Path]",
+ "EncryptionMethod": "[SMTP Server Host Encryption Method - SSL,TLS,NONE]"
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "EnablePointInTimeRecovery": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]",
+ "PatchesDir": "[Path to Directory with Patches for DataStore]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ },
+ "WebSiteId": 1
+ },
+ "WorkflowManagerWebApp": {
+ "Installer": {
+ "Path": "[Workflow Manager Web App Installer Path]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine.json
new file mode 100644
index 00000000..a488edf7
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-SingleMachine.json
@@ -0,0 +1,164 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "DataStoreTypes": [
+ "Relational"
+ ],
+ "Role": [
+ "Server",
+ "Portal",
+ "DataStore",
+ "ServerWebAdaptor",
+ "PortalWebAdaptor"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "Password": "[ServiceAccount Password]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ },
+ "ADServiceUser": {
+ "UserName": "[ADServiceUser Username - Active Directory Service user for enabling use of Integrated Windows Authentication with your portal.]",
+ "Password": "[ADServiceUser Password]"
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "PatchesDir": "[Path to Directory with Patches for Server]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ],
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "LocalRepositoryPath": "C:\\arcgisserver\\local",
+ "ServerLogsLocation": "C:\\arcgisserver\\logs",
+ "ServerDirectories": [
+ {
+ "name": "arcgiscache",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgiscache",
+ "directoryType": "CACHE",
+ "cleanupMode": "NONE",
+ "maxFileAge": 0
+ },
+ {
+ "name": "arcgisjobs",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgisjobs",
+ "directoryType": "JOBS",
+ "cleanupMode": "TIME_ELAPSED_SINCE_LAST_MODIFIED",
+ "maxFileAge": 360
+ },
+ {
+ "name": "arcgisoutput",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgisoutput",
+ "directoryType": "OUTPUT",
+ "cleanupMode": "TIME_ELAPSED_SINCE_LAST_MODIFIED",
+ "maxFileAge": 10
+ },
+ {
+ "name": "arcgissystem",
+ "physicalPath": "C:\\arcgisserver\\directories\\arcgissystem",
+ "directoryType": "SYSTEM",
+ "cleanupMode": "NONE",
+ "maxFileAge": 0
+ }
+ ],
+ "RegisteredDirectories": [
+ {
+ "name": "BasemapsCacheDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\cache",
+ "directoryType": "CACHE"
+ },
+ {
+ "name": "TestOutputDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\testOutput",
+ "directoryType": "OUTPUT"
+ },
+ {
+ "name": "TestJobsDir",
+ "physicalPath": "C:\\arcgisserver\\additionaldirs\\testJobs",
+ "directoryType": "JOBS"
+ }
+ ],
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal ]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal",
+ "PatchesDir": "[Path to Directory with Patches for Portal]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "ContentDirectoryLocation":"C:\\arcgisportal\\content",
+ "EnableAutomaticAccountCreation": true,
+ "DefaultRoleForUser": "[Optional - Values: account_user | account_publisher | ]",
+ "DefaultUserLicenseTypeIdForUser": "[Optional (Valid for 10.7 and later) - Values: fieldWorkerUT | GISProfessionalStdUT | GISProfessionalBasicUT | GISProfessionalAdvUT | creatorUT | editorUT | viewerUT]",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ },
+ "EmailSettings":{
+ "SMTPServerAddress":"[SMTP Server Host Address]",
+ "From":"[SMTP Server Host Email From]",
+ "Label":"[SMTP Server Host Email From Label]",
+ "AuthenticationRequired":"[SMTP Server Host Authentication required flag - False | True]",
+ "SMTPPort":"[SMTP Server Host Port]",
+ "UserName": "[SMTP Server Host Authentication Username]",
+ "Password": "[SMTP Server Host Authentication Password]",
+ "PasswordFilePath": "[SMTP Server Host Authentication Password File Path]",
+ "EncryptionMethod": "[SMTP Server Host Encryption Method - SSL,TLS,NONE]"
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "EnablePointInTimeRecovery": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]",
+ "PatchesDir": "[Path to Directory with Patches for DataStore]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]",
+ "PatchesDir": "[Path to Directory with Patches for Web Adaptor]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "WebSiteId": 1
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-per-node-licenses.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-per-node-licenses.json
new file mode 100644
index 00000000..1e1ee416
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-per-node-licenses.json
@@ -0,0 +1,96 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine 1 Name]",
+ "DataStoreTypes": [
+ "Relational",
+ "SpatioTemporal"
+ ],
+ "Role": [
+ "DataStore"
+ ]
+ },
+ {
+ "NodeName": "[Machine 2 Name]",
+ "Role": [
+ "Portal",
+ "PortalWebAdaptor"
+ ],
+ "PortalLicenseFilePath": "[OPTIONAL - Valid Parameter for 10.6.1 and below]",
+ "PortalLicensePassword": "[OPTIONAL - Valid Parameter for 10.6.1 and below]"
+ },
+ {
+ "NodeName": "[Machine 3 Name]",
+ "Role": [
+ "Server",
+ "ServerWebAdaptor"
+ ],
+ "ServerLicenseFilePath": "[OPTIONAL]",
+ "ServerLicensePassword": "[OPTIONAL]"
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server - Will be over ridden by Node Level Licence File ]",
+ "LicensePassword": "[License Password - Server - OPTIONAL] - Will be over ridden by Node Level Password",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal - Will be over ridden by Node Level Licence File]",
+ "LicensePassword": "[License Password - Portal - OPTIONAL - Will be over ridden by Node Level Password - Valid Parameter for 10.6.1 and below]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal"
+ },
+ "ContentDirectoryLocation":"C:\\arcgisportal\\content",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]"
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-ssl-per-Node-Example1.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-ssl-per-Node-Example1.json
new file mode 100644
index 00000000..9fafd44f
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-ssl-per-Node-Example1.json
@@ -0,0 +1,139 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine 1 Name]",
+ "DataStoreTypes": [
+ "Relational",
+ "SpatioTemporal"
+ ],
+ "Role": [
+ "DataStore"
+ ],
+ "SslCertificates": [
+ {
+ "Path": "[DataStore SSL Certificate Path]",
+ "Password": "[DataStore SSL Password]",
+ "CNameFQDN": "[DataStore CName Alias]",
+ "Target": [
+ "DataStore"
+ ]
+ }
+ ]
+ },
+ {
+ "NodeName": "[Machine 2 Name]",
+ "Role": [
+ "Server",
+ "ServerWebAdaptor"
+ ],
+ "SslCertificates": [
+ {
+ "Path": "[Server SSL Certificate Path]",
+ "Password": "[Server SSL Password]",
+ "CNameFQDN": "[Server CName Alias]",
+ "Target": [
+ "Server"
+ ]
+ },
+ {
+ "Path": "[Server WebAdaptor SSL Certificate Path]",
+ "Password": "[Server WebAdaptor SSL Password]",
+ "CNameFQDN": "[Server WebAdaptor CName Alias]",
+ "Target": [
+ "WebAdaptor"
+ ]
+ }
+ ]
+ },
+ {
+ "NodeName": "[Machine 3 Name]",
+ "Role": [
+ "Portal",
+ "PortalWebAdaptor"
+ ],
+ "SslCertificates": [
+ {
+ "Path": "[Common Cert for Portal and Portal Webadaptor SSL Certificate Path]",
+ "Password": "[Common Cert SSL Password]",
+ "CNameFQDN": "[Common Cert CName Alias]",
+ "Target": [
+ "Portal",
+ "WebAdaptor"
+ ]
+ }
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "SslRootOrIntermediate": [
+ {
+ "Alias": "[ROOT-CA Alias]",
+ "Path": "[ROOT-CA SSL Certificate Path]"
+ },
+ {
+ "Alias": "[Intermediate-CA Alias]",
+ "Path": "[Intermediate-CA SSL Certificate Path]"
+ }
+ ],
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal ]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal"
+ },
+ "ContentDirectoryLocation":"C:\\arcgisportal\\content",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]"
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-ssl-per-Node-Example2.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-ssl-per-Node-Example2.json
new file mode 100644
index 00000000..d9b9ba2f
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-ssl-per-Node-Example2.json
@@ -0,0 +1,138 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine 1 Name]",
+ "DataStoreTypes": [
+ "Relational",
+ "SpatioTemporal"
+ ],
+ "Role": [
+ "DataStore",
+ "Server"
+ ],
+ "SslCertificates": [
+ {
+ "Path": "[Server SSL Certificate Path]",
+ "Password": "[Server SSL Password]",
+ "CNameFQDN": "[Server CName Alias]",
+ "Target": [
+ "Server"
+ ]
+ },
+ {
+ "Path": "[DataStore SSL Certificate Path]",
+ "Password": "[DataStore SSL Password]",
+ "CNameFQDN": "[DataStore CName Alias]",
+ "Target": [
+ "DataStore"
+ ]
+ }
+ ]
+ },
+ {
+ "NodeName": "[Machine 2 Name]",
+ "Role": [
+ "ServerWebAdaptor",
+ "PortalWebAdaptor"
+ ],
+ "SslCertificates": [
+ {
+ "Path": "[WebAdaptor SSL Certificate Path]",
+ "Password": "[WebAdaptor SSL Password]",
+ "CNameFQDN": "[WebAdaptor CName Alias]",
+ "Target": [
+ "WebAdaptor"
+ ]
+ }
+ ]
+ },
+ {
+ "NodeName": "[Machine 3 Name]",
+ "Role": [
+ "Portal"
+ ],
+ "SslCertificates": [
+ {
+ "Path": "[Portal SSL Certificate Path]",
+ "Password": "[Portal SSL Password]",
+ "CNameFQDN": "[Portal CName Alias]",
+ "Target": [
+ "Portal"
+ ]
+ }
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "SslRootOrIntermediate": [
+ {
+ "Alias": "[ROOT-CA Alias]",
+ "Path": "[ROOT-CA SSL Certificate Path]"
+ },
+ {
+ "Alias": "[Intermediate-CA Alias]",
+ "Path": "[Intermediate-CA SSL Certificate Path]"
+ }
+ ],
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal ]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal"
+ },
+ "ContentDirectoryLocation":"C:\\arcgisportal\\content",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]"
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-ssl-per-Node-Example3.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-ssl-per-Node-Example3.json
new file mode 100644
index 00000000..7aba2912
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine-ssl-per-Node-Example3.json
@@ -0,0 +1,158 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine 1 Name]",
+ "DataStoreTypes": [
+ "Relational",
+ "SpatioTemporal"
+ ],
+ "Role": [
+ "DataStore",
+ "Server"
+ ],
+ "SslCertificates": [
+ {
+ "Path": "[Server SSL Certificate Path]",
+ "Password": "[Server SSL Password]",
+ "CNameFQDN": "[Server CName Alias]",
+ "Target": [
+ "Server"
+ ],
+ "SslRootOrIntermediate": [
+ {
+ "Alias": "[ROOT-CA Alias]",
+ "Path": "[ROOT-CA SSL Certificate Path]"
+ },
+ {
+ "Alias": "[Intermediate-CA Alias]",
+ "Path": "[Intermediate-CA SSL Certificate Path]"
+ }
+ ]
+ },
+ {
+ "Path": "[DataStore SSL Certificate Path]",
+ "Password": "[DataStore SSL Password]",
+ "CNameFQDN": "[DataStore CName Alias]",
+ "Target": [
+ "DataStore"
+ ]
+ }
+ ]
+ },
+ {
+ "NodeName": "[Machine 2 Name]",
+ "Role": [
+ "ServerWebAdaptor",
+ "PortalWebAdaptor"
+ ],
+ "SslCertificates": [
+ {
+ "Path": "[WebAdaptor SSL Certificate Path]",
+ "Password": "[WebAdaptor SSL Password]",
+ "CNameFQDN": "[WebAdaptor CName Alias]",
+ "Target": [
+ "WebAdaptor"
+ ]
+ }
+ ]
+ },
+ {
+ "NodeName": "[Machine 3 Name]",
+ "Role": [
+ "Portal"
+ ],
+ "SslCertificates": [
+ {
+ "Path": "[Portal SSL Certificate Path]",
+ "Password": "[Portal SSL Password]",
+ "CNameFQDN": "[Portal CName Alias]",
+ "Target": [
+ "Portal"
+ ],
+ "SslRootOrIntermediate": [
+ {
+ "Alias": "[ROOT-CA Alias]",
+ "Path": "[ROOT-CA SSL Certificate Path]"
+ },
+ {
+ "Alias": "[Intermediate-CA Alias]",
+ "Path": "[Intermediate-CA SSL Certificate Path]"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "SslRootOrIntermediate": [
+ {
+ "Alias": "[ROOT-CA Alias]",
+ "Path": "[ROOT-CA SSL Certificate Path]"
+ },
+ {
+ "Alias": "[Intermediate-CA Alias]",
+ "Path": "[Intermediate-CA SSL Certificate Path]"
+ }
+ ],
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal ]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal"
+ },
+ "ContentDirectoryLocation":"C:\\arcgisportal\\content",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]"
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine.json b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine.json
new file mode 100644
index 00000000..781f6766
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Base Deployment/BaseDeployment-ThreeMachine.json
@@ -0,0 +1,90 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine 1 Name]",
+ "DataStoreTypes": [
+ "Relational",
+ "SpatioTemporal"
+ ],
+ "Role": [
+ "DataStore"
+ ]
+ },
+ {
+ "NodeName": "[Machine 2 Name]",
+ "Role": [
+ "Portal",
+ "PortalWebAdaptor"
+ ]
+ },
+ {
+ "NodeName": "[Machine 3 Name]",
+ "Role": [
+ "Server",
+ "ServerWebAdaptor"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerContext": "server",
+ "PortalContext": "portal",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "Portal": {
+ "LicenseFilePath": "[License File Path - Portal ]",
+ "PortalLicenseUserTypeId": "[Portal License User Type Id- Required for 10.7 and above]",
+ "Installer": {
+ "Path": "[Portal Installer Path]",
+ "WebStylesPath": "[Optional Parameter starting ArcGIS Enterprise 10.7.1 - Portal Web Styles Installer Path]",
+ "InstallDir": "[Portal Install Dir - Ex. C:\\ArcGIS\\Portal]",
+ "ContentDir": "[Portal Content Dir for Install- Ex. C:\\arcgisportal"
+ },
+ "ContentDirectoryLocation":"C:\\arcgisportal\\content",
+ "PortalAdministrator": {
+ "UserName": "[PortalAdministrator Username]",
+ "Email": "[PortalAdministrator Email]",
+ "Password": "[PortalAdministrator Password]",
+ "SecurityQuestionIndex": 1,
+ "SecurityAnswer": "vanilla"
+ }
+ },
+ "DataStore": {
+ "ContentDirectoryLocation": "[Content Dir DataStore - C:\\arcgisdatastore]",
+ "EnableFailoverOnPrimaryStop": false,
+ "Installer": {
+ "Path": "[DataStore Installer Path]",
+ "InstallDir": "[DataStore Install Dir - Ex. C:\\ArcGIS\\DataStore]"
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/DesktopPro/Desktop-Float.json b/SampleConfigs/v3/v3.3.1/DesktopPro/Desktop-Float.json
new file mode 100644
index 00000000..cf8b9ae2
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/DesktopPro/Desktop-Float.json
@@ -0,0 +1,52 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name 1]",
+ "Role": [
+ "Desktop"
+ ]
+ },
+ {
+ "NodeName": "[Machine Name 1]",
+ "Role": [
+ "Desktop"
+ ]
+ },
+ {
+ "NodeName": "[Machine Name 2]",
+ "Role": [
+ "LicenseManager"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "DesktopVersion": "[Version of ArcGIS Dektop ]",
+ "LicenseManagerVersion": "[Version of ArcGIS License Manager ]",
+ "Desktop": {
+ "SeatPreference": "Float",
+ "InstallFeatures": "[ALL | ,,]",
+ "ModifyFlexdAcl": "[TRUE | FALSE (Default)]",
+ "BlockAddIns": "[0 (Default All Addins Allowed), 1 (Signed by CA), 2 (Esri Addins Only), 3 (Esri Addins Only from Admin Folder), 4 (No Addins Allowed)]",
+ "DesktopConfig": "[ true - if you supply ESRI_LICENSE_HOST, SOFTWARE_CLASS, and SEAT_PREFERENCE on the command line ]",
+ "EsriLicenseHost": "[ License Host - [Machine Name 3] or Can be an external License Manager Host]",
+ "SoftwareClass": "[Viewer | Editor | Professional]",
+ "EnableEUEI": "[ True (Default enables participation of Esri User Experience Improvement Program) | False ]",
+ "Installer": {
+ "Path": "[Desktop Installer Path]",
+ "InstallDir": "[Desktop Install Dir - Ex. C:\\ArcGIS\\Desktop]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "PatchesDir": "",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ }
+ },
+ "LicenseManager": {
+ "LicenseFilePath": "[License File Path (*.prvs) - License Manager ]",
+ "Installer": {
+ "Path": "[License Manager Installer Path]",
+ "InstallDir": "[License Manager Install Dir - Ex. C:\\ArcGIS\\LicenseManager]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/DesktopPro/Desktop-SingleUse.json b/SampleConfigs/v3/v3.3.1/DesktopPro/Desktop-SingleUse.json
new file mode 100644
index 00000000..1336e7ba
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/DesktopPro/Desktop-SingleUse.json
@@ -0,0 +1,80 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name 1]",
+ "Role": [
+ "Desktop"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "DesktopVersion": "[Version of ArcGIS Dektop ]",
+ "Desktop": {
+ "LicenseFilePath": "[License File Path - Desktop ]",
+ "SeatPreference": "Fixed",
+ "InstallFeatures": "[ALL | ,,]",
+ "ModifyFlexdAcl": "[TRUE | FALSE (Default)]",
+ "DesktopConfig": true,
+ "EnableEUEI": "[ True (Default enables participation of Esri User Experience Improvement Program) | False ]",
+ "Installer": {
+ "Path": "[Desktop Installer Path]",
+ "InstallDir": "[Desktop Install Dir - Ex. C:\\ArcGIS\\Desktop]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "PatchesDir": "",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "Extensions":{
+ "DataInteroperability":{
+ "Installer": {
+ "Path": "[Data Interoperability Installer Path]"
+ }
+ },
+ "DataReviewer":{
+ "Installer": {
+ "Path": "[Data Reviewer Installer Path]"
+ }
+ },
+ "WorkflowManagerClassic":{
+ "Installer": {
+ "Path": "[Workflow Manager Classic Installer Path]"
+ },
+ "Features":[
+ "Desktop",
+ "TAM",
+ "ALL"
+ ]
+ },
+ "LocationReferencing":{
+ "Installer": {
+ "Path": "[Location Referencing Installer Path]"
+ },
+ "Features":[
+ "PipelineReferencing",
+ "Roads"
+ ]
+ },
+ "MappingChartingSolution":{
+ "Installer": {
+ "Path": "[Mapping and Charting Solutions Installer Path]"
+ },
+ "Features":[
+ "EsriProductionMapping",
+ "TAM",
+ "AviationCharting",
+ "FederalCharting",
+ "MaritimeBathymetry",
+ "MaritimeCharting",
+ "EsriDefenseMapping"
+ ]
+ },
+ "BackgroundGP64Bit":{
+ "Installer": {
+ "Path": "[Desktop Background Geoprocessing (64-bit) Installer Path]"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/DesktopPro/LicenseManager-Standalone.json b/SampleConfigs/v3/v3.3.1/DesktopPro/LicenseManager-Standalone.json
new file mode 100644
index 00000000..23391edf
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/DesktopPro/LicenseManager-Standalone.json
@@ -0,0 +1,20 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[localhost -- Server where License Manager will be installed]",
+ "Role": [
+ "LicenseManager"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "LicenseManagerVersion": "[Version of License Manager -- 2019.2, 2020.0, etc.]",
+ "LicenseManager": {
+ "LicenseFilePath": "[License File Path (*.prvs) - License Manager ]",
+ "Installer": {
+ "Path": "[License Manager Installer Path]",
+ "InstallDir": "[License Install Dir - Ex. C:\\ArcGIS\\LM]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/DesktopPro/Pro-Concurrent.json b/SampleConfigs/v3/v3.3.1/DesktopPro/Pro-Concurrent.json
new file mode 100644
index 00000000..820598be
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/DesktopPro/Pro-Concurrent.json
@@ -0,0 +1,52 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name 1]",
+ "Role": [
+ "Pro"
+ ]
+ },
+ {
+ "NodeName": "[Machine Name 1]",
+ "Role": [
+ "Pro"
+ ]
+ },
+ {
+ "NodeName": "[Machine Name 3]",
+ "Role": [
+ "LicenseManager"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "ProVersion": "[Version of ArcGIS Pro ]",
+ "LicenseManagerVersion": "[Version of ArcGIS License Manager ]",
+ "Pro": {
+ "AuthorizationType": "CONCURRENT_USE",
+ "LockAuthSettings": "[ True(Default) | False ]",
+ "BlockAddIns": "[0 (Default All Addins Allowed), 1 (Signed by CA), 2 (Esri Addins Only), 3 (Esri Addins Only from Admin Folder), 4 (No Addins Allowed), 5 (Only Addins from Addmin Folder)]",
+ "SoftwareClass": "[Viewer | Editor | Professional]",
+ "PortalList": "[List of Portals for Pro]",
+ "AllUsers": "[1 (Per Machine Install)]",
+ "EsriLicenseHost": "[ License Host - [Machine Name 3] ]",
+ "EnableEUEI": "[ True (Default enables participation of Esri User Experience Improvement Program) | False]",
+ "CheckForUpdatesAtStartup": "[ True (Default enables automatic update notifications of ArcGIS Pro) | False ]",
+ "Installer": {
+ "Path": "[Pro Installer Path]",
+ "InstallDir": "[Pro Install Dir - Ex. C:\\ArcGIS\\Pro]",
+ "PatchesDir": "",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ }
+ },
+ "LicenseManager": {
+ "LicenseFilePath": "[License File Path (*.prvs) - License Manager ]",
+ "Installer": {
+ "Path": "[License Manager Installer Path]",
+ "InstallDir": "[License Manager Install Dir - Ex. C:\\ArcGIS\\LicenseManager]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/DesktopPro/Pro-Named.json b/SampleConfigs/v3/v3.3.1/DesktopPro/Pro-Named.json
new file mode 100644
index 00000000..0a10bb31
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/DesktopPro/Pro-Named.json
@@ -0,0 +1,29 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name 1]",
+ "Role": [
+ "Pro"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "ProVersion": "[Version of ArcGIS Pro ]",
+ "Pro": {
+ "AuthorizationType": "NAMED_USER",
+ "BlockAddIns": "[0 (Default All Addins Allowed), 1 (Signed by CA), 2 (Esri Addins Only), 3 (Esri Addins Only from Admin Folder), 4 (No Addins Allowed), 5 (Only Addins from Addmin Folder)]",
+ "SoftwareClass": "[Viewer | Editor | Professional]",
+ "AllUsers": "[1 (Per Machine Install)]",
+ "EnableEUEI": "[ True (Default enables participation of Esri User Experience Improvement Program) | False ]",
+ "CheckForUpdatesAtStartup": "[ True (Default enables automatic update notifications of ArcGIS Pro) | False ]",
+ "Installer": {
+ "Path": "[Pro Installer Path]",
+ "InstallDir": "[Pro Install Dir - Ex. C:\\ArcGIS\\Pro]",
+ "PatchesDir": "",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/DesktopPro/Pro-SingleUse.json b/SampleConfigs/v3/v3.3.1/DesktopPro/Pro-SingleUse.json
new file mode 100644
index 00000000..fb2a568c
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/DesktopPro/Pro-SingleUse.json
@@ -0,0 +1,39 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name 1]",
+ "Role": [
+ "Pro"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "ProVersion": "[Version of ArcGIS Pro ]",
+ "Pro": {
+ "LicenseFilePath": "[License File Path - Pro ]",
+ "AuthorizationType": "SINGLE_USE",
+ "LockAuthSettings": "[ True(Default) | False ]",
+ "BlockAddIns": "[0 (Default All Addins Allowed), 1 (Signed by CA), 2 (Esri Addins Only), 3 (Esri Addins Only from Admin Folder), 4 (No Addins Allowed), 5 (Only Addins from Addmin Folder)]",
+ "SoftwareClass": "[Viewer | Editor | Professional]",
+ "PortalList": "[List of Portals for Pro]",
+ "AllUsers": "[1 (Per Machine Install)]",
+ "EnableEUEI": "[ True (Default enables participation of Esri User Experience Improvement Program) | False]",
+ "CheckForUpdatesAtStartup": "[ True (Default enables automatic update notifications of ArcGIS Pro) | False ]",
+ "Installer": {
+ "Path": "[Pro Installer Path]",
+ "InstallDir": "[Pro Install Dir - Ex. C:\\ArcGIS\\Pro]",
+ "PatchesDir": "",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "Extensions":{
+ "DataInteroperability":{
+ "Installer": {
+ "Path": "[Data Interoperability Installer Path]"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Database.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Database.json
new file mode 100644
index 00000000..29c3e859
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Database.json
@@ -0,0 +1,96 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server",
+ "SQLServerClient"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "Databases": [
+ {
+ "DatabaseServerHostName": "[SQL Server Node Name]",
+ "DatabaseName": "[Name of the Database to target]",
+ "DatabaseType": "SQLServerDatabase",
+ "DatabaseAdminUser": {
+ "UserName": "[DatabaseAdminUser UserName]",
+ "Password": "[DatabaseAdminUser Password]"
+ },
+ "SDEUser": {
+ "UserName": "[SDEUser UserName]",
+ "Password": "[SDEUser Password]"
+ },
+ "DatabaseUser": {
+ "UserName": "[DatabaseUser UserName]",
+ "Password": "[DatabaseUser Password]"
+ },
+ "IsManaged": true,
+ "EnableGeodatabase": true
+ },
+ {
+ "DatabaseServerHostName": "[External DB Host Name]",
+ "DatabaseName": "[Name of the Database to target]",
+ "DatabaseType": "Can be one of the following ['SQLServerDatabase','AzureSQLDatabase','AzurePostgreSQLDatabase','AzureMISQLDatabase']",
+ "DatabaseAdminUser": {
+ "UserName": "[DatabaseAdminUser UserName]",
+ "Password": "[DatabaseAdminUser Password]"
+ },
+ "SDEUser": {
+ "UserName": "[SDEUser UserName]",
+ "Password": "[SDEUser Password]"
+ },
+ "DatabaseUser": {
+ "UserName": "[DatabaseUser UserName]",
+ "Password": "[DatabaseUser Password]"
+ },
+ "IsManaged": true,
+ "EnableGeodatabase": true
+ }
+ ],
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "SQLServerClient": [
+ {
+ "Name": "Microsoft ODBC Driver 17 for SQL Server",
+ "InstallerPath": "C:\\Setups\\msodbcsql_17.4.1.1_x64.msi",
+ "ProductId": "72AFAF21-33FB-45A5-9468-A9EC07427F82",
+ "Arguments": " /quiet /qn IACCEPTMSODBCSQLLICENSETERMS=YES ADDLOCAL=ALL"
+ }
+ ],
+ "Federation": {
+ "PortalHostName": "[Portal Host Name (FQDN) with which this site needs to be federated]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "PortalAdministrator": {
+ "UserName": "admin",
+ "Password": "changeit"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose-MultiMachine.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose-MultiMachine.json
new file mode 100644
index 00000000..b42888ac
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose-MultiMachine.json
@@ -0,0 +1,53 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine 1 Name]",
+ "Role": [
+ "FileShare",
+ "Server"
+ ]
+ },
+ {
+ "NodeName": "[Machine 2 Name]",
+ "Role": [
+ "Server"
+ ]
+ },
+ {
+ "NodeName": "[Machine 3 Name]",
+ "Role": [
+ "Server"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "FileShareLocalPath": "[File Share Local Path]",
+ "FileShareName": "[File Share Name]",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "\\\\[Fileshare Machine Name 1]\\[Fileshare Name]\\arcgisserver\\directories",
+ "ConfigStoreLocation": "\\\\[Fileshare Machine Name 1]\\[Fileshare Name]\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose-MultiServerRoles.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose-MultiServerRoles.json
new file mode 100644
index 00000000..22202336
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose-MultiServerRoles.json
@@ -0,0 +1,122 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server",
+ "RasterDataStoreItem"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerRole": "GeneralPurposeServer",
+ "AdditionalServerRoles":[
+ "Geoevent",
+ "RasterAnalytics",
+ "WorkflowManagerServer",
+ "GeoAnalytics",
+ "ImageHosting"
+ ],
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ },
+ "Extensions":{
+ "DataInteroperability":{
+ "Installer": {
+ "Path": "[Data Interoperability Installer Path]"
+ }
+ },
+ "DataReviewer":{
+ "Installer": {
+ "Path": "[Data Reviewer Installer Path]"
+ }
+ },
+ "WorkflowManagerClassic":{
+ "Installer": {
+ "Path": "[Workflow Manager Classic Installer Path]"
+ },
+ "Features":[
+ "Server",
+ "WebViewers",
+ "ALL"
+ ]
+ },
+ "LocationReferencing":{
+ "Installer": {
+ "Path": "[Location Referencing Installer Path]"
+ },
+ "Features":[
+ "PipeServer",
+ "RHServer",
+ "EventEditor",
+ "RCE",
+ "RoadwayReporter"
+ ]
+ },
+ "MappingChartingSolution":{
+ "Installer": {
+ "Path": "[Mapping and Charting Solutions Installer Path]"
+ },
+ "Features":[
+ "DefenseMapping",
+ "Maritime",
+ "ALL"
+ ]
+ }
+ }
+ },
+ "GeoEventServer": {
+ "LicenseFilePath": "[License File Path - GeoEvent Server ]",
+ "Installer": {
+ "Path": "[GeoEvent Server Installer Path]",
+ "PatchesDir": "[Path to Directory with Patches for GeoEvent Server]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "EnableGeoeventSDK": "[ Optional - True | False(Default) - Enables GeoEvent SDK during installation.]"
+ },
+ "WorkflowManagerServer": {
+ "LicenseFilePath": "[License File Path - Workflow Manager Server ]",
+ "Installer": {
+ "Path": "[Workflow Manager Server Installer Path]"
+ }
+ },
+ "DataStoreItems": {
+ "RasterStore": {
+ "FileShareLocalPath": "[File Share Local Path]",
+ "FileShareName": "[File Share Name]"
+ }
+ },
+ "Federation": {
+ "PortalHostName": "[Portal Host Name (FQDN) with which this site needs to be federated]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "PortalAdministrator": {
+ "UserName": "admin",
+ "Password": "changeit"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose-MultipleWA-MultiContext.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose-MultipleWA-MultiContext.json
new file mode 100644
index 00000000..d7a7a8e8
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose-MultipleWA-MultiContext.json
@@ -0,0 +1,71 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server",
+ "ServerWebAdaptor"
+ ],
+ "ServerContext":"[Node Server Context]",
+ "AdminAccessEnabled": true
+ },
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "ServerWebAdaptor"
+ ],
+ "ServerContext":"[Node Server Context]",
+ "AdminAccessEnabled": false
+ },
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "ServerWebAdaptor"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerRole": "GeneralPurposeServer",
+ "ServerContext": "[Global Server Context]",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ },
+ "Federation": {
+ "PortalHostName": "[Portal Host Name (FQDN) with which this site needs to be federated]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "PortalAdministrator": {
+ "UserName": "admin",
+ "Password": "changeit"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose.json
new file mode 100644
index 00000000..028e782b
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeneralPurpose.json
@@ -0,0 +1,91 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerRole": "GeneralPurposeServer",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ },
+ "Extensions":{
+ "DataInteroperability":{
+ "Installer": {
+ "Path": "[Data Interoperability Installer Path]"
+ }
+ },
+ "DataReviewer":{
+ "Installer": {
+ "Path": "[Data Reviewer Installer Path]"
+ }
+ },
+ "WorkflowManagerClassic":{
+ "Installer": {
+ "Path": "[Workflow Manager Classic Installer Path]"
+ },
+ "Features":[
+ "Server",
+ "WebViewers",
+ "ALL"
+ ]
+ },
+ "LocationReferencing":{
+ "Installer": {
+ "Path": "[Location Referencing Installer Path]"
+ },
+ "Features":[
+ "PipeServer",
+ "RHServer",
+ "EventEditor",
+ "RCE",
+ "RoadwayReporter"
+ ]
+ },
+ "MappingChartingSolution":{
+ "Installer": {
+ "Path": "[Mapping and Charting Solutions Installer Path]"
+ },
+ "Features":[
+ "DefenseMapping",
+ "Maritime",
+ "ALL"
+ ]
+ }
+ }
+ },
+ "Federation": {
+ "PortalHostName": "[Portal Host Name (FQDN) with which this site needs to be federated]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "PortalAdministrator": {
+ "UserName": "admin",
+ "Password": "changeit"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeoAnalytics.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeoAnalytics.json
new file mode 100644
index 00000000..49b65804
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeoAnalytics.json
@@ -0,0 +1,47 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerRole": "GeoAnalytics",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "Federation": {
+ "PortalHostName": "[Portal Host Name (FQDN) with which this site needs to be federated]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "PortalAdministrator": {
+ "UserName": "admin",
+ "Password": "changeit"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeoEvent.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeoEvent.json
new file mode 100644
index 00000000..828b227c
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-GeoEvent.json
@@ -0,0 +1,62 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerRole": "GeoEvent",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "PatchesDir": "[Path to Directory with Patches for Server]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ],
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "GeoEventServer": {
+ "LicenseFilePath": "[License File Path - GeoEvent Server ]",
+ "Installer": {
+ "Path": "[GeoEvent Server Installer Path]",
+ "PatchesDir": "[Path to Directory with Patches for GeoEvent Server]",
+ "PatchInstallOrder": [
+ "Array of patch names to install in the needed order"
+ ]
+ },
+ "EnableGeoeventSDK": "[ Optional - True | False(Default) - Enables GeoEvent SDK during installation.]"
+ },
+ "Federation": {
+ "PortalHostName": "[Portal Host Name (FQDN) with which this site needs to be federated]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "PortalAdministrator": {
+ "UserName": "admin",
+ "Password": "changeit"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Mission.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Mission.json
new file mode 100644
index 00000000..a1098789
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Mission.json
@@ -0,0 +1,74 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server",
+ "ServerWebAdaptor"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerRole": "MissionServer",
+ "ServerContext": "mission",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Mission Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgismissionserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgismissionserver\\config-store",
+ "ServerDirectories": [
+ {
+ "name": "arcgisworkspace",
+ "path": "C:\\arcgismissionserver\\directories\\arcgisworkspace",
+ "type": "WORKSPACE"
+ },
+ {
+ "name": "arcgisoutput",
+ "path": "C:\\arcgismissionserver\\directories\\arcgisoutput",
+ "type": "OUTPUT"
+ },
+ {
+ "name": "arcgissystem",
+ "path": "C:\\arcgismissionserver\\directories\\arcgissystem",
+ "type": "SYSTEM"
+ },
+ {
+ "name": "arcgisjobs",
+ "path": "C:\\arcgismissionserver\\directories\\arcgisjobs",
+ "type": "JOBS"
+ }
+ ],
+ "ServerLogsLocation": "C:\\arcgismissionserver\\logs",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "WebAdaptor": {
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ },
+ "Federation": {
+ "PortalHostName": "[Portal Host Name (FQDN) with which this site needs to be federated]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "PortalAdministrator": {
+ "UserName": "admin",
+ "Password": "changeit"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Notebook-MultiMachine.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Notebook-MultiMachine.json
new file mode 100644
index 00000000..9f32d90a
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Notebook-MultiMachine.json
@@ -0,0 +1,71 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server",
+ "ServerWebAdaptor"
+ ]
+ },
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server",
+ "FileShare"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerRole": "NotebookServer",
+ "ServerContext": "notebook",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Notebook Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] "
+ },
+ "ServerDirectoriesRootLocation": "\\\\[Fileshare Machine Name 1]\\[Fileshare Name]\\arcgisnotebookserver\\directories",
+ "ConfigStoreLocation": "\\\\[Fileshare Machine Name 1]\\[Fileshare Name]\\\\arcgisnotebookserver\\config-store",
+ "ContainerImagePaths": [
+ "C:\\docker_images\\ArcGIS_Notebook_Docker_Standard_108.tar.gz",
+ "C:\\docker_images\\ArcGIS_Notebook_Docker_Advanced_108.tar.gz"
+ ],
+ "ServerDirectories": [
+ {
+ "name": "arcgisworkspace",
+ "path": "[Required - DFS Shared Workspace - 'C:\\arcgisnotebookserver\\arcgisworkspace']",
+ "type": "WORKSPACE"
+ }
+ ],
+ "ServerLogsLocation": "C:\\arcgisnotebookserver\\logs",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "WebAdaptor": {
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ },
+ "Federation": {
+ "PortalHostName": "[Portal Host Name (FQDN) with which this site needs to be federated]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "PortalAdministrator": {
+ "UserName": "admin",
+ "Password": "changeit"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Notebook.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Notebook.json
new file mode 100644
index 00000000..60368c38
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-Notebook.json
@@ -0,0 +1,80 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server",
+ "ServerWebAdaptor"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerRole": "NotebookServer",
+ "ServerContext": "notebook",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Notebook Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "NotebookServerSamplesDataPath": "[Optional - Notebook Server Samples Data Installer Path - Included starting 10.9]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] "
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisnotebookserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisnotebookserver\\config-store",
+ "ContainerImagePaths": [
+ "C:\\docker_images\\ArcGIS_Notebook_Docker_Standard_108.tar.gz",
+ "C:\\docker_images\\ArcGIS_Notebook_Docker_Advanced_108.tar.gz"
+ ],
+ "ServerDirectories": [
+ {
+ "name": "arcgisworkspace",
+ "path": "C:\\arcgisnotebookserver\\arcgisworkspace",
+ "type": "WORKSPACE"
+ },
+ {
+ "name": "arcgisoutput",
+ "path": "C:\\arcgisnotebookserver\\arcgisoutput",
+ "type": "OUTPUT"
+ },
+ {
+ "name": "arcgissystem",
+ "path": "C:\\arcgisnotebookserver\\arcgissystem",
+ "type": "SYSTEM"
+ },
+ {
+ "name": "arcgisjobs",
+ "path": "C:\\arcgisnotebookserver\\arcgisjobs",
+ "type": "JOBS"
+ }
+ ],
+ "ServerLogsLocation": "C:\\arcgisnotebookserver\\logs",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "WebAdaptor": {
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ },
+ "Federation": {
+ "PortalHostName": "[Portal Host Name (FQDN) with which this site needs to be federated]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "PortalAdministrator": {
+ "UserName": "admin",
+ "Password": "changeit"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-RasterAnalytics-fileshare.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-RasterAnalytics-fileshare.json
new file mode 100644
index 00000000..41c79f53
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-RasterAnalytics-fileshare.json
@@ -0,0 +1,54 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server",
+ "RasterDataStoreItem"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerRole": "RasterAnalytics",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "DataStoreItems": {
+ "RasterStore": {
+ "FileShareLocalPath": "[File Share Local Path]",
+ "FileShareName": "[File Share Name]"
+ }
+ },
+ "Federation": {
+ "PortalHostName": "[Portal Host Name (FQDN) with which this site needs to be federated]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "PortalAdministrator": {
+ "UserName": "admin",
+ "Password": "changeit"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-WorkflowManager.json b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-WorkflowManager.json
new file mode 100644
index 00000000..b5857044
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/Gis Servers/GISServer-WorkflowManager.json
@@ -0,0 +1,61 @@
+{
+ "AllNodes": [
+ {
+ "NodeName": "[Machine Name]",
+ "Role": [
+ "Server",
+ "ServerWebAdaptor"
+ ]
+ }
+ ],
+ "ConfigData": {
+ "Version": "[Version of ArcGIS Deployment]",
+ "ServerRole": "WorkflowManagerServer",
+ "ServerContext": "workflowmanager",
+ "Credentials": {
+ "ServiceAccount": {
+ "Password": "[ServiceAccount Password]",
+ "UserName": "[ServiceAccount Username - Can be a Domain Account]",
+ "IsDomainAccount": false,
+ "IsMSAAccount": false
+ }
+ },
+ "Server": {
+ "LicenseFilePath": "[License File Path - Server ]",
+ "Installer": {
+ "Path": "[Server Installer Path]",
+ "InstallDir": "[Server Install Dir - Ex. C:\\ArcGIS\\Server]",
+ "InstallDirPython": "[Python Install Dir - Ex. C:\\Python27] ",
+ "EnableArcMapRuntime": "[ Optional - True (Default) | False - Enables ArcMapRuntime. Available starting 10.9.1]",
+ "EnableDotnetSupport": "[ Optional - True | False (Default) - Enables .Net Extension Support. Available starting 10.9.1]"
+ },
+ "ServerDirectoriesRootLocation": "C:\\arcgisserver\\directories",
+ "ConfigStoreLocation": "C:\\arcgisserver\\config-store",
+ "PrimarySiteAdmin": {
+ "UserName": "[PrimarySiteAdmin Username]",
+ "Password": "[PrimarySiteAdmin Password]"
+ }
+ },
+ "WorkflowManagerServer": {
+ "LicenseFilePath": "[License File Path - Workflow Manager Server ]",
+ "Installer": {
+ "Path": "[Workflow Manager Server Installer Path]"
+ }
+ },
+ "WebAdaptor": {
+ "AdminAccessEnabled": true,
+ "Installer": {
+ "Path": "[WebAdaptor Installer Path]"
+ }
+ },
+ "Federation": {
+ "PortalHostName": "[Portal Host Name (FQDN) with which this site needs to be federated]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "PortalAdministrator": {
+ "UserName": "admin",
+ "Password": "changeit"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleConfigs/v3/v3.3.1/PublishGISService.json b/SampleConfigs/v3/v3.3.1/PublishGISService.json
new file mode 100644
index 00000000..0a0f87db
--- /dev/null
+++ b/SampleConfigs/v3/v3.3.1/PublishGISService.json
@@ -0,0 +1,32 @@
+{
+ "ServerNode": "[Machine Name]",
+ "CertificateFile": "",
+ "Thumbprint": "",
+ "PortalHostName": "[Portal Host Name (FQDN)]",
+ "PortalPort": "[Port on which Portal is listening ex. - 443]",
+ "PortalContext": "[Context of the Portal ex. - portal]",
+ "ServerHostName": "[Server Host Name (FQDN) with which the publishing needs to happen]",
+ "ServerPort": "[Port on which Server is listening ex. - 443]",
+ "ServerContext": "[Context of the Server ex. - Server]",
+ "PublisherAccountCredential": {
+ "UserName": "[PublisherAccount Username]",
+ "Password": "[PublisherAccount Password]",
+ "PasswordFile": ""
+ },
+ "GISServices": [
+ {
+ "Name": "",
+ "Type": "",
+ "PathToItemInfoFile": "",
+ "PathToSourceFile": "",
+ "Folder": ""
+ },
+ {
+ "Name": "",
+ "Type": "",
+ "PathToItemInfoFile": "",
+ "PathToSourceFile": "",
+ "Folder": ""
+ }
+ ]
+}
\ No newline at end of file