PuppetMaster


Puppet, nesse página, é considerado como o programa que irá gerenciar pacotes de instalações de outros servers. Basicamente você configura algumas coisas nele e o mesmo irá instalar programas em servidores, assim como, se configurado, manter arquivos de configuração - qualquer tipo de arquivo e garantir o status de cada serviço.

Requerimentos

PuppetMaster (server) irá rodar em um servidor (Windows ou Linux), para instalar tem que fazer basico:

apt-get install puppetmaster

ou

yum install puppetmaster

Ou qualquer outra coisa, para o Windows é download e duplo click :)

http://puppetlabs.com/

Tem também o puupet enterprise, basicamente parece ser uma interface web para genciamento… nesse tutorial vamos tratar apenas da parte CLI :)

Para funcionar

Para que exista comunicação, é necessário:

  • Pelo menos 2 servidores, onde 1 rodará o puppetmaster e o outro o puppet (ou puppetclient)
  • Adicionar a lista de clientes no puppetmaster para que o mesmo aceite comunicação deles (pode ser na mão ou quase automática)
  • Configurar o puppet com arquivos .pp para cada / todos / grupo de clientes
  • Fazer o cliente sincronizar com o puppet

Ai o resto é customizar as configs tanto quanto se queira

Instalando

Usaremos o ubuntu 12.04 para esta página, porém a mesma teoria pode ser aplicada a outros OS

Master / Server

Após instalar, os seguintes arquivos devem aparecer

root@puppet:~# ls /etc/puppet/
auth.conf              etckeeper-commit-pre  manifests  puppet.conf
etckeeper-commit-post  fileserver.conf       modules    templates

Os arquivos da que vamos mexer vão ficar dentro da pasta manifest, não se preocupe quando for olhar o que dentro dela e ela ficar fazia, é o padrão mesmo, temos que fazer tudo / quase tudo do 0 :)

Cliente

Após instalar os seguintes arquivos devem aparecer

user@clx2:~# ls /etc/puppet/
etckeeper-commit-p     etckeeper-commit-pre  modules      templates
etckeeper-commit-post  manifests             puppet.conf

Bom como no cliente vamos apenas fazer algumas configurações para que esse fale com o puppet, vamos retomar ele mais para frente.

Estutura

Dentro do manifests ficam os arquivos de configuração do puppet, é crucial que exista pelo menos 1 arquivo chamado site.pp, pois esse será o primeiro arquivo a ser carregado / executado.

Aqui vamos usar a seguinte extrutura:

site.pp
||||-> nodes.pp
|||--> arquivos.pp
||---> users.pp
|----> programas.pp
  • nodes.pp (onde vamos por nossos clientes e o que vamos rodar em cada um)
  • arquivos.pp (onde vamos por os arquivos de configuração)
  • users.pp (onde vao ficar os users q vamos querer criar por padrão
  • programas.pp (onde vamos configurar os programas que ser"ao instalados)

Basicamente o site.pp vai incluir os nossos outros 4 arquivos, porém isso pode ser tudo feito dentro no site.pp, porém resolvi fazer dessa maneira para organizar e facilitar a manutenção.

Tirando o arquivo nodes.pp & site.pp, todos os outros serão preenchidos por classes:

class ntp {
      case $operatingsystem {
        centos, redhat: {
          $service_name = 'ntpd'
          $conf_file    = 'ntp.conf.el'
        }
        debian, ubuntu: {
          $service_name = 'ntp'
          $conf_file    = 'ntp.conf.debian'
        }
      }

      package { 'ntp':
        ensure => installed,
      }
      file { 'ntp.conf':
        path    => '/etc/ntp.conf',
        ensure  => file,
        require => Package['ntp'],
        source  => "/root/examples/answers/${conf_file}"
      }
      service { 'ntp':
        name      => $service_name,
        ensure    => running,
        enable    => true,
        subscribe => File['ntp.conf'],
      }
    }

Repare que essa classe, hardcore, faz tudo em um arquivo só, por esse motivo, para facilitar o entendimento e manutenção iremos usar arquivos separados. Lembrando que, muitas vezes é recomendável fazer um arquivo por aplicação.

Plano de Ação

Para quase tudo na vida é bom ter um plano do que se quer fazer, para o Puppet teremos o seguinte:

* 1 Ubuntu 12.04 (server) como puppet master 
* 2 Servidor Ubuntu 12.04 (cliente)

Soa estranho dizer que o server está agindo como cliente, mas pensei que é do mesmo jeito que funciona uma monitoração, 1 servidor age como cliente e outros servers agem como clientes.

Objetivo

O objetivo dessa página é configurar o puppet, de maneira simples, para garantir que certos programas estejam rodando nos servers (ou instalados) e até mesmo alguns arquivos de configuração (ou não), sendo assim garantindo um backup centralizado e uma rápida manutenção / troca de dispositivos - quando necessário.

Nomes

Para manipular o server que roda o puppet master, o mesmo será escrito pelo seu hostname: puppet

De maneira análoga, os outros servidores “clientes” serão escritos por: dhcpdns, fileweb respectivamente.

Tabelas de Endereçamento

Que programas vão rodar onde?

Segue abaixo uma tabela para indicar o que vai rodar em cada server, para facilitar assim o que vamos ter que configurar no puppet, lembrando que toda a instalação deve ser feita no puppet, os servidores clientes só irão entrar em cena para rodar 1 único comando (ou 2)

Configurando o PuppetMaster

Bora bora configurar o nosso puppet, o nome dele ser esse não é por acaso, por default os clientes puppet vão tentar chegar no hostname puppet, portanto por isso coloquei esse nome.

Arquivo hosts

Para esse tutorial eu adicionei a seguinte configuração no arquivo hosts (/etc/hosts) dos 3 servidores (1 puppet master e 2 servidores clientes):

  • puppet
127.0.0.1       localhost   puppet
169.254.254.131 dhcpdns
169.254.254.133 fileweb
  • dhcpdns
127.0.0.1       localhost   dhcpdns
169.254.254.132 puppet
169.254.254.133 fileweb
  • fileweb
127.0.0.1       localhost   fileweb
169.254.254.131 dhcpdns
169.254.254.132 puppet

Se você não faz ideia por que eu fiz isso, leia aqui arquivo hosts, o mesmo existe pra windows tb, mas fica em %systemroot%/windows/system32/drivers/etc/hosts e tem a mesma finalidade

Criando os arquivos

A partir de agora vamos configurar apenas o puppet, portando eu vou estar usando ele via CLI (ssh), o que implica que estarei usando algum editor de texto CLI, eu gosto muito do VIM (tem que instalar pq n vem junto por padrão), porém você pode usar o que quiser, como o vi, nano, etc.

Como medidas de padrão, vamos fazer assim:

  • ins_NomeQualquer -> referente a Programas
  • usr_NomeQualquer -> referente a Usuários
  • arq_NomeQualquer -> referente a Arquivos

É que, basicamente vão existir um monte de classes nos arquivos (lembra que eu falei que dava pra por tudo de uma vez?), isso é só para ajudar na nomenclatura por que estamos seguimento em vários arquivos.

site.pp

Como dito anteriormente, o site.pp vai apenas incluir os outros arquivos, portanto ele terá essa cara:

root@puppet:/etc/puppet/manifests# cat site.pp 
import "nodes.pp"
import "arquivos.pp"
import "users.pp"
import "programas.pp"

ps. a ordem dos infratores não altera a multa (não importa a ordem do seu include)

programas.pp

Talvez eu jogue isso num arquivo…

class ins_apache2 {
    package { "apache2":
        ensure => installed
    }

    service { "apache2":
        enable => true,
        ensure => running
    }
}

class ins_samba {
    package { "samba":
        ensure => installed
    }
    
    service {"samba":
        enable => true,
        ensure => running
    }
}

class ins_bind9 {
    package { "bind9":
        ensure => installed
    }
    
    servicee { "bind9":
        enable => true,
        ensure => running
    }

}

class ins_dhcp {
    package { "isc-server-dhcp":
        ensure => installed
    }
    
    service { "isc-server-dhcp":
        enable => true,
        ensure => running
    }
}

class ins_mysql{
    package { "mysql-server":
        ensure => installed
    }

    service { "mysql":
        enable => true,
        ensure => running
    }
}

users.pp

Usuário para usarmos com o samba

class usr_publico {

    user { "publico":
                ensure => "present",
                home => "/home/publico",
                name => "publico",
                shell => "/bin/bash",
                managehome => true,
                groups => 'publico',
                require => Group['publico']
        }
    
}

arquivos.pp

Antes de falar para o puppet copiar arquivos, não se esqueca de descomentar uma linha do arquivo /etc/puppet/fileserver.conf em [files]. para permitir que a qualquer servidor da rede possa pegar arquivos do puppet, quando configurado e mude a pasta de arquivos raiz do puppet se necessário

root@puppet:/etc/puppet# cat fileserver.conf 
# This file consists of arbitrarily named sections/modules
# defining where files are served from and to whom

# Define a section 'files'
# Adapt the allow/deny settings to your needs. Order
# for allow/deny does not matter, allow always takes precedence
# over deny
[files]
  path /etc/puppet/files #pasta raiz
#  allow *.example.com
#  deny *.evil.example.com
  allow 169.254.254.0/24 #permitindo a rede local

[plugins]
#  allow *.example.com
#  deny *.evil.example.com
#  allow 192.168.0.0/24

Criando algumas pastas e enviando alguns arquivos para sites (para o apache)

class arq_samba{
    file{ "/home/samba":
        ensure => "directory",
        owner => "root",
        group => "root"
    }
    
    file { "/home/samba/publico":
        ensure => "directory",
        owner => "publico",
        group => "publico",
        mode => 775
    }
    
}

nodes.pp

Finalmente, a ultima parte da config, configurando os nodes e o que cada um vai receber, aqui todo o esforço valerá a pena

node "dhcpdns"{
    include ins_bind9
    include ins_dhcp
    
}

node "fileweb"{
    include ins_samba
    include ins_apache2
    include arq_samba
    include usr_publico
    include ins_mysql
}

Configurando os clientes

Vamos verificar se temos conectividade a o nosso primeiro server

root@puppet:/etc/puppet/manifests# ping dhcpdns 
PING dhcpdns (169.254.254.131) 56(84) bytes of data.
64 bytes from dhcpdns (169.254.254.131): icmp_req=1 ttl=64 time=0.465 ms
64 bytes from dhcpdns (169.254.254.131): icmp_req=2 ttl=64 time=0.455 ms
64 bytes from dhcpdns (169.254.254.131): icmp_req=3 ttl=64 time=0.424 ms

-- preciso criar o outro ainda :P ---

Configurar o cliente (considerando que já foi instalado o puppet (puppetclient) nele)