Download pdf - Vagrant + Puppet

Transcript
Page 1: Vagrant + Puppet

Junho/2014

Page 2: Vagrant + Puppet

Gustavo Chavesabout.me/gnustavo

Page 3: Vagrant + Puppet

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?

Page 4: Vagrant + Puppet

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?

Page 5: Vagrant + Puppet

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?

Page 6: Vagrant + Puppet

http://vagrantup.com

Vagrant

Page 8: Vagrant + Puppet

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.

Page 9: Vagrant + Puppet

Vagrant Command Line Interface

Page 10: Vagrant + Puppet

Vagrant init & Vagrantfile

Page 11: Vagrant + Puppet

Vagrant status

Page 12: Vagrant + Puppet

not created

running

poweroff

Vagrant status

saved

vagrant up

vagrant suspendvagrant up

vagrant halt

vagrant halt

vagrant destroy

Page 13: Vagrant + Puppet

Vagrant up

Page 14: Vagrant + Puppet

Vagrant ssh

Page 15: Vagrant + Puppet

Vagrant suspend

Page 16: Vagrant + Puppet

Vagrant halt

Page 17: Vagrant + Puppet

Vagrant destroy

Page 18: Vagrant + Puppet

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

Page 19: Vagrant + Puppet

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

Page 20: Vagrant + Puppet

Network port forwarding

Host

VM

80:

8080:

Remote

● config.vm.network :forwarded_port, guest: 80, host: 8080

○ Permite acesso da rede física à porta 80 da VM através da porta 8080 do host

Page 21: Vagrant + Puppet

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. :-)

Page 22: Vagrant + Puppet

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

Page 23: Vagrant + Puppet

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

Page 24: Vagrant + Puppet

Vagrant snapshot

Page 25: Vagrant + Puppet

Vagrant snapshot

Page 26: Vagrant + Puppet

Vagrant snapshot

Page 27: Vagrant + Puppet

running

vagrant snapshot take

vagrant up

snapshotted

dirty

vagrant snapshot backdeploy

test

Ciclo de desenvolvimento fast-track

Page 28: Vagrant + Puppet

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.

Page 29: Vagrant + Puppet

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

Page 30: Vagrant + Puppet

Provisionamento via Puppet

● config.vm.provision :puppet○ Executa na VM o comando

■ puppet apply /vagrant/manifests/default.pp

Page 31: Vagrant + Puppet

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.”

Page 32: Vagrant + Puppet

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,}

Page 33: Vagrant + Puppet

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',}

Page 34: Vagrant + Puppet

Puppet - Idempotência

file 1

file 1 service A

file 2package A

file 1 service A

file 2package A

Page 35: Vagrant + Puppet

Puppet - Recursos pré-definidos

● 54 tipos de recursos○ exec○ file○ group○ host○ interface○ mount○ package○ service○ user○ …

● Google puppet types

Page 36: Vagrant + Puppet

Puppet Forge - módulos compartilhados

● https://forge.puppetlabs.com/

● + 2.300 módulos, e.g.:

○ puppetlabs/stdlib○ puppetlabs/apache○ puppetlabs/mysql○ puppetlabs/postgresql○ puppetlabs/ntp

○ jfryman/nginx○ maestrodev/wget○ thias/php○ example42/jboss

Um módulo define novos recursos parametrizados

Page 37: Vagrant + Puppet

Demo: Vagrantfile

Page 38: Vagrant + Puppet

Demo: manifests/default.pp

Page 39: Vagrant + Puppet

Demo: manifests/apache2-virtualhost.conf

Page 40: Vagrant + Puppet

Demo

$ vagrant up

>>> localhost:8080

$ vagrant snapshot take provisioned

$ vagrant provision

$ vagrant ssh -- sudo apt-get remove apache2

$ vagrant provision

>>> vi site/index.php

>>> localhost:8080

$ vagrant snapshot take base

$ vagrant snapshot back

Page 41: Vagrant + Puppet

Como isso tudo se integra ao meu projeto?

$ vagrant up

$ vagrant snapshot take base

$ pense, trabalhe, teste...

$ vagrant snapshot back

Page 42: Vagrant + Puppet

Ambientes diferentes!?!

Produção

Page 43: Vagrant + Puppet

Vagrant + Puppet = ambientes idênticos

Produção

Page 44: Vagrant + Puppet

Exemplo mais “complexo”

CDS Demo

MySQL OpenLDAP

Gerrit JIRA Jenkins TestLink SonarQube

JBoss

nginx

firefox

Page 45: Vagrant + Puppet

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

Con

figur

ação

Page 46: Vagrant + Puppet

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

Page 47: Vagrant + Puppet

www.cpqd.com.br

Gustavo [email protected](19) 3705 7003

Obrigado!