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_sourc
              e_configuration_manageme
              nt_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 Aprendizado
           Sintaxe 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 Aprendizado
     Independente 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 log
commit 263b2239ccff746f345c448d723f4ff52d3f8c0f
Author: Daniel Sobral <dcsobral@gmail.com>
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 <dcsobral@gmail.com>
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               define pgclient($ensure = present, $ip =
                         $ipaddress) {
                             @@line { "pgclient ${ip}":
    ●   Classes                  ensure => $ensure,
                                 line    => "${ip}/32n",
    ●   Definições               require => File['clientip'],
                                 tag     => "pgclient_${title}",
●   Templates (ERB)      }
                             }


●   Ruby                 # augeasversion.rb
                         Facter.add("augeasversion") do
    ●   Fatos              setcode do
                            begin
                               require 'augeas'
    ●   Funções                aug = Augeas::open('', '',
                         Augeas::NO_LOAD & Augeas::NO_STDINC)
    ●   Tipos                  aug.get('/augeas/version') || nil
                         #...
    ●   Provedores
Mão na Massa
PUPPET: Funcionamento
●   Tipos:                           ●   Passos:
    ●   Autônomo                         ●   Cliente obtém plugins
        –   Configuração local           ●   Cliente envia fatos
    ●   Cliente/Servidor                 ●   Servidor produz
        –   HTTPS                            catálogo
        –   Certificado de Cliente       ●   Cliente processa
        –   Pull por default                 catálogo
        –   Push opcional                ●   Cliente envia relatório
Conceitos
●   Resource                      user { 'ze':
                                      ensure => present,
    ●   Type                          gid      => 1000,
        –   User, File, Package       require => Group['ze'],
                                  }
    ●   Name
    ●   Attributes
    ●   Meta Attributes
●   Classes
●   Definitions
●   Modules
Experimentando com a linha de
             Comando
●   ralsh

            puppet:~# ralsh user bob
            user { 'bob':
                ensure => 'absent'
            }
            puppet:~# ralsh user bob ensure=present
            notice: /User[bob]/ensure: created
            user { 'bob':
                ensure => 'present'
            }
            puppet:~# ralsh user bob ensure=absent
            notice: /User[bob]/ensure: removed
            user { '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ódigo
class 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/Blog
Http://www.puppetlabs.com
Http://www.puppetlabs.com/blog/

Twitter
@puppetlabs
Http://www.github.com/puppelabs
Google Groups
Puppet-camp,
puppet-users,
puppet-dev
IRC
Irc.freenode.org
#puppet
Contato, Dúvidas, Perguntas
Guto Carvalho                    Daniel Sobral
gutocarvalho@gmail.com           dcsobral@gmail.com
@gutocarvalho                    @dcsobral
http://gutocarvalho.net          http://dcsobral.blogspot.com
http://github.com/gutocarvalho   Http://github.com/dcsobral


          Palestras de hoje disponíveis em nossos sites.


       Palestra sob licença Creative Commons - Atribuição

Consegi 2011: Puppet

  • 1.
    CONSEGI 2011 Assuma ocontrole de suas configurações Palestrantes: Daniel Sobral @dcsobral Guto Carvalho @gutocarvalho
  • 2.
    Já teve asensação de estar perdendo o controle do seu ambiente? Foto tirada do site sysadminday.com por Frank Schicksal
  • 3.
    Você passa horase horas configurando e reconfigurando sistemas de forma repetitiva e cansativa?
  • 4.
    Você gostaria deter 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?
  • 5.
    Já pensou eminvestir na gestão de suas configurações?
  • 6.
    Porque eu meinteressaria 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
  • 7.
    Que tipo deconfiguração? ● Usuários ● Grupos ● Arquivos de configuração ● Pacotes instalados ● Serviços ativos ● Execução periódica de scripts
  • 8.
    Puppet & CIA ● Puppet (2005) ● Ruby, GPL ● AIX, BSD, HP-UX, Linux, MaxOS, Solaris, Windows(*) ● Wikipedia: ● Configuration_management ● Comparison_of_open_sourc e_configuration_manageme nt_software
  • 9.
    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
  • 10.
    Puppet: Fácil Aprendizado Sintaxe 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'], } }
  • 11.
    Puppet: Fácil Aprendizado Independente 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 }
  • 12.
    Puppet: Auto documentado classlinux-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 #... }
  • 13.
    Puppet: Controle deVersão e Rollback #git log commit 263b2239ccff746f345c448d723f4ff52d3f8c0f Author: Daniel Sobral <dcsobral@gmail.com> 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 <dcsobral@gmail.com> 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.
  • 14.
    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', } }
  • 15.
    Puppet: Expansível ● Puppet define pgclient($ensure = present, $ip = $ipaddress) { @@line { "pgclient ${ip}": ● Classes ensure => $ensure, line => "${ip}/32n", ● Definições require => File['clientip'], tag => "pgclient_${title}", ● Templates (ERB) } } ● Ruby # augeasversion.rb Facter.add("augeasversion") do ● Fatos setcode do begin require 'augeas' ● Funções aug = Augeas::open('', '', Augeas::NO_LOAD & Augeas::NO_STDINC) ● Tipos aug.get('/augeas/version') || nil #... ● Provedores
  • 16.
  • 17.
    PUPPET: Funcionamento ● Tipos: ● Passos: ● Autônomo ● Cliente obtém plugins – Configuração local ● Cliente envia fatos ● Cliente/Servidor ● Servidor produz – HTTPS catálogo – Certificado de Cliente ● Cliente processa – Pull por default catálogo – Push opcional ● Cliente envia relatório
  • 18.
    Conceitos ● Resource user { 'ze': ensure => present, ● Type gid => 1000, – User, File, Package require => Group['ze'], } ● Name ● Attributes ● Meta Attributes ● Classes ● Definitions ● Modules
  • 19.
    Experimentando com alinha de Comando ● ralsh puppet:~# ralsh user bob user { 'bob': ensure => 'absent' } puppet:~# ralsh user bob ensure=present notice: /User[bob]/ensure: created user { 'bob': ensure => 'present' } puppet:~# ralsh user bob ensure=absent notice: /User[bob]/ensure: removed user { 'bob': ensure => 'absent' }
  • 20.
    Experimentando com alinha 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
  • 21.
    Puppet Apply # puppetapply locale.pp package { 'locales': ensure => installed, } file { '/etc/default/locale': ensure => present, content => 'LANG=pt_BR.UTF-8', }
  • 22.
    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
  • 23.
    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, } }
  • 24.
    Exemplo Ntpdate ● Pacote ntpdate ● Garantir que esteja instalado ● Crontab ● Usuário root ● Comando 'ntpdate ntp.dominio' ● Executar de hora em hora
  • 25.
    Exemplo Ntpdate -comandos class ntpdate { package { 'ntpdate': ensure => installed, } cron { 'sincroniza horario': user => 'root', command => '/usr/sbin/ntpdate ntp.dominio', minute => 0, } }
  • 26.
    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
  • 27.
    Exemplo Locales -Código class 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'] ], } }
  • 28.
    Exemplo Configuração Padrão ● Aplicar sudoers ● Aplicar ntpdate ● Aplicar locale ● Todos os nós! ● Aplicar configuração padrão
  • 29.
    Exemplo Configuração Padrão- Código class padrao { include sudoers include ntpdate include locale } node default { include padrao }
  • 30.
    O que façocom 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?
  • 31.
    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.
  • 32.
    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
  • 33.
    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
  • 34.
    Conclusão OPuppet é uma ferramenta essencial para gerenciar e distribuir configurações, ele é um batalhão de devops trabalhando para você, sua equipe e sua empresa.
  • 35.
  • 36.
    Contato, Dúvidas, Perguntas GutoCarvalho Daniel Sobral gutocarvalho@gmail.com dcsobral@gmail.com @gutocarvalho @dcsobral http://gutocarvalho.net http://dcsobral.blogspot.com http://github.com/gutocarvalho Http://github.com/dcsobral Palestras de hoje disponíveis em nossos sites. Palestra sob licença Creative Commons - Atribuição