Já pensou em experimentar DSC, mas sentiu que a curva de aprendizado é muito íngreme? Ou talvez você nunca tenha se visto usando isso na produção, portanto ele não se incomodou?
Usar DSC não precisa ser difícil ou complexo, e você não precisa de uma infraestrutura gigantesca para fazer valer a pena. Esta postagem vai falar sobre DSC e como começar, e inclui exemplos de como você pode começar aplicando-o em pequena escala na produção.
O que é DSC?
As configurações de estado desejadas (DSC) é um sistema de gerenciamento de configuração que é integrado ao Windows e permite que você configure seu sistema como um código. Usa uma configuração escrita em PowerShell que é então convertida em um formato de objeto gerenciado (MOF).
O arquivo MOF é então lido e aplicado pelo Serviço Gerenciador de Configuração Local no nó de destino (computador).
A configuração que é criada e executada usa diferentes DSCs meios a partir de Módulos DSC. Os módulos DSC são como um módulo PowerShell normal e os recursos são suas funções. Como um exemplo, você pode instalá-los usando Install-Module
, e são armazenados abaixo no PSModulePath.
Para que posso usar o DSC?
A parte mais difícil do DSC para muitos é encontrar casos de uso. As pessoas tendem a falar e escrever sobre DSC apenas quando se trata de orquestrar e girar grandes locais, ou teste e controle de qualidade para diferentes aplicativos, que é um assunto distante para muitos administradores.
Podemos usar DSC para nossas rotinas diárias e muito mais, sem ter que reestruturar toda a nossa organização. Eu compilei uma lista de algumas áreas que você pode automatizar total ou parcialmente com DSC:
Exemplo: ler e escrever uma configuração DSC
Algumas linhas de DSC podem ser iguais a centenas de linhas com PowerShell bruto, é por isso que pode ser tão incrivelmente poderoso.
Uma configuração DSC consiste principalmente em 2 partes: Configuração DSC e dados de configuração.
Dados de configuração (que são explicados abaixo) pode ser incluído externamente, geralmente de um arquivo PSD, ou ser incluído no arquivo de configuração. A abordagem recomendada e mais fácil de manter é incluir isso em um arquivo separado.
A seguir, mostra um exemplo de como criar um MOF DSC que baixa e instala um MSI genérico quando aplicado:
Configuration MyDSCConfiguration {
# Import DSC modules with resources to use in the configuration
Import-DscResource -ModuleName PSDesiredStateConfiguration
Import-DscResource -ModuleName xPSDesiredStateConfiguration -ModuleVersion "8.10.0.0"
##############################################
# Creates configuration for the server fileserver-1
##############################################
Node "fileserver-1" {
# Create C:ProgramDataSoftwarePackages to download files to on all nodes
File SoftwarePackagesDirectory {
# Identifier "SoftwarePackagesDirectory" using the DSC resource "File" from DSC module "PSDesiredStateConfiguration"
DestinationPath = "C:ProgramDataSoftwarePackages"
Type = "Directory" # Is a directory
Ensure = "Present" # Ensure that it exists
}
# Download MSI
xRemoteFile DownloadBackupAgent {
# The xRemoteFile resource from xPSDesiredStateConfiguration DSC module used to download an MSI through HTTP
DependsOn = "[File]SoftwarePackagesDirectory" # Tells DSC to not run this if the previous step hasn't completed successfully
Uri = "http://web.contoso.com/packages/backupagent.msi" # Where to download the remote file from
DestinationPath = "C:ProgramDataSoftwarePackagesBackupAgent.msi" # Where to save the downloaded file
}
# Install MSI
xMsiPackage InstallBackupAgent {
# The xMsiPackage resource from xPSDesiredStateConfiguration DSC module used to install the MSI we just downloaded
DependsOn = "[xRemoteFile]DownloadBackupAgent" # Depends on previous step being completed before starting
ProductId = "d29c3fa9-e03e-40e0-a6ed-556c6f05476a" # The MSI package ProductID
Path = "C:ProgramDataSoftwarePackagesBackupAgent.msi" # Path to the MSI file we just downloaded
Ensure = "Present" # Ensure that it's present (install the MSI), 'Ensure = "Absent"' would uninstall the MSI
}
}
}
Depois de executar este código, criar uma função de configuração na sessão atual do PowerShell que pode ser usada. Crie uma subpasta com o mesmo nome da configuração onde você salva os arquivos MOF gerados:
PS51> MyDSCConfiguration
Directory: C:TutorialsDSCMyDSCConfiguration
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2019-10-28 16:38 3952 fileserver-1.mof
Você pode aplicar todas as configurações de DSC na pasta MyDSCConfiguration ao seu host executando:
PS51> Start-DscConfiguration -Path .MyDSCConfiguration -Wait
Usando DSC com ConfigurationData
Os dados de configuração contêm dados de configuração para a configuração DSC. As informações incluem um nome de nó (nome do computador) e pode conter outros dados, como informações sobre como instalar um pacote MSI ou valores de chave de registro, etc. Isso nos dá uma abordagem dinâmica e mais versátil para DSC., para que possa ser reutilizado. e facilmente modificável.
Digamos que você tenha esses três servidores e cada um precise de uma combinação única de pacotes:
- servidor de arquivos-1
- banco de dados-1
- Precisa: BackupAgent, BackupAgent-DatabaseAddon
- servidor de aplicativos-1
- Precisa: BackupAgent, MonitoringAgent
A melhor abordagem é criar um arquivo com os dados de configuração de que você precisa, não apenas especificando os nós (servidores), mas também adicionando uma lista de pacotes nele:
# Save as ConfigurationData.psd1
@{
#############################
# Specify server nodes
#############################
AllNodes = @(
@{
NodeName = "*"
}
# File server node
@{
NodeName = "fileserver-1"
Role = "Fileserver"
# Selects what packages to install
Packages = @(
'BackupAgent'
)
},
# Database server node
@{
NodeName = "database-1"
Role = "Database"
# Selects what packages to install
Packages = @(
'BackupAgent',
'BackupAgent-DataBaseAddon'
)
},
# Appserver node
@{
NodeName = "appserver-1"
Role = "Appserver"
# Selects what packages to install
Packages = @(
'BackupAgent',
'MonitoringAgent'
)
}
)
#############################
# Establece each package
#############################
Packages = @(
@{
Name = "BackupAgent"
ProductId = "3c4e21b5-8de2-408e-84e0-a42b0507b8b1"
FileName = "BackupAgent.msi"
Ensure = "Present"
},
@{
Name = "BackupAgent-DataBaseAddon"
ProductId = "97f860f6-0a58-4bf3-aef8-abc0f796e9df"
FileName = "BackupAgent-DataBaseAddon.msi"
Ensure = "Present"
},
@{
Name = "MonitoringAgent"
ProductId = "77b29b12-c222-4d85-b812-bbd4136ad0ff"
FileName = "MonitoringAgent.msi"
Ensure = "Present"
}
)
}
Agora você pode usar este arquivo de dados de configuração para gerar dinamicamente configurações DSC para seus servidores.:
Configuration MyDSCConfiguration {
# Import DSC modules with resources to use in the configuration
Import-DscResource -ModuleName PSDesiredStateConfiguration
Import-DscResource -ModuleName xPSDesiredStateConfiguration -ModuleVersion "8.10.0.0"
# Get Packages from the ConfigurationData
$Packages = $ConfigurationData.Packages
##############################################
# Applies to all nodes
##############################################
Node $AllNodes.NodeName {
# Create C:ProgramDataSoftwarePackages to download files to on all nodes
File SoftwarePackagesDirectory {
DestinationPath = "C:ProgramDataSoftwarePackages"
Type = "Directory" # Is a directory
Ensure = "Present" # Ensure that it exists
}
# Start dynamically generating DSC configuration by running through all the package names in Node.Packages
Foreach($PackageName in $Node.Packages){
$Package = $Packages.Where{$_.Name -eq $PackageName}
xRemoteFile "PackageDownload-$($Package.Name)" {
DependsOn = "[File]SoftwarePackagesDirectory"
DestinationPath = "C:SoftwarePackages$($Package.FileName)"
Uri = "http://web.contso.com/packages/$($Package.FileName)"
}
xMsiPackage "Install$($Package.Name)" {
DependsOn = "[xRemoteFile]PackageDownload-$($Package.Name)"
ProductId = $Package.ProductId
Path = "C:ProgramDataSoftwarePackages$($Package.FileName)"
Ensure = $Package.Ensure
}
}
}
}
Se você executar este, a função DSC gera um arquivo MOF para cada um de seus servidores que pode ser usado para instalar os pacotes que você definiu no ConfigurationData.psd1 procedimentos:
PS51> MyDSCConfiguration -ConfigurationData .ConfigurationData.psd1
Directory: C:TutorialsDSCMyDSCConfiguration
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2019-10-28 17:25 3962 fileserver-1.mof
-a---- 2019-10-28 17:25 6012 database-1.mof
-a---- 2019-10-28 17:25 5894 appserver-1.mof
# Applies the configuration to the servers
PS51> Start-DscConfiguration -Path .MyDSCConfiguration -Wait
Se você deseja adicionar novos pacotes, modifique o seu ConfigurationData.psd1 arquivo e execute o código acima mais uma vez.
conclusão
Começar com DSC pode ser uma curva de aprendizado bastante curta e íngreme. Mas a parte mais difícil para muitos é encontrar casos de uso onde possam usá-lo.
Usando o método acima que usa HTTP (o HTTPS) A busca por pacotes oferece uma maneira versátil de entregar software aos seus servidores. E porque é HTTPS, além disso, é mais fácil de expor e você pode usar para gerenciar software em DMZ e outras redes menos confiáveis.
Ao mesmo tempo, usar dados de configuração em vez de codificar tudo em suas configurações de DSC oferece uma abordagem muito mais fácil de manter. Você pode até gerar esses dados de configuração de fontes externas como CSV, SQL, Sharepoint e tudo o mais que pode ser lido com PowerShell.
Espero que você tenha algumas ideias para o seu ambiente para começar a facilitar suas tarefas diárias com o DSC..