De uma "inicialização" a milhares de servidores em uma dúzia de data centers. Como perseguimos o crescimento da infraestrutura Linux

Se sua infraestrutura de TI cresce muito rapidamente, mais cedo ou mais tarde você terá a opção de aumentar linearmente os recursos humanos para dar suporte ou iniciar a automação. Até um certo momento, vivemos no primeiro paradigma e, em seguida, um longo caminho até Infraestrutura como código começou.







Obviamente, o NSPK não é uma startup, mas essa atmosfera prevaleceu na empresa nos primeiros anos de sua existência, e esses foram anos muito interessantes. Meu nome é Dmitry Kornyakov , apoio a infraestrutura Linux com requisitos de alta disponibilidade há mais de 10 anos. Ele se juntou à equipe do NSPK em janeiro de 2016 e, infelizmente, não viu o começo da existência da empresa, mas veio no estágio de grandes mudanças.



Em geral, podemos dizer que nossa equipe fornece 2 produtos para a empresa. O primeiro é a infraestrutura. O correio deve ser enviado, o DNS deve funcionar e os controladores de domínio devem permitir servidores em que não caem. O cenário de TI da empresa é enorme! Estes são sistemas críticos para negócios e missão; os requisitos de disponibilidade para alguns são de 99.999. O segundo produto são os próprios servidores, físicos e virtuais. Os existentes precisam ser monitorados, e novos são regularmente fornecidos a clientes de vários departamentos. Neste artigo, quero me concentrar em como desenvolvemos a infraestrutura responsável pelo ciclo de vida dos servidores.



O início do caminho



No início do caminho, nossa pilha de tecnologias era assim: controladores de domínio

OS CentOS 7

FreeIPA

Automation - Ansible (+ Tower), Cobbler




Tudo isso estava localizado em três domínios, espalhados por vários data centers. Em um data center - sistemas de escritório e locais de teste, no restante, PROD.



Em algum momento, a criação dos servidores ficou assim:







No modelo mínimo do VM CentOS e no mínimo necessário, como o /etc/resolv.conf correto, o restante ocorre através do Ansible.



CMDB - Excel.



Se o servidor for físico, em vez de copiar a máquina virtual, o sistema operacional foi instalado usando o Cobbler - os endereços MAC do servidor de destino são adicionados à configuração do Cobbler, o servidor recebe um endereço IP via DHCP e o SO é derramado.



No começo, tentamos fazer algum tipo de gerenciamento de configuração no Cobbler. Mas com o tempo, isso começou a trazer problemas com a portabilidade das configurações para outros data centers e para o código Ansible para preparar a VM.



Naquela época, muitos de nós percebemos o Ansible como uma extensão conveniente do Bash e não economizamos em construções usando a concha sed. Em geral Bashsible. Isso levou ao fato de que, se por algum motivo o manual de instruções não funcionasse no servidor, era mais fácil excluir o servidor, corrigi-lo e executar novamente. De fato, não havia versão de script, portabilidade de configuração também.



Por exemplo, queríamos alterar algumas configurações em todos os servidores:



  1. Alteramos a configuração nos servidores existentes no segmento lógico / data center. Às vezes, não da noite para o dia - os requisitos de disponibilidade e a lei de grandes números não permitem que todas as alterações sejam aplicadas de uma só vez. E algumas mudanças são potencialmente destrutivas e exigem a reinicialização de tudo - dos serviços ao próprio sistema operacional.
  2. Fixação no Ansible
  3. Fixação no Sapateiro
  4. Repita N vezes para cada segmento lógico / data center


Para que todas as mudanças ocorram sem problemas, muitos fatores tiveram que ser considerados e as mudanças estão ocorrendo constantemente.



  • Refatorando código ansible, arquivos de configuração
  • Alterando as melhores práticas internas
  • Alterações após a análise de incidentes / acidentes
  • Alteração dos padrões de segurança, internos e externos. Por exemplo, o PCI DSS é atualizado com novos requisitos todos os anos


Crescimento da infraestrutura e o início do caminho O



número de servidores / domínios lógicos / datacenters cresceu e, com eles, o número de erros nas configurações. Em algum momento, chegamos a três direções, nas quais precisamos desenvolver o gerenciamento de configuração:



  1. Automação. Na medida do possível, o fator humano em operações repetitivas deve ser evitado.
  2. . , . . – , .
  3. configuration management.


Resta adicionar algumas ferramentas.



Escolhemos o GitLab CE como nosso repositório de código, principalmente para os módulos CI / CD embutidos.



Cofre de segredos - Cofre de Hashicorp, incl. para a ótima API.



Testando configurações e funções ansible - Molecule + Testinfra. Os testes são executados muito mais rapidamente se estiverem conectados ao mitogênio ansível. Paralelamente, começamos a escrever nosso próprio CMDB e um orquestrador para implantação automática (na imagem acima do Cobbler), mas essa é uma história completamente diferente, que meu colega e o principal desenvolvedor desses sistemas contará no futuro.



Nossa escolha:



Molécula + Testinfra

Ansible + Torre + AWX Server

World + DITNET (In-house)

Sapateiro

Gitlab + Corredor do

GitLab Hashicorp Vault









Falando de papéis ansíveis. No início, estava sozinho, depois de várias refatorações, existem 17. Eu recomendo dividir o monólito em funções idempotentes, que podem ser executadas separadamente, você pode adicionar tags adicionalmente. Dividimos os papéis por funcionalidade - rede, registro, pacotes, hardware, molécula etc. Em geral, aderimos à estratégia abaixo. Não insisto que essa seja a única verdade, mas funcionou para nós.



  • Copiar servidores da "imagem de ouro" é ruim!



    A principal desvantagem é que você não sabe exatamente em que estado as imagens estão agora e que todas as alterações ocorrerão em todas as imagens em todos os farms de virtualização.
  • Use os arquivos de configuração padrão no mínimo e concorde com outros departamentos sobre os arquivos principais do sistema pelos quais você é responsável , por exemplo:



    1. /etc/sysctl.conf , /etc/sysctl.d/. , .
    2. override systemd .
  • , sed
  • :



    1. ! Ansible-lint, yaml-lint, etc
    2. ! bashsible.
  • Ansible molecule .
  • , ( 100) 70000 . .





Nossa implementação



Portanto, os papéis ansíveis estavam prontos, modelados e verificados pelos linters. E até gits são criados em todos os lugares. Mas a questão da entrega confiável de código para diferentes segmentos permaneceu em aberto. Decidimos sincronizar com scripts. É assim:







Após a mudança, o CI é iniciado, um servidor de teste é criado, as funções são roladas, testadas com uma molécula. Se tudo estiver ok, o código vai para o ramo de produção. Mas não estamos aplicando o novo código aos servidores existentes na máquina. Esse é um tipo de rolha necessária para a alta disponibilidade de nossos sistemas. E quando a infraestrutura se torna enorme, a lei de grandes números entra em jogo - mesmo se você tiver certeza de que a mudança é inofensiva, isso pode levar a tristes conseqüências.



Há também muitas opções para criar servidores. Acabamos escolhendo scripts python personalizados. E para o IC ansible:



- name: create1.yml - Create a VM from a template
  vmware_guest:
    hostname: "{{datacenter}}".domain.ru
    username: "{{ username_vc }}"
    password: "{{ password_vc }}"
    validate_certs: no
    cluster: "{{cluster}}"
    datacenter: "{{datacenter}}"
    name: "{{ name }}"
    state: poweredon
    folder: "/{{folder}}"
    template: "{{template}}"
    customization:
      hostname: "{{ name }}"
      domain: domain.ru
      dns_servers:
        - "{{ ipa1_dns }}"
        - "{{ ipa2_dns }}"
    networks:
      - name: "{{ network }}"
        type: static
        ip: "{{ip}}"
        netmask: "{{netmask}}"
        gateway: "{{gateway}}"
        wake_on_lan: True
        start_connected: True
        allow_guest_control: True
    wait_for_ip_address: yes
    disk:
      - size_gb: 1
        type: thin
        datastore: "{{datastore}}"
      - size_gb: 20
        type: thin
        datastore: "{{datastore}}"


É para isso que chegamos, o sistema continua a viver e a se desenvolver.



  • 17 funções possíveis para configurar o servidor. Cada uma das funções foi projetada para resolver uma tarefa lógica separada (log, auditoria, autorização do usuário, monitoramento etc.).
  • Teste de função. Molécula + TestInfra.
  • Desenvolvimento próprio: CMDB + Orchestrator.
  • Tempo de criação do servidor ~ 30 minutos, automatizado e praticamente independente da fila de tarefas.
  • O mesmo estado / nome da infraestrutura em todos os segmentos - playbooks, repositórios, elementos de virtualização.
  • Verificação diária do status dos servidores com geração de relatórios sobre discrepâncias com o padrão.


Espero que minha história seja útil para aqueles que estão no início da jornada. Qual pilha de automação você está usando?



All Articles