Puppet e Vagrant: Como provisionar máquinas para seu projeto
Olá todos, hoje falaremos um pouco sobre provisionamento de maquinas e VMs. A idea deste post é mostrar algumas maneiras para facilitar o desenvolvimento, implantação e ramp-up de novas pessoas na sua equipa.
Então, o que é provisionamento de maquinas?
Todo projeto possui suas dependências -- tendo serviços rodando em background, linguagens, jdks e servidores web. Algumas vezes, os passos para ter seu programa rodando em uma maquina nova não estão documentados e depende bastante de tentativa e erro.
E assim que você começa a instalar seu app, lhe falta compilar a biblioteca do postgresql para a gem. E então você instala, mas esqueceu de compilar o ruby com o ultimo patch aplicado. E por ai vai, até que finalmente você consegue ter seu sistema rodando.
Martin Fowler chama esse tipo de maquina provisionada e montadas manualmente de Snowflake machineshttp://martinfowler.com/bliki/SnowflakeServer.html. Elas geralmente não possuem backup, e se houver alguma falha de disco, será muito trabalho para colocar o projeto rodando em um computador novo.
O processo de provisionamento é um conjunto de passos executáveis que podem ser aplicadas em uma imagem inicial para ter tudo configurado corretamente. Esse conjunto de passos traz como beneficio a repetibilidade em ambiente de produção e uma documentação executável dos procedimentos para configuração.
Hoje, existem uma serie de ferramentas para provisionar sua maquina, cada uma delas com seus diferente benefícios e peculiaridades. Vale a pena dar uma olhada no https://www.chef.io/chef/, Puppethttps://puppetlabs.com/puppet/what-is-puppet, Ansible http://www.ansibleworks.com/ e Salt https://saltstack.com/.
Um pouco sobre o Puppet
O Puppet é uma ferramenta que permite você abstrair conceitos específicos do sistema que você gostaria de configurar, o que torna o processo um pouco mais flexível e independente do sistema operacional.
A ferramenta permite que você instale pacotes ou rode serviço durante a inicialização, independente do programa que seria usado no seu computador (brew, apt, yum, pacman ou init, upstart, systemd)
Com o Puppet você pode definir comandos que precisam ser rodados, pacotes a serem instalados, dependência entre os passos, conteúdo de arquivo e tudo mais que fosse preciso fazer para ter o programa rodando sem problemas.
Um exemplo de um arquivo Puppet para provisionar dotfiles pode ser encontrado aquihttps://github.com/bltavares/vagrant-baseline/blob/master/puppet/modules/baseline/manifests/dotfiles.pp.
O projeto usa sua própria linguagem declarativa e possui um esquema de identificação de host. É possível definir quais passos serão utilizados dependendo de diferente variáveis -- hostname, numero do IP, quantidade de memoria, tamanho de disco e por ai vai.
A forma de identificação também pode ser externa, permitindo a configuração de clusters e sistemas distribuídos ou até relações master-slave para os serviços.
Cada grupo de servidores em produção podem ser configurado diferentemente, com as maquinas mais rápidas sendo servidores web e as com mais disco como servidores de arquivos.
Trazendo a nuvem para o ambiente de desenvolvimento
O ambiente de desenvolvimento também pode se beneficiar das tecnologias da nuvem. Usando a combinação de Vagrant e Puppet, o ambiente local pode ficar mais parecido com o ambiente em produção.
As diferenças entre o desenvolvimento e a implantação diminuem, e permite também que você utilize seu sistema favorito para desenvolver (Windows, Mac, Linux com sua app rodando na VM)
Imagine a felicidade do novo membro da equipe rodando um comando, conseguindo tudo pronto para rodar o projeto e começar a desenvolver ainda no mesmo dia!
Mais sobre o Vagrant
O Vagrant é um projeto que facilita a criação de maquinas virtuais. Ele começou como uma abstração da linha de comando do VirtualBox, algo similar a um Gemfile para VMs.
Você pode escolher qual será a imagem inicial, opções de rede, endereço de IP, pastas compartilhadas com o host, descritos em um arquivo para que qualquer um possa recriar uma maquina apropriadamente.
O Vagrant possui diferentes extensões, suporte a diferente ferramentas de versionamento e provedores de VM. Escolha entre utilizar o VirtualBox, VMWare, ou através de extensões, utilizar instancias de maquinas no EC2.
Para começar a usar, instale o pacote http://www.vagrantup.com e o VirtualBox (Eu ainda não cheguei a usar outro provedor de VM). Esta documentação https://docs.vagrantup.com/v2/getting-started/index.html ira ajudar a criar o seu primeiro Vagrantfile.
Baseline: um sandbox de desenvolvimento com baterias incluídas
Baseline https://github.com/bltavares/baseline é uma ferramenta na linha de comando para prover VM com o ambiente inicial pronto para começar a desenvolver em uma linguagem que você preferir.
Vamos dizer que você queira aprender Scala. Com um simples baseline up scala
, você terá uma VM com Java, Scala e sbt pronta em alguns minutos.
O conteúdo do diretório em que o baseline init
rodar será compartilhado com a maquina virtual, o que significa que para contribuir em qualquer repositório, basta usar um git pull
e um baseline up
. Não precisa se preocupar mais em instalar mais nada no seu computador.
A lista completa com todos os ambiente suportados esta aqui https://github.com/bltavares/vagrant-baseline#current-environments e inclui ruby, nodejs, mongo e redis, além de outros. Espero que goste das ideas. Não esqueça de passar o feedback do que foi escrito aqui.
Aviso: As afirmações e opiniões expressas neste artigo são de responsabilidade de quem o assina, e não necessariamente refletem as posições da Thoughtworks.