Gerenciamento de configurações

Como o gerenciamento de configuração ajuda as equipes de engenharia a criar sistemas robustos e estáveis

Ian Buchanan Ian Buchanan

Durante a década de 1950, o Departamento de Defesa dos Estados Unidos desenvolveu uma disciplina de gerenciamento técnico para monitorar as mudanças no desenvolvimento de sistemas complexos. Conferiu termos técnicos a este sistema e a várias iterações, até que em 2001 publicou um guia consolidado que estabeleceu o sistema de gerenciamento técnico agora chamado de gerenciamento de configuração. Hoje, o gerenciamento de configuração não é usado apenas pelo departamento de defesa, mas também em desenvolvimento de software, gerenciamento de serviços de TI, engenharia civil, engenharia industrial e muito mais.

O que é gerenciamento de configuração?

Diagrama de gerenciamento de configuração

O gerenciamento de configuração é um processo de engenharia de sistemas para estabelecer a consistência dos atributos de um produto ao longo de sua vida. No mundo da tecnologia, o gerenciamento de configuração é um processo de gerenciamento de TI que monitora itens de configuração individuais de um sistema de TI. Os sistemas de TI são compostos por ativos de TI que variam em granularidade. Um ativo de TI pode representar um software, um servidor ou um cluster de servidores. Este material tem como foco o gerenciamento de configuração aplicado direto aos ativos de software de TI e CI/CD de ativos de software.

O gerenciamento de configuração de software é um processo de engenharia de sistemas que rastreia e monitora alterações em metadados de configuração de sistemas de software. No desenvolvimento de software, o gerenciamento de configuração é muitas vezes usado junto com o controle de versão e a infraestrutura de CI/CD. Este post se concentra em sua aplicação moderna e uso em ambientes ágeis de software de CI/CD.

Por que o gerenciamento de configuração é importante?

O gerenciamento de configuração ajuda as equipes de engenharia a criar sistemas robustos e estáveis por meio do uso de ferramentas de gerenciamento e monitoramento automáticos das atualizações dos dados de configuração. Sistemas de software complexos são compostos por componentes que diferem em granularidade de tamanho e complexidade. Para um exemplo mais concreto considere uma arquitetura de microsserviço. Cada serviço em uma arquitetura de microsserviço usa metadados de configuração para se registrar e inicializar. Alguns exemplos de metadados de configuração de software são:

  • Especificações de alocações de recursos de hardware computacional para CPU, RAM etc.
  • Pontos de extremidade que especificam conexões externas com outros serviços, bancos de dados ou domínios
  • Segredos como senhas e chaves de criptografia

É fácil que esses valores de configuração se tornem uma reflexão posterior, levando a uma configuração desorganizada e dispersa. Imagine inúmeras notas adesivas com senhas e URLs circulando em um escritório. O gerenciamento de configuração resolve esse desafio criando uma “fonte de informações” com um local central para configuração.

Git é uma plataforma fantástica para gerenciar dados de configuração. Mover dados de configuração para um repositório do Git permite que o controle de versão e o repositório atuem como uma fonte de verdade. O controle de versão também resolve outro problema de configuração: mudanças de quebra inesperadas. Gerenciar alterações inesperadas por meio do uso de revisão de código e controle de versão ajuda a minimizar o tempo de inatividade.

Os valores de configuração muitas vezes vão ser adicionados, removidos ou modificados, o que, sem controle de versão, pode causar problemas. Um membro da equipe pode ajustar um valor de alocação de hardware para que o software seja executado com mais eficiência em seu laptop pessoal. Quando o software é implementado depois em um ambiente de produção, essa nova configuração pode ter um efeito abaixo do ideal ou quebrar.

O controle de versão e o gerenciamento de configuração resolvem esse problema adicionando visibilidade às modificações de configuração. Quando uma alteração é feita nos dados de configuração, o sistema de controle de versão o rastreia, o que permite que os membros da equipe revisem uma trilha de auditoria de modificações.

O controle de versão de configuração permite a funcionalidade de rollback ou “desfazer” para a configuração, o que ajuda a evitar quebras inesperadas. O controle de versão aplicado à configuração pode ser revertido com rapidez para um último estado estável conhecido.

Como o gerenciamento de configuração se encaixa com DevOps, CI/CD e metodologia ágil

Os dados de configuração têm um histórico de serem difíceis de contornar e é comum que se tornem uma reflexão posterior. Não são realmente código, então não são colocados direto no controle de versão e não são dados de primeira classe, então não são armazenados em um banco de dados primário. A administração de sistemas tradicionais e de pequena escala em geral é feita com uma coleção de scripts e processos ad hoc. Os dados de configuração podem ser negligenciados às vezes, mas são essenciais para a operação do sistema.

O surgimento das infraestruturas em nuvem levou ao desenvolvimento e adoção de novos padrões de gerenciamento de infraestrutura. Arquiteturas de sistema complexas baseadas em nuvem são gerenciadas e implementadas pelo uso de arquivos de dados de configuração. Essas novas plataformas de nuvem permitem que as equipes especifiquem os recursos de hardware e as conexões de rede de que precisam ser provisionadas por meio de arquivos de dados legíveis por máquina e humanos, como o YAML. Os arquivos de dados são então lidos e a infraestrutura é provisionada na nuvem. Esse padrão é chamado de infraestrutura como código (IaC).

Gerenciamento de configuração de DevOps

Nos primeiros anos de desenvolvimento de aplicativos na internet, a realização dos recursos de hardware e administração de sistemas era manual, na maior parte. Os administradores do sistema mexiam nos dados de configuração enquanto faziam o provisionamento e o gerenciamento manual dos recursos de hardware com base nos dados de configuração.

O gerenciamento de configurações é uma parte fundamental do ciclo de vida de DevOps. A configuração de DevOps é a evolução e a automação da função de administração de sistemas, adicionando automação ao gerenciamento e à implementação de infraestruturas.

A configuração de DevOps também traz a responsabilidade de administração do sistema sob o guarda-chuva da engenharia de software. Hoje em dia, as empresas utilizam essa configuração para capacitar os engenheiros de software para solicitar e provisionar os recursos necessários sob demanda. Assim, é removido um potencial gargalo de dependência organizacional de uma equipe de desenvolvimento de software à espera de recursos de uma equipe de administração de sistema separada.

Gerenciamento de configuração de CI/CD

O gerenciamento de configuração de CI/CD utiliza fluxos de trabalho de revisão de código baseados em solicitações pull para automatizar a implementação de alterações de código em um sistema de software ativo. Este mesmo fluxo pode ser aplicado às alterações de configuração. A CI/CD pode ser configurada para que as solicitações de alteração de configuração aprovadas possam ser imediatamente implementadas em um sistema em execução. Um exemplo perfeito desse processo é um fluxo de trabalho do GitOps.

Gerenciamento ágil de configuração

O gerenciamento de configuração permite que equipes ágeis triem claramente e priorizem o trabalho de configuração. Exemplos de trabalho de configuração são tarefas e tarefas como:

  • Atualizar os certificados SSL de produção
  • Adicionar um novo ponto de extremidade de banco de dados
  • Altere a senha para serviços de e-mail de desenvolvimento, staging e produção.
  • Adicionar chaves de API para uma nova integração de terceiros

Quando uma plataforma de gerenciamento de configuração estiver implementada, as equipes têm visibilidade do trabalho necessário para tarefas de configuração. O trabalho de gerenciamento de configuração pode ser identificado como dependências para outro trabalho e endereçado corretamente como parte de sprints ágeis.

Ferramentas de gerenciamento de configuração

Ferramentas de gerenciamento de configuração

Git

O Git é o sistema de controle de versão líder do setor para rastrear alterações de código. Adicionar dados de gerenciamento de configuração ao lado de código em um Repositório do Git possibilita uma visualização holística de controle de versão de um projeto inteiro. O Git é uma ferramenta fundamental no gerenciamento de configuração de nível superior. A lista a seguir de outras ferramentas de gerenciamento de configuração foi projetada para ser armazenada em um repositório do Git e alavancar o controle de versão do Git.

Docker

O Docker introduziu a conteinerização que é uma forma avançada de gerenciamento de configuração — como um bloqueio de configuração. O Docker é baseado em arquivos de configuração chamados Dockerfiles, que contêm uma lista de comandos que são avaliados para reconstruir o instantâneo esperado do estado do sistema operacional. O Docker cria contêineres a partir desses arquivos Dockerfiles que são instantâneos de um aplicativo pré-configurado. Dockerfiles passam por commit para um repositório do Git para rastreamento de versão e precisam de gerenciamento de configuração adicional para implementação na infraestrutura.

Terraform

O Terraform é uma plataforma de gerenciamento de configuração de código aberto da HashiCorp. O Terraform usa o IaC para provisionar e gerenciar clusters, infraestrutura de nuvem ou serviços. O Terraform oferece suporte para Amazon Web Services (AWS), Microsoft Azure e outras plataformas de nuvem. Cada plataforma de nuvem tem sua própria representação e interface para componentes de infraestrutura comuns, como servidores, bancos de dados e filas. O Terraform criou uma camada de abstração de ferramentas de configuração para plataformas de nuvem que permitem às equipes gravar arquivos que são definições reprodutíveis de sua infraestrutura.

Ansible, SaltStack, Chef, Puppet

Ansible, SaltStack e Chef são frameworks de automação de TI. Esses frameworks automatizam os processos de muitos administradores de sistemas tradicionais. Cada framework usa uma série de arquivos de dados de configuração — em geral YAML ou XML — que são avaliados por um executável.

Os arquivos de dados de configuração especificam uma sequência de ações a serem executadas para configurar um sistema. As ações são então executadas pelo executável. O executável difere na linguagem entre os sistemas — Ansible e SaltStack são baseados em Python e Chef is Ruby. Esse fluxo de trabalho é semelhante à execução de scripts de shell ad hoc, mas oferece uma experiência mais estruturada e refinada através dos respectivos ecossistemas de plataformas. Essas ferramentas são o que vai permitir a automação necessária para alcançar CI/CD.

Como implementar o gerenciamento de configuração

Identificação

A primeira ação para o gerenciamento de configuração é a coleta de informações. Os dados de configuração devem ser agregados e compilados a partir de diferentes ambientes de aplicativos, desenvolvimento, staging e produção para todos os componentes e serviços em uso. Quaisquer dados secretos, como senhas e chaves, devem ser identificados e criptografados e armazenados em segurança. Neste ponto, os dados de configuração devem ser organizados em arquivos de dados que podem ser apontados como uma fonte central de verdade.

Parâmetro

Depois que os dados de configuração foram agregados e organizados, uma linha de base pode ser estabelecida. Uma configuração de linha de base é um estado de configuração conhecido que vai operar com sucesso o software dependente sem erro. Essa linha de base costuma ser criada pela revisão da configuração de um ambiente de produção funcional e commits dessas configurações.

Controle de versão

Seu projeto de desenvolvimento deve usar um sistema de controle de versão. Caso contrário, instale o Git, inicialize um repositório para o projeto e adicione os arquivos de dados de configuração ao repositório. Uma observação de segurança antes de adicionar dados de configuração a um repositório: garanta que todos os dados secretos, como senhas ou chaves, sejam criptografados com uma chave externa. Dados secretos que passam por commit por acidente para um repositório são um risco enorme. Ele precisa ser lavado do histórico dos repositórios ou corre o risco de ser explorado.

auditoria

Ter os dados de configuração organizados e adicionados a um repositório permite a colaboração e a visibilidade da configuração do sistema. O fluxo de trabalho popular de solicitação pull que as equipes de software usam para revisar e editar código pode ser aplicado aos arquivos de dados de configuração. Assim fica mais fácil construir um sistema de auditoria e contabilidade. Quaisquer alterações aplicadas à configuração devem ser revisadas e aceitas pela equipe. Assim, as mudanças de configuração ganham responsabilidade e visibilidade.

Conclusão…

O gerenciamento de configuração é uma ferramenta necessária para gerenciar sistemas de software complexos. A falta de gerenciamento de configuração pode causar sérios problemas com confiabilidade, tempo de atividade e escalabilidade do sistema. Muitas ferramentas atuais de desenvolvimento de software têm gestão de recursos de configuração integrados. O Bitbucket oferece um sistema poderoso para gerenciamento de configuração que é construído em torno de fluxos de trabalho de solicitação pull do Git e pipelines de CI/CD.