O Desired State Configuration (DSC) é um recurso de gerenciamento de configuração nativo do Windows, introduzido no PowerShell 4.0, que permite declarar como um sistema deve ser configurado e garantir que ele permaneça nesse estado. Em vez de escrever scripts imperativos que executam ações passo a passo, o DSC permite descrever o 'estado desejado' de um ambiente — por exemplo, quais recursos do Windows estão habilitados, quais arquivos estão presentes, quais serviços estão em execução — e o mecanismo do DSC se encarrega de aplicar e manter esse estado.

Esta aula oferece uma visão geral do DSC, cobrindo seus fundamentos, a filosofia declarativa, cenários práticos de uso e o panorama atual da ferramenta, incluindo suas versões e evolução. Ao final, você terá uma base sólida para explorar tópicos mais avançados, como a criação de recursos personalizados e a integração com pipelines de CI/CD.

O que é DSC

DSC (Desired State Configuration) é uma plataforma de gerenciamento de configuração desenvolvida pela Microsoft, integrada ao PowerShell e ao Windows. Ela permite que administradores definam a configuração desejada de um servidor ou estação de trabalho usando uma sintaxe declarativa, e o DSC garante que o sistema atinja e mantenha esse estado continuamente. O DSC opera em duas fases principais: a fase de 'push' ou 'pull', onde a configuração é aplicada ao nó, e a fase de monitoramento, onde o nó verifica periodicamente se ainda está em conformidade.

O DSC é baseado em quatro componentes principais: Configuration (um script que descreve o estado desejado), Resource (blocos de construção que implementam a lógica de configuração), Local Configuration Manager (LCM) (o mecanismo que aplica e monitora as configurações em cada nó) e Pull Server (um serviço centralizado usado para distribuir configurações e relatórios de conformidade). Esses componentes trabalham juntos para automatizar a administração de sistemas, reduzir a deriva de configuração e facilitar a repetibilidade.

Um exemplo simples de configuração DSC que garante que um arquivo esteja presente em um diretório específico:

Configuration ExemploArquivo {
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Node 'localhost' {
        File MeuArquivo {
            DestinationPath = 'C:\Temp\meu_arquivo.txt'
            Contents = 'Conteúdo do arquivo'
            Ensure = 'Present'
        }
    }
}
ExemploArquivo
Start-DscConfiguration -Path .\ExemploArquivo -Wait -Verbose

Esse script define que o arquivo deve existir e, se não existir, o DSC o criará com o conteúdo especificado. A abordagem declarativa torna a intenção clara e o resultado previsível.

Configuração declarativa

Diferente de scripts imperativos, onde você especifica exatamente como executar cada etapa, a configuração declarativa foca no 'quê' — o estado final desejado — e não no 'como'. No DSC, você descreve o resultado esperado e o mecanismo subjacente decide a melhor forma de alcançá-lo. Isso traz benefícios significativos: idempotência (aplicar a configuração várias vezes não altera o resultado), simplicidade (menos código para entender e manter) e consistência (o mesmo estado é aplicado em todos os nós).

Por exemplo, em vez de escrever um script que verifica se um serviço está parado e, se estiver, inicia-o, você simplesmente declara que o serviço deve estar 'Running'. O DSC cuida da lógica de verificação e ação. Essa abordagem também facilita a revisão e a auditoria, pois a configuração é legível e autoexplicativa.

Um exemplo de configuração declarativa para garantir que o serviço 'W3SVC' (World Wide Web Publishing Service) esteja em execução:

Configuration ExemploServico {
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Node 'localhost' {
        Service W3SVC {
            Name = 'W3SVC'
            State = 'Running'
            StartupType = 'Automatic'
        }
    }
}
ExemploServico
Start-DscConfiguration -Path .\ExemploServico -Wait -Verbose

Nesse caso, o DSC compara o estado atual do serviço com o desejado e, se necessário, o inicia. Se o serviço já estiver em execução, nenhuma ação é tomada, garantindo a idempotência.

Casos de uso

O DSC é amplamente utilizado em ambientes que exigem gerenciamento de configuração em escala, como data centers, ambientes de nuvem e infraestruturas híbridas. Alguns casos de uso típicos incluem:

  • Provisionamento de servidores: Configurar novos servidores com as mesmas configurações de sistema, como recursos do Windows, arquivos, serviços e configurações de rede.
  • Manutenção de conformidade: Garantir que os servidores estejam em conformidade com políticas de segurança (por exemplo, configurações de firewall, políticas de senha) e corrigir automaticamente qualquer desvio.
  • Implantação de aplicativos: Instalar e configurar aplicativos, como IIS, SQL Server ou software personalizado, de forma consistente em vários ambientes.
  • Automação de DevOps: Integrar o DSC a pipelines de CI/CD para provisionar e configurar ambientes de teste e produção de forma declarativa.
  • Gerenciamento de alterações: Controlar e auditar alterações de configuração, usando o DSC para reverter automaticamente para o estado desejado.

Por exemplo, uma equipe de operações pode usar DSC para garantir que todos os servidores web tenham o IIS instalado, o diretório de logs configurado e o serviço de firewall habilitado. Isso reduz erros manuais e acelera a implantação de novos ambientes.

Estado atual

O DSC evoluiu ao longo dos anos. A versão clássica (DSC 1.1) está disponível no Windows e é baseada em LCM e recursos. No entanto, a Microsoft anunciou que o DSC clássico está em modo de manutenção, com foco em correções de segurança, e que a nova versão, denominada DSC 2.0 ou DSC vNext, está em desenvolvimento ativo. O DSC 2.0 foi projetado para ser multiplataforma (Linux, macOS, Windows) e se integrar melhor com ferramentas modernas como o PowerShell 7, além de suportar novos cenários, como configuração de ambientes em contêineres.

O DSC 2.0 traz uma arquitetura baseada em resource modules que podem ser escritos em qualquer linguagem (não apenas PowerShell), e usa um formato de configuração chamado configuration que pode ser exportado para JSON ou YAML. Ele também introduz o conceito de dsc como um comando nativo, permitindo maior flexibilidade e desempenho. Embora o DSC 2.0 ainda não seja totalmente compatível com todos os recursos do clássico, a Microsoft está incentivando a migração gradual.

Para se manter atualizado, é essencial acompanhar a documentação oficial e os anúncios da Microsoft, pois a ferramenta está em constante evolução. Enquanto isso, o DSC clássico continua sendo amplamente usado em ambientes de produção.

Boas práticas e observações finais

Ao trabalhar com DSC, considere estas boas práticas:

  • Versionamento: Sempre mantenha suas configurações e módulos em um sistema de controle de versão (como Git).
  • Teste em ambientes isolados: Antes de aplicar em produção, teste suas configurações em máquinas virtuais ou contêineres.
  • Use módulos confiáveis: Prefira recursos oficiais ou da comunidade bem testados, como os do PowerShell Gallery.
  • Monitore a conformidade: Configure relatórios regulares para verificar se os nós estão em conformidade e receba alertas em caso de desvio.
  • Documente suas configurações: Inclua comentários e descrições claras para facilitar a manutenção.

O DSC é uma ferramenta poderosa para automação de infraestrutura, e entender seus conceitos básicos é o primeiro passo para utilizá-la eficazmente. Nas próximas aulas, você aprenderá a criar configurações mais complexas, usar recursos avançados e integrar o DSC com outras ferramentas.

Referências

Exercícios

  1. Explique a diferença entre configuração declarativa e imperativa, e dê um exemplo de cada uma no contexto de gerenciamento de sistemas.

    ✓ Resposta: Na configuração declarativa, você descreve o estado final desejado sem especificar os passos para alcançá-lo. Por exemplo, no DSC: Service W3SVC { Name = 'W3SVC'; State = 'Running' }. Na imperativa, você escreve comandos que realizam ações sequenciais, como: Get-Service -Name W3SVC | Start-Service. O DSC é declarativo, enquanto scripts tradicionais do PowerShell são frequentemente imperativos.
  2. Quais são os quatro componentes principais do DSC e qual é a função de cada um?

    ✓ Resposta: Os componentes são: Configuration (descreve o estado desejado em um script), Resource (implementa a lógica para aplicar e testar a configuração), Local Configuration Manager (LCM) (mecanismo que aplica e monitora a configuração no nó), e Pull Server (serviço central para distribuir configurações e coletar relatórios de conformidade).
  3. Escreva uma configuração DSC que garanta que o diretório C:\Aplicacao\Logs exista e que o serviço 'Spooler' esteja em execução. Use o bloco de código PowerShell.

    ✓ Resposta:
    Configuration Exemplo {
        Import-DscResource -ModuleName PSDesiredStateConfiguration
        Node 'localhost' {
            File LogsDir {
                DestinationPath = 'C:\Aplicacao\Logs'
                Type = 'Directory'
                Ensure = 'Present'
            }
            Service Spooler {
                Name = 'Spooler'
                State = 'Running'
                StartupType = 'Automatic'
            }
        }
    }
    Exemplo
    Start-DscConfiguration -Path .\Exemplo -Wait -Verbose
  4. Cite três casos de uso práticos do DSC e explique como ele ajuda em cada um.

    ✓ Resposta: 1) Provisionamento de servidores: garante que novos servidores tenham a mesma configuração, reduzindo erros manuais. 2) Conformidade de segurança: aplica políticas de segurança (firewall, senhas) e corrige desvios automaticamente. 3) Implantação de aplicativos: instala e configura softwares de forma consistente em vários ambientes, facilitando o gerenciamento.
  5. Qual é a diferença entre o DSC clássico e o DSC 2.0? Mencione pelo menos duas diferenças principais.

    ✓ Resposta: O DSC clássico é específico do Windows e usa recursos baseados em PowerShell; o DSC 2.0 é multiplataforma (Windows, Linux, macOS) e permite escrever recursos em qualquer linguagem. Além disso, o DSC 2.0 usa um formato de configuração que pode ser exportado para JSON/YAML e é mais integrado ao PowerShell 7 e a ambientes modernos como contêineres.