orquestração com mcollective
DESCRIPTION
Palestra que aborda orquestração de servidores utilizando Mcollective e PuppetTRANSCRIPT
![Page 1: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/1.jpg)
McollectiveOrquestrando o seu parque de servidores
![Page 2: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/2.jpg)
<%whoami%>
‣ José Augusto (Guto) Carvalho
‣ Consultor, Instrutor, SysAdmin e DevOp
‣ Blogueiro de TI há mais de 10 anos
‣ RHCSA, RCHE, LPIC3, PCP2, NCLA, FCNSAv5…
‣ 14 anos de experiência como sysadmin Linux
‣ Atuou em diversos projetos de Governo em Brasília
‣ ITI, MINICOM, MDA, MD, EBC, DATAPREV, CAIXA, DETRAN/DF e ANATEL
![Page 3: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/3.jpg)
Agenda‣ Introdução a orquestração
‣ Introdução ao Mcollective
‣ Instalando e configurando
‣ Utilizando agentes e clientes
‣ Plugins e Filtros
‣ Construção de agentes e clientes
‣ Demonstração Mcollective em VMs
‣ Comunidade e suporte
‣ Perguntas
![Page 4: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/4.jpg)
Orchestration
Orchestration describes the automated
arrangement, coordination, and management of
complex computer systems, middleware, and
services.http://en.wikipedia.org/wikiOrchestration_(computing)
![Page 5: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/5.jpg)
Orquestração
Orquestrar significa invocar ações de forma paralela
ou não, em tempo real, em diversos servidores de
um da t a cente r , f a zendo i s t o de f o rma
automatizada, eficiente e controlada.
Definição por Guto Carvalho
![Page 6: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/6.jpg)
Por que orquestrar se eu já uso Puppet?
![Page 7: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/7.jpg)
Exemplo de caso
Vamos supor que por alguma razão você precise rodar algum comando em todos os seus servidores, seja para atualizar um pacote, seja para desligar um serviço, seja para remover um usuário ou aplicar uma regra de firewall, enfim, por qualquer que seja a razão, como você fará isto?
![Page 8: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/8.jpg)
Exemplo de caso
E se por alguma razão você precise desligar o puppet, reiniciar o puppet, desativar o puppet momentaneamente em algum ou em vários nodes de parque, como você fará isto?
![Page 9: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/9.jpg)
O Puppet também precisa de gerenciamento, ele é um serviço e necessita de eventual manutenção.
![Page 10: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/10.jpg)
Puppet way
Sabemos que o puppet nos permite gerenciar nodes, porém, para funcionar ele depende de uma consulta do agente ao master, que fornecerá o catálogo a ser aplicado ao node.
![Page 11: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/11.jpg)
Essa consulta pode levar m i n u t o s o u h o r a s dependendo do seu setup.
![Page 12: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/12.jpg)
Como fazer em tempo real?
![Page 13: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/13.jpg)
Mcollective
![Page 14: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/14.jpg)
Ferramenta mantida pela Puppetlabs que implementada orquestração de servidores em tempo real e de forma paralela.
![Page 15: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/15.jpg)
Mcollective
‣ Mcollective foi criado por R.I. Piennar
‣ Ele também criou o extlookup e hiera
‣ Linguagem Ruby
‣ Depende de Middleware (ApacheMQ).
‣ Provê orquestração e execução paralela de tarefas
‣ Provê inventário descentralizado (fatos/nodes/classes)
‣ Projeto modular com agentes e plugins
‣ Atualmente na versão 2.5.1
![Page 16: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/16.jpg)
Middleware (MQ)
‣ ActiveMQ
‣ RabbitMQ
![Page 17: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/17.jpg)
Arquitetura
client middleware nodes
request
reply
![Page 18: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/18.jpg)
Arquitetura
‣ Servidor de gerência
‣ ActiveMQ, Mcollective Client(s), Mcollective, Mcollective Agent(s)
‣ Servidores que serão orquestrados
‣ Mcollective, Mcollective Agent(s)
![Page 19: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/19.jpg)
Se você quer orquestrar um package, no servidor de gerência é necessário ter o mcollective-package-client instalado, e no node orquestrado é necessário ter o mcollective-package-agent.
![Page 20: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/20.jpg)
Middleware
# yum install activemq
# vim /etc/activemq/activemq.xml
# service activemq start
# tail -f /var/log/activemq/activemq.log
instale apenas no node de gerência
![Page 21: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/21.jpg)
Mcollective
# yum install mcollective
# vim /etc/mcollective/server.cfg
# service mcollective start
# tail -f /var/log/mcollective.log
instale em todos os nodes
![Page 22: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/22.jpg)
Mcollective Client
# yum install mcollective-client
# vim /etc/mcollective/client.cfg
# mco find
# mco ping
instale apenas no node de gerência
![Page 23: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/23.jpg)
Mcollective Agents
‣ mcollective-package-agent
‣ mcollective-service-agent
‣ mcollective-puppet-agent
‣ mcollective-iptables-agent
‣ mcolective-filemgr-agent
‣ mcollective-nettest-agent
instale em todos os nodes
![Page 24: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/24.jpg)
Mcollective Clientsinstale apenas no node de gerência
‣ mcollective-package-client
‣ mcollective-service-client
‣ mcollective-puppet-client
‣ mcollective-iptables-client
‣ mcolective-filemgr-client
‣ mcollective-nettest-client
![Page 25: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/25.jpg)
Data e hora devem estar rigorosamente sincronizadas em todos os nodes para que a orequestração funcione, isto é um dependência do sistema MQ.
![Page 26: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/26.jpg)
Mcollective Agents
![Page 27: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/27.jpg)
mcollective-package-agentInstalando um pacote em todos os nodes
# mco package htop install
Removendo um pacote de todos os nodes
# mco package htop uninstall
Removendo um pacotes e suas configurações de todos os nodes
# mco package htop purge
Atualuzando um pacote em todos os noses
# mco package htop update
Verificando o status de um pacote em todos os nodes
# mco package htop status
![Page 28: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/28.jpg)
mcollective-service-agentIniciando um serviço em todos os nodes
# mco service sshd start
Verificando status de um serviço em todos os nodes
# mco service sshd status
Reinicie um serviço em todos os nodes
# mco service sshd restart
Desligando um serviço em todos os nodes
# mco service sshd stop
![Page 29: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/29.jpg)
mcollective-puppet-agent
Acionando o puppet agent em todos os nodes
# mco puppet runonce
Acionando o puppet agent em splay em todos os nodes
# mco puppet runonce —-splay —splaylimit 120
Acionando o puppet agent em todos os nodes 10 por vez
# mco puppet runall 10
![Page 30: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/30.jpg)
Verificando status dos agentes em todos os nodes
# mco puppet status
Verificando quantos nodes puppet foram encontrados
# mco puppet count
Estatística do puppet de todos os nodes
# mco puppet summary
mcollective-puppet-agent
![Page 31: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/31.jpg)
Ativando agent puppet em todos os nodes
# mco puppet enable
Desativando agente puppet em todos os nodes
# mco puppet disable
# mco puppet disable "mensagem"
mcollective-puppet-agent
![Page 32: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/32.jpg)
É possível utilizar o RAL para manipular estados nos nodes através do mcollective-puppet-agent, mas é preciso habilitar isto.
![Page 33: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/33.jpg)
Você precisa ativar o uso de resourceplugin.puppet.resource_allow_managed_resources = true Você pode especificar quais recursos podem ser manipulados !plugin.puppet.resource_type_whitelist = host,service,user,exec !Você pode especificar quais recursos não podem ser manipulados !plugin.puppet.resource_type_blacklist = exec
/etc/mcollective/server.cfg
mcollective-puppet-agent
![Page 34: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/34.jpg)
Se você especificar whitelist apenas o recursos descritos serão liberados para uso do mcollective. Se você especificar blacklist, apenas os recursos listados estarão bloqueados e o restante estará liberado. !Não é possível especificar os dois ao mesmo tempo.
/etc/mcollective/server.cfg
mcollective-puppet-agent
![Page 35: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/35.jpg)
Criando uma entrada no /etc/hosts em todos os nodes
# mco puppet resource host teste ip=192.168.0.1
Habilitando o serviço sshd no boot em todos os nodes
# mco puppet resource service sshd enable=true
Especificando que o sshd tem que estar rodando em todos os nodes
# mco puppet resource service sshd ensure=running
Especificando que o usuário gutocarvalho deve existir em todos os nodes
# mco puppet user gutocarvalho ensure=present
Rodando o comando uptime em todos os nodes
# mco puppet exec “/usr/bin/uptime”
mcollective-puppet-agent
![Page 36: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/36.jpg)
mcollective-iptables-agent
Bloqueando um IP em todos o nodes# mco iptables block 192.168.100.1
Verificando se o IP está bloqueado# mco iptables isblocked 192.168.100.1
Desbloqueando um endereço IP# mco iptables unblock 192.168.100.1
![Page 37: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/37.jpg)
mcollective-filemgr-agent
Verificando o status do arquivo puppet.conf
# mco rpc filemgr status file=/etc/puppet/puppet.conf
Apagando um arquivo no diretório tmp
# mco rpc filemgr delete file=/tmp/file.txt
Aplicando touch em um arquivo
# mco rpc filemgr touch file=/tmp/outro_arquivo.txt
![Page 38: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/38.jpg)
mcollective-nettest-agent
Verificando se os nodes conseguem pingar 8.8.8.8
# mco nettest ping 8.8.8.8
Verificando se os nodes conseguem se conectar ao host/porta
# mco nettest connect google.com 80
![Page 39: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/39.jpg)
Data plugins
![Page 40: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/40.jpg)
Sysctl data
Pesquisando por todas as máquinas com ip forward ativado
# mco find -S"sysctl('net.ipv4.conf.all.forwarding').value=1"
![Page 41: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/41.jpg)
Facter Facts
Verificando se os nodes são VMs# mco facts is_virtual
Verificando o OS dos nodes# mco facts operatingsystem
Checando o OS do node7# mco facts operatingsystem -I node7
![Page 42: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/42.jpg)
O plugin facter facts é interessante e útil, contudo, ele pode ser instável e lento dependendo do seu setup, prefira o usar o factersource yalm do mcollective.
![Page 43: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/43.jpg)
Use filtros!
![Page 44: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/44.jpg)
Facts filter
-F osfamily=RedHat
--wf osfamily=RedHat
--with-facts osfamily=RedHat
![Page 45: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/45.jpg)
Class filter
-C someclass
--wc someclass
--with-class someclass
![Page 46: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/46.jpg)
Agent filter
-A
--wa package
--with-agent service
![Page 47: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/47.jpg)
Combined classes and facts filter
-W “/class/ fact=value”
![Page 48: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/48.jpg)
Compund filter combining facts and classes
-S “fact and class”
-S “fact and not class”
-S “fact and !class"
-S “fact or class”
-S “fact or not class”
-S “fact or !class"
![Page 49: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/49.jpg)
Complex compund or select queries
mco ping -S \
((customer=governo and domain=local)\
or operatingsystem=Debian) and /apache/"
![Page 50: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/50.jpg)
exemplos de filtrosInstalando pacote telnet para o node1, node2 e node3.
# mco package install telnet -I node1 -I node2 -I node3
Instalando pacote em nodes com 2 CPUs ou mais
# mco package install telnet -F “physicalprocessorcount>=2"
Verificando status de pacote php em nodes com mcollective-service-agent
# mco package status php -A service
![Page 51: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/51.jpg)
Atualizando pacote php em nodes com classe apache declarada
# mco package update openssl -C apache
Removendo pacote htop em nodes com sistema operacional Debian
# mco package uninstall htop -F operatingsystem=Debian
Atualizando pacote em nodes Debian com classse apache declarada para eles
# mco package update openssl -W “/apache/ operatingsystem=Debian"
exemplos de filtros
![Page 52: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/52.jpg)
Enviando ping para nodes com OS debian ou Ubuntu
# mco ping -F “operatingsystem=Debian|Ubuntu
Verificando status do serviço em nodes app* utilizando regex
# mco service status sshd -I "/app[0-9]/"
Verificando status do serviço sshd utilizando fatos
# mco service sshd status -S “domain=local or customer=governo”
exemplos de filtros
![Page 53: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/53.jpg)
Mesmo filtro utilizando E lógico
# mco service sshd status -S “domain=local and customer=governo”
Mesmo filtro E lógico com negação
# mco service sshd status -S “domain=local and not customer=governo”
# mco service sshd status -S “domain=local or !customer=governo”
exemplos de filtros
![Page 54: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/54.jpg)
regex dentro dos filtros
Como usar regex dentro dos filtros?
# mco service status sshd -I “/app[0-9]/“
!
/ / determinam que o conteúdo do filtro é um regex
[0-9] vai casar com app0,app1…app9
![Page 55: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/55.jpg)
Construa seu agente!
![Page 56: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/56.jpg)
RPCRemote Procedure Call
![Page 57: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/57.jpg)
RPC Agent module MCollective
module Agent
class Helloworld<RPC::Agent
# Basic echo server
action "echo" do
validate :msg, String
reply[:msg] = request[:msg]
end
end
end
end
![Page 58: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/58.jpg)
RPC Client #!/usr/bin/ruby
require 'mcollective'
include MCollective::RPC
mc = rpcclient("helloworld")
printrpc mc.echo(:msg => "Welcome to MCollective Simple RPC”)
printrpcstats
mc.disconnect
![Page 59: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/59.jpg)
A orquestração começa aqui, escreva agentes e clientes para solucionar demandas de seu dia-a-dia, orquestre seus deploys e upgrades, assuma o controle de seu parque.
![Page 60: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/60.jpg)
Precisa de ajuda com seu setup?
![Page 61: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/61.jpg)
Comunidade Puppet‣ Documentação oficial docs.puppetlabs.com
‣ Canal #puppet e #mcollective na freenode
‣ Canal #puppet-br na freenode
‣ Comunidade puppet-br.org
‣ Listas no google mcollective-users e puppet-users
‣ Lista no google puppet-users-br.
‣ Blog gutocarvalho.net ;)
![Page 62: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/62.jpg)
Precisa de mais ajuda, algo além da comunidade? Procura suporte
comercial?
![Page 63: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/63.jpg)
Suporte oficial no Brasil
‣ Profissionais especializados em Puppet & Mcollective
‣ Cursos oficiais, Puppet Enterprise, consultoria e implantação
‣ 1o Parceiro oficial Puppetlabs Brasil
‣ 1o empresa com pessoas certificados PCP na América Latina
‣ Único parceiro com múltiplos profissionais certificados
‣ Acesse http://www.instruct.com.br
![Page 64: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/64.jpg)
Obrigado!
![Page 65: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/65.jpg)
Perguntas?
![Page 66: Orquestração com Mcollective](https://reader034.vdocuments.com.br/reader034/viewer/2022051513/547e1bc6b37959932b8b551e/html5/thumbnails/66.jpg)
Contatos
‣ Mande e-mails para [email protected]
‣ Acesse o site/blog/wiki em http://gutocarvalho.net
‣ Acompanhe o twitter @gutocarvalho
‣ Pegue os slides em http://slideshare.com/gutocarvalho
‣ Me procure no canal #puppet-br na freenode