3. Como é o seu ambiente pessoal de testes?
● Servidor compartilhado, sua máquina ou VM?
● O setup é automático?
○ Existe, pelo menos, um procedimento?
○ Quanto demora?
● O ambiente é padronizado? Quanto?
○ Sistema Operacional (Linux, Windows, Mac?)
Plataforma (Java, Python, Ruby, Perl?)
Servidor de Aplicação (JBoss, Tomcat, Jetty, php-fpm?)
Banco de Dados (H2, MySQL, PostgreSQL, Oracle?)
…
○ eu perguntei das versões?
4. Como você usa o seu ambiente de testes?
● Como copiar os artefatos entre os ambientes?
○ scp, rsync, wget, JRebel, …?
● Quão “confortável” é trabalhar no ambiente de testes?
○ Tem que usar “vi” pra editar os arquivos? :-)
● Dá pra fazer rollback pra recomeçar os testes?
5. E a gestão de configuração?
● O seu ambiente é “igual” ao de produção?
Mas na
minha
máquina
funciona...
● O ambiente é único para todos os projetos?
● E para os projetos antigos?
7. O que você precisa instalar?
vagrantup.com/downloads.html
virtualbox.org/wiki/Downloads
8. Vagrant Boxes & Providers
● Um box é um arquivo contendo a imagem básica de
uma VM que será gerenciada pelo Vagrant.
● Cada box é específico para um provider.
○ VirtualBox, VMWare, Hyper-V, AWS, Docker, ...
● Um box pode conter qualquer sistema operacional.
● Use e boxes públicos do VagrantCloud.com e
publique seus próprios boxes.
18. Synchronized folders
● Por default o diretório do host onde fica o Vagrantfile
é “montado” na VM em /vagrant.
○ Útil para acelerar o ciclo de testes das aplicações, pois o diretório
do projeto é visível pela VM.
● config.vm.synced_folder "www/", "/website"
○ Monta o diretório www do host em /website na VM.
Host
VM
19. Default Networking = NAT
● Por default a VM é configurada com uma rede “NAT”,
usando um IP privado, o que lhe permite acessar o
mundo externo mas não o contrário.
Host
VM
21. Host
VM
Public Networking
● config.vm.network :public_network
○ Cria uma rede “bridged”, alocando um MAC para a VM e
conectando-a diretamente à rede física.
○ Mais intrusiva que a rede NAT. Use apenas se souber
exatamente o que está fazendo. :-)
22. Private Networking
● config.vm.network :private_network
○ Cria uma rede privada que pode ser compartilhada por mais de
uma VM.
○ Útil para ambientes de desenvolvimento complexos que exijam
múltiplas VMs comunicando-se entre si.
Host
VM
VM
23. Vagrant plugins
● 21 providers
○ KVM, VMware, Hyper-V, AWS, ...
● vagrant-cachier
○ “caffeine reducer”
○ Cache packages for APT, YUM, etc.
● vagrant-vbguest
○ Keep VirtualBox Guest Additions up to date
● vagrant-vbox-snapshot
○ Manage VirtualBox snapshots
github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins
28. Provisionamento
● “Provisionar uma VM” significa executar comandos nela
para instalar, configurar ou atualizar software.
● O Vagrant suporta vários mecanismos de
provisionamento:
○ Shell scripts, Puppet, Chef, Ansible, CFengine, Salt, Docker
● O provisionamento ocorre implicitamente ao final do
processo de criação da VM (primeiro vagrant up) ou
explicitamente pelo comando vagrant provision.
29. Provisionamento via shell
● config.vm.provision :shell,
inline: "echo Hello, World"
○ Invoca o comando direto na VM
● config.vm.provision :shell,
path: "vm/provision.sh"
○ Invoca na VM o script /vagrant/vm/provision.sh
config.vm.provision :shell,
path:"https://raw.github.../provision.sh"
○ Invoca na VM o script /tmp/vagrant-shell20140519-9217...sh
30. Provisionamento via Puppet
● config.vm.provision :puppet
○ Executa na VM o comando
■ puppet apply /vagrant/manifests/default.pp
31. http://puppetlabs.com/puppet/puppet-open-source
“Puppet is a declarative, model-based approach to IT
automation, helping you manage infrastructure
throughout its lifecycle, from provisioning and
configuration to orchestration and reporting. Using
Puppet, you can easily automate repetitive tasks,
quickly deploy critical applications, and proactively
manage change, scaling from 10s of servers to 1000s,
on-premise or in the cloud.”
32. Puppet - scripts declarativos
Descrevem “recursos” e suas relações.
○ Você diz “como é” sua infraestrutura e não “como construí-la”
package { ['apache2', 'libapache2-mod-php5']:
ensure => installed,
}
->
file { '/etc/apache2/sites-enabled/001-localhost.conf':
ensure => file,
source => '/vagrant/manifests/apache2-virtualhost.conf',
}
~>
service { 'apache2':
ensure => running,
enable => true,
}
33. Puppet - scripts idempotentes
Pode-se executar os scripts múltiplas vezes pois cada recurso
“sabe” quando já está configurado.
exec { '/usr/sbin/locale-gen pt_BR.utf8':
unless => '/usr/bin/locale -a | grep -qF pt_BR.utf8',
}
exec { 'perl -i.orig -lpe "s/^#(?=color_prompt)//" .bashrc':
user => 'vagrant',
path => '/usr/bin',
creates => '/home/vagrant/.bashrc.orig',
}
45. Módulos tipo Componente
CPqD Developer Suite “Puppetizado”
mysql
nginx
jenkins
jira
sonarqube
nexus
testlink
gerrit
Módulos tipo Profile
cds::jenkins
cds::jira cds::nexus cds::sonar
cds::testlink cds::gerrit
ldap
jboss
Configuração
46. See Also...
● Caso Locaweb
○ “Standardise Development Environments and Machine Images with
Packer”
○ go.cpqd.com.br/packer-pt
● Caso Wikimedia
○ “Ever wondered how the Wikimedia servers are configured?”
○ https://gerrit.wikimedia.org/r/p/operations/puppet
● Apresentação na RubyConf 2013
○ “Usando Vagrant como ambiente de desenvolvimento Ruby”
○ go.cpqd.com.br/vagrant-pt