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.
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 :)
Tem também o puupet enterprise, basicamente parece ser uma interface web para genciamento… nesse tutorial vamos tratar apenas da parte CLI :)
Para que exista comunicação, é necessário:
Ai o resto é customizar as configs tanto quanto se queira
Usaremos o ubuntu 12.04 para esta página, porém a mesma teoria pode ser aplicada a outros OS
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 :)
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.
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
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.
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.
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.
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.
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)
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.
Para esse tutorial eu adicionei a seguinte configuração no arquivo hosts (/etc/hosts) dos 3 servidores (1 puppet master e 2 servidores clientes):
127.0.0.1 localhost puppet
169.254.254.131 dhcpdns
169.254.254.133 fileweb
127.0.0.1 localhost dhcpdns
169.254.254.132 puppet
169.254.254.133 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
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:
É 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.
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)
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
}
}
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']
}
}
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
}
}
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
}
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)