Download - Consegi 2011: Puppet
CONSEGI 2011
Assuma o controle de suas configurações
Palestrantes:Daniel Sobral @dcsobral
Guto Carvalho @gutocarvalho
Já teve a sensação de estar perdendo o controle do seu
ambiente?
Foto tirada do site sysadminday.com por Frank Schicksal
Você passa horas e horas configurando e reconfigurando sistemas de forma repetitiva e
cansativa?
Você gostaria de ter um ambiente padronizado e de fácil implementação de mudanças e configurações?
Você sabe que o seu ambiente vai crescer e se preocupa em como mantê-lo?
Já pensou em investir na gestão de suas configurações?
Porque eu me interessaria por isto?
● Facilitar o trabalho de administração de servidores
● Padronizar as configurações utilizadas● Possibilitar auditoria de configuração● Centralizar a administração● Acelerar a criação de novos servidores● Acelerar a configuração de serviços
Que tipo de configuração?
● Usuários● Grupos● Arquivos de configuração● Pacotes instalados● Serviços ativos● Execução periódica de scripts
Puppet & CIA
● Puppet (2005)● Ruby, GPL● AIX, BSD, HP-UX,
Linux, MaxOS, Solaris, Windows(*)
● Wikipedia:● Configuration_management
● Comparison_of_open_source_configuration_management_software
Onde estamos usando?
EBC - Empresa Brasil de Comunicação
●Cerca de 160 máquinas virtuais e físicas sendo gerenciadas pelo Puppet.
●Administração compartilhada de 4 devops
Puppet: Fácil AprendizadoSintaxe Declarativa
class rsyslog {
package { 'rsyslog': ensure => present, } service { 'rsyslog': hasrestart => true, } file { '/etc/rsyslog.d/logserver01.conf': ensure => present, source => 'puppet:///files/rsyslog/rsyslog.d/logserver01.conf', notify => Service['rsyslog'], } }
Puppet: Fácil AprendizadoIndependente de Plataforma
class editor { $vim = $operatingsystem ? { 'RedHat' => 'vim-enhanced', 'CentOS' => 'vim-enhanced', 'Fedora' => 'vim-enhanced', default => 'vim', } package { "$vim": ensure => present, alias => 'vim', # provider => yum, apt, ports? } }node “host01.domain.com.br” { include editor}node “host02.domain.com.br” { include editor}
Puppet: Auto documentado
class linux-server { # Include classes common to all linux servers include localmta include ntpdate include puppet::conf include ssh::server include sudoers include users include utils include zabbix-agent include editor include snmpd include rsyslog
#...}
Puppet: Controle de Versão e Rollback
#git logcommit 263b2239ccff746f345c448d723f4ff52d3f8c0f Author: Daniel Sobral <[email protected]> Date: Thu Mar 31 22:11:16 2011 -0300
Exclui a boletins das máquinas configuradas como mta satélite. Limita a configuração do exim4 às máquinas Ubuntu e Debian.
commit 8fbed5a4b8095b7560941c598454d47f3b3dec7e Author: Daniel Sobral <[email protected]> Date: Thu Mar 31 22:08:22 2011 -0300
Classe debian-common adaptada para lidar com Ubuntu. Basicamente, força lidar com serviços no padrão Debian (Ubuntu suporta padrão FreeBSD também), e não mexe no source list (por hora). Sistemas Ubuntu também incluirão a classe debian-server. Verifica se o kernel é xen, e, se for, inclui o linux modules correspondente.
Puppet: Altamente Flexível
node "eleicoesconcurvm01" { include linux-server jboss::app { 'conselho': conf => 'default', pgdb => 'conselhoprod', # Altera pg_hba.conf } }
node “eleicoesconcurvmbd01” { include linux-server pgdb { 'conselhoprod': # Gera XML para datasource password => '********', pgversion => '8.4', } }
Puppet: Expansível
● Puppet● Classes● Definições
● Templates (ERB)● Ruby
● Fatos● Funções● Tipos● Provedores
define pgclient($ensure = present, $ip =$ipaddress) { @@line { "pgclient ${ip}": ensure => $ensure, line => "${ip}/32\n", require => File['clientip'], tag => "pgclient_${title}", } }
# augeasversion.rb Facter.add("augeasversion") do setcode do begin require 'augeas' aug = Augeas::open('', '', Augeas::NO_LOAD & Augeas::NO_STDINC) aug.get('/augeas/version') || nil #...
Mão na Massa
PUPPET: Funcionamento
● Tipos:● Autônomo
– Configuração local● Cliente/Servidor
– HTTPS– Certificado de Cliente– Pull por default– Push opcional
● Passos:● Cliente obtém plugins● Cliente envia fatos● Servidor produz
catálogo● Cliente processa
catálogo● Cliente envia relatório
Conceitos
● Resource● Type
– User, File, Package● Name● Attributes● Meta Attributes
● Classes● Definitions● Modules
user { 'ze': ensure => present, gid => 1000, require => Group['ze'],}
Experimentando com a linha de Comando
● ralsh
puppet:~# ralsh user bobuser { 'bob': ensure => 'absent'}puppet:~# ralsh user bob ensure=presentnotice: /User[bob]/ensure: createduser { 'bob': ensure => 'present'}puppet:~# ralsh user bob ensure=absentnotice: /User[bob]/ensure: removeduser { 'bob': ensure => 'absent'}
Experimentando com a linha de Comando
● puppet describe
dcs@puppet:~/exemplo$ puppet describe package -s
package=======descrição e funcionamento
Parameters---------- adminfile, allowcdrom, category, configfiles, description, ensure, flavor, instance, name, platform, responsefile, root, source, status, type, vendor
Providers--------- aix, appdmg, apple, apt, aptitude, aptrpm, blastwave, darwinport, dpkg, fink, freebsd, gem, hpux, nim, openbsd, pkg, pkgdmg, portage, ports, portupgrade, rpm, rug, sun, sunfreeware, up2date, urpmi, yum, zypper
Puppet Apply
# puppet apply locale.pp
package { 'locales': ensure => installed,}
file { '/etc/default/locale': ensure => present, content => 'LANG=pt_BR.UTF-8',}
Exemplo Sudoers
● Pacote sudoers● Garantir que esteja instalado
● Arquivo /etc/sudoers● Conteúdo comum a todas as máquinas● Requer pacote sudoers● Usuário root● Grupo root● Permissão 440
Exemplo Sudoers - Código
class sudoers { package { 'sudoers': ensure => installed, }
file { '/etc/sudoers': source => 'puppet:///files/sudo/sudoers', require => Package['sudoers'], owner => 'root', group => 'root', mode => 440, }}
Exemplo Ntpdate
● Pacote ntpdate● Garantir que esteja instalado
● Crontab● Usuário root● Comando 'ntpdate ntp.dominio'● Executar de hora em hora
Exemplo Ntpdate - comandos
class ntpdate { package { 'ntpdate': ensure => installed, }
cron { 'sincroniza horario': user => 'root', command => '/usr/sbin/ntpdate ntp.dominio', minute => 0, }}
Exemplo Locales
● Pacote locales - instalado● Arquivo /etc/default/locale - conteúdo● Arquivo /etc/locale.gen - conteúdo● Executar /usr/sbin/locale.gen
● Sempre que locale.gen for alterado● Só quando houver alteração● Requer pacote locales e arquivo locale.gen
Exemplo Locales - Códigoclass locale { package { 'locales': ensure => installed, } file { '/etc/default/locale': ensure => present, content => 'LANG=pt_BR.UTF-8', require => Package['locales'], } file { '/etc/locale.gen': ensure => present, source => '/root/exemplo/locale.gen', require => Package['locales'], } exec { '/usr/sbin/locale-gen': subscribe => File['/etc/locale.gen'], refreshonly => true, require => [ Package['locales'], File['/etc/locale.gen'] ], }}
Exemplo Configuração Padrão
● Aplicar sudoers● Aplicar ntpdate● Aplicar locale
● Todos os nós!● Aplicar configuração padrão
Exemplo Configuração Padrão - Código
class padrao { include sudoers include ntpdate include locale}
node default { include padrao}
O que faço com tudo isso?
Afinal, onde toda essa flexibilidade e agilidade pode nos levar?
Quais são os ganhos para uma equipe devops e para o cliente?
Situação Anterior
Máquina Física – Debian Lenny
● Tempo de criação de maquina física – 40 minutos (CD)
● Tempo de configuração/update OS* - 40 minutos
● Tempo de instalação e configuração Apache2, PHP5, MYSQL – 2 a 4 horas**
* Levando em conta configurações da rede, locale, ntpdate, backup, monitoração, criação de usuários, instalação de pacotes básicos do sysadmin.
** Levando em conta hardening do os, tuning do os, configuração e tuning do apache2, php5 e mysql5.
Situação Atual
Máquina Virtual (GANETI+XEN) – Debian Lenny
● Tempo de criação de maquina virtual - 2 minutos
● Tempo de configuração/update OS* usando Hooks Ganeti – 2 a 4 minutos
● Tempo de instalação e configuração Apache2, PHP5, MYSQL – 2 a 4 minutos**
●
* Levando em conta configurações da rede, locale, ntpdate, backup, monitoração, criação de usuários, instalação de pacotes básicos do sysadmin.
** Levando em conta hardening, tuning os, apache2, php5, mysql, considerando ter as classes prontas
Puppet: Problemas
● Mensagens de erro ruins● Servidor default nao segura mais de 20
máquinas● Com Apache/Passenger, já temos +160 servidores
● Não distribui arquivos grandes● Usar pacotes ou execução de comandos como
wget
● Grande investimento de tempo para ir do nível médio ao de expert
Conclusão
O Puppet é uma ferramenta essencial para gerenciar e distribuir configurações, ele é um
batalhão de devops trabalhando para você, sua equipe e sua empresa.
Informações do projeto
Site/BlogHttp://www.puppetlabs.comHttp://www.puppetlabs.com/blog/
Twitter@puppetlabs
Http://www.github.com/puppelabs
Google GroupsPuppet-camp, puppet-users, puppet-dev
IRCIrc.freenode.org #puppet
Contato, Dúvidas, Perguntas
Guto [email protected]
@gutocarvalho
http://gutocarvalho.net
http://github.com/gutocarvalho
Daniel [email protected]
@dcsobral
http://dcsobral.blogspot.com
Http://github.com/dcsobral
Palestras de hoje disponíveis em nossos sites.
Palestra sob licença Creative Commons - Atribuição