globo .com Test Driven Infrastructure na Globo.com Fernando Carolo e Rogério Schneider QCon São Paulo 2014 Quinta-feira 15:45 Uma turminha do barulho aprontando altas confusões configurações Tudo era feito à mão ! ! PARTE 1 Configurar um servidor era tarefa manual Instalar pacotes, editar arquivos Alguns arquivos foram para um share NFS /etc, /opt, /usr/local acertados manualmente Trabalho repetido em vários hosts ClusterSSH, Capistrano globo .com Uma maneira melhor Infraestrutura = código globo .com Mesmos princípios Controle de versão Pair programming e revisão de código Test driven development Integração contínua globo .com Ferramentas Controle de versão Automação Máquinas virtuais Integração contínua Escolha as suas globo .com Ferramentas que usamos Controle de versão Git Automação Kickstart, Puppet Máquinas virtuais Vagrant Integração contínua Jenkins Não são as únicas globo .com Kickstart Instalação padronizada de SO Imagens para boot via PXE Apenas os pacotes básicos Serviços essenciais (resolver, ntp, ldap) Diferenças só por conta do hardware globo .com Puppet Configuração do host para um projeto Pacotes de software Arquivos de configuração Controle do startup da máquina globo .com Foreman Front-end para o puppet master Atribuição de papéis a cada host Gerência de certificados do puppet Status de cada host globo .com Vagrant Gerenciamento de máquinas virtuais Criação de VMs por script Compatível com Virtualbox, VMWare, etc Ambiente completo no seu notebook globo .com Jenkins Integração contínua também para infra Testes unitários nos módulos puppet Montagem de ambientes com Vagrant Instalação e testes do projeto globo .com Aprendizado ! ! PARTE 2 Puppet é funcional Módulos descrevem o estado desejado Pense em makefile, não em script Dependências devem ser explícitas Use requires e anchors Desfazer é difícil Usar ensure => absent fica confuso Começar do zero é mais fácil globo .com Unifique o código do seu projeto Aplicação + módulos puppet Versionamento em conjunto Isole os parâmetros do código Use defines separados ou hiera Código legível é código bonito puppet-lint globo .com Separe os ambientes no Foreman Versões para desenvolvimento, QA, produção Cuidado com módulos compartilhados Testes e eterna vigilância Librarian-puppet pode ajudar Decida como aplicar as mudanças Use --onetime ao invés de rodar o agente como daemon globo .com Infraestrutura = código dos outros ! ! PARTE 3 Mudanças acontecem o tempo todo Em outros lugares Principalmente em produção Nem tudo está do jeito desejado Serviços externos, bases de dados, servidores de arquivos, ACLs, etc Precisamos de testes de aceitação globo .com Nossa solução: TDI Ferramenta para rodar testes sobre a infra DNS, filesystem, HTTP, etc Prática de TDD Escreva o teste, rode, corrija os erros Plano de teste num arquivo JSON Pode ser gerado no build da aplicação Ajustado ao papel de cada host Torna-se teste de aceitação da infraestrutura globo .com TDI Ruby – gem install tdi Open source (github) Beta Curta e compatilhe Pull requests são bem-vindos globo .com Demonstração ! ! PARTE 4 Serviços externos via HTTP URLs de serviços públicos na internet globo .com { "app": { "desc": "Test service dependencies", "http": { "http://globoesporte.globo.com/healthcheck": { "match": "WORKING" }, "http://api.sde.globo.com": { "code" : 301 }, "https://api.sde.globo.com": { "code" : 401 }, "https://api.cartola.globo.com/mercado/status.json": { "code" : 200 }, "https://api.cartola.globo.com/wrong-url": { "code" : 200 } } } } globo .com globo .com Acessos de rede Conexões em portas específicas globo .com { "app": { "desc": "Test network connectivity", "acl": { "port": 80, "www.globo.com": { }, "globoesporte.globo.com": { }, "g1.globo.com": { }, "www.example.com": { "port": 9999 }, "localhost": { "port": [22, 80, 65535] } } } } globo .com globo .com Perguntas ! ! FINAL CRÉDITOS Fernando Carolo [email protected] Rogério Schneider [email protected] ! TDI github.com/globocom/tdi rubygems.org/gems/tdi globo .com Kickstart fedoraproject.org/wiki/Anaconda/Kickstart Puppet puppetlabs.com/puppet/puppet-open-source Foreman theforeman.org Vagrant www.vagrantup.com globo .com Obrigado