Académique Documents
Professionnel Documents
Culture Documents
https://github.com/puppet-br/apostila-puppet
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
2
Sumrio
1 Licena de uso desta obra
2 Sobre a Instruct
2.1 Sobre a Apostila
3 Introduo ao Gerenciamento de Configurao
5
10
10
11
11
11
13
4 O que o Puppet
4.1 Como o Puppet funciona?
5 Instalao
14
14
16
16
17
19
19
24
7 Manifests
26
26
29
8 Ordenao
31
31
34
37
9.1 Variveis
37
9.2 Fatos
37
9.3 Condicionais
40
42
10 Laboratrio
44
11 Master / Agent
45
45
46
46
12 Nodes
52
52
12.2 Nomes
52
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
3
53
12.4 Prtica
53
54
58
60
61
14 Classes e Mdulos
62
14.1 Classes
62
14.2 Mdulos
64
64
66
15 Puppet Forge
67
67
68
16 Templates
70
71
73
17 Environments
17.1 Prtica: configurando environments
18 Hiera
74
74
76
76
76
79
79
19 Augeas
83
83
85
20 Puppet no Windows
87
87
91
93
95
22 Histrico de mudanas
98
22.1 Colaboradores
98
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
4
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
5
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
6
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
7
quaisquer medidas tecnolgicas eficazes sobre a Obra Derivada que restrinjam a habilidade de
uma pessoa que receba a Obra Derivada de Voc em exercer os direitos a ela garantidos sob
os termos da Licena Aplicvel. Esta Seo 4(b) se aplica Obra Derivada enquanto
incorporada a uma Obra Coletiva, mas no exige que a Obra Coletiva, parte da prpria Obra
Derivada, esteja sujeita aos termos da Licena Aplicvel.
c. Se Voc Distribuir ou Executar Publicamente a Obra ou qualquer Obra Derivada ou Obra
Coletiva, Voc deve, a menos que um pedido relacionado Seo 4(a) tenha sido feito, manter
intactas todas as informaes relativas a direitos autorais sobre a Obra e exibir, de forma
razovel em relao ao meio ou mdia por Voc utilizado: (i) o nome do Autor Original (ou seu
pseudnimo, se for o caso), se fornecido, do Titular de Direitos Conexos, se fornecido e quando
aplicvel, e/ou, ainda, se o Autor Original/Titular de Direitos Conexos e/ou o Licenciante
designar outra parte ou partes (p. ex.: um instituto patrocinador, editora, peridico) para
atribuio (Partes de Atribuio) nas informaes relativas aos direitos autorais do
Licenciante, termos de servio ou por outros meios razoveis, o nome dessa parte ou partes; (ii)
o ttulo da Obra, se fornecido; (iii) na medida do razovel, o Identificador Uniformizado de
Recursos (URI) que o Licenciante especificar para estar associado Obra, se houver, exceto
se o URI no se referir ao aviso de direitos autorais ou informao sobre o regime de
licenciamento da Obra; e, (iv) em conformidade com a Seo 3(b), no caso de Obra Derivada,
crdito identificando o uso da Obra na Obra Derivada (p. ex.: "Traduo Francesa da Obra do
Autor Original/Titular de Direitos Conexos", ou "Roteiro baseado na Obra original do Autor
Original/Titular de Direitos Conexos"). O crdito exigido por esta Seo 4(c), pode ser
implementado de qualquer forma razovel; desde que, entretanto, no caso de uma Obra
Derivada ou Obra Coletiva, na indicao de crdito feita aos autores participantes da Obra
Derivada ou Obra Coletiva, o crdito aparea como parte dessa indicao, e de modo ao
menos to proeminente quanto os crditos para os outros autores participantes. De modo a
evitar dvidas, Voc apenas poder fazer uso do crdito exigido por esta Seo para o
propsito de atribuio na forma estabelecida acima e, ao exercer Seus direitos sob esta
Licena, Voc no poder implcita ou explicitamente afirmar ou sugerir qualquer vnculo,
patrocnio ou apoio do Autor Original, Titular de Direitos Conexos, Licenciante e/ou Partes de
Atribuio, o que for cabvel, por Voc ou Seu uso da Obra, sem a prvia e expressa
autorizao do Autor Original, Titular de Direitos Conexos, Licenciante e/ou Partes de
Atribuio.
d. Na extenso em que reconhecidos e considerados indisponveis pela legislao aplicvel,
direitos morais no so afetados por esta Licena.
5. Declaraes, garantias e exonerao
EXCETO QUANDO FOR DE OUTRA FORMA MUTUAMENTE ACORDADO PELAS PARTES POR
ESCRITO, O LICENCIANTE OFERECE A OBRA NO ESTADO EM QUE SE ENCONTRA (AS IS) E
NO PRESTA QUAISQUER GARANTIAS OU DECLARAES DE QUALQUER ESPCIE RELATIVAS
OBRA, SEJAM ELAS EXPRESSAS OU IMPLCITAS, DECORRENTES DA LEI OU QUAISQUER
OUTRAS, INCLUINDO, SEM LIMITAO, QUAISQUER GARANTIAS SOBRE A TITULARIDADE DA
OBRA, ADEQUAO PARA QUAISQUER PROPSITOS, NO-VIOLAO DE DIREITOS, OU
INEXISTNCIA DE QUAISQUER DEFEITOS LATENTES, ACURACIDADE, PRESENA OU AUSNCIA
DE ERROS, SEJAM ELES APARENTES OU OCULTOS. EM JURISDIES QUE NO ACEITEM A
EXCLUSO DE GARANTIAS IMPLCITAS, ESTAS EXCLUSES PODEM NO SE APLICAR A VOC.
6. Limitao de responsabilidade.
EXCETO NA EXTENSO EXIGIDA PELA LEI APLICVEL, EM NENHUMA CIRCUNSTNCIA O
LICENCIANTE SER RESPONSVEL PARA COM VOC POR QUAISQUER DANOS, ESPECIAIS,
INCIDENTAIS, CONSEQENCIAIS, PUNITIVOS OU EXEMPLARES, ORIUNDOS DESTA LICENA OU
DO USO DA OBRA, MESMO QUE O LICENCIANTE TENHA SIDO AVISADO SOBRE A
POSSIBILIDADE DE TAIS DANOS.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
8
7. Terminao
a. Esta Licena e os direitos aqui concedidos terminaro automaticamente no caso de qualquer
violao dos termos desta Licena por Voc. Pessoas fsicas ou jurdicas que tenham recebido
Obras Derivadas ou Obras Coletivas de Voc sob esta Licena, entretanto, no tero suas
licenas terminadas desde que tais pessoas fsicas ou jurdicas permaneam em total
cumprimento com essas licenas. As Sees 1, 2, 5, 6, 7 e 8 subsistiro a qualquer terminao
desta Licena.
b. Sujeito aos termos e condies dispostos acima, a licena aqui concedida perptua (pela
durao do direito autoral aplicvel Obra). No obstante o disposto acima, o Licenciante
reserva-se o direito de difundir a Obra sob termos diferentes de licena ou de cessar a
distribuio da Obra a qualquer momento; desde que, no entanto, quaisquer destas aes no
sirvam como meio de retratao desta Licena (ou de qualquer outra licena que tenha sido
concedida sob os termos desta Licena, ou que deva ser concedida sob os termos desta
Licena) e esta Licena continuar vlida e eficaz a no ser que seja terminada de acordo com
o disposto acima.
8. Outras disposies
a. Cada vez que Voc Distribuir ou Executar Publicamente a Obra ou uma Obra Coletiva, o
Licenciante oferece ao destinatrio uma licena da Obra nos mesmos termos e condies que a
licena concedida a Voc sob esta Licena.
b. Cada vez que Voc Distribuir ou Executar Publicamente uma Obra Derivada, o Licenciante
oferece ao destinatrio uma licena Obra original nos mesmos termos e condies que foram
concedidos a Voc sob esta Licena.
c. Se qualquer disposio desta Licena for tida como invlida ou no-executvel sob a lei
aplicvel, isto no afetar a validade ou a possibilidade de execuo do restante dos termos
desta Licena e, sem a necessidade de qualquer ao adicional das partes deste acordo, tal
disposio ser reformada na mnima extenso necessria para tal disposio tornar-se vlida
e executvel.
d. Nenhum termo ou disposio desta Licena ser considerado renunciado e nenhuma violao
ser considerada consentida, a no ser que tal renncia ou consentimento seja feito por escrito
e assinado pela parte que ser afetada por tal renncia ou consentimento.
e. Esta Licena representa o acordo integral entre as partes com respeito Obra aqui licenciada.
No h entendimentos, acordos ou declaraes relativas Obra que no estejam especificados
aqui. O Licenciante no ser obrigado por nenhuma disposio adicional que possa aparecer
em quaisquer comunicaes provenientes de Voc. Esta Licena no pode ser modificada sem
o mtuo acordo, por escrito, entre o Licenciante e Voc.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
9
2 Sobre a Instruct
A Instruct a autoridade em automao e Puppet no Brasil e somos parceiros e representantes oficiais
da Puppet Labs no Brasil para suporte, licenciamento, treinamento e consultoria. A empresa tem como
especialidade solues na rea de automao de infraestrutura e gerenciamento de configurao e
possui equipe capacitada e certificada.
Possumos os profissionais mais experientes do mercado, como Miguel Di Ciurcio Filho e Jos Augusto
(Guto) Carvalho, primeiros certificados Puppet Certified Professional (PCP) pela Puppet Labs na Amrica
Latina e tambm os nicos Puppet Certified Instructor.
Saiba mais sobre Puppet e a Instruct com o contedo do nosso canal no YouTube e nas redes socias:
https://youtube.com/instructbr
https://twitter.com/InstructBR
https://facebook.com/InstructBR
Caso esteja procurando servios profissionais relacionados a automao e Puppet, entre em contato
conosco:
Email: contato@instruct.com.br
Escritrio em Campinas/SP: Rua Joaquim Pinto de Moraes, 247, Sala 11. Telefone: 19 2511-6506
Estritrio em Braslia/DF: SRCS 502, Bl. C, Lj. 27, Asa Sul. Telefone: 61 3246-9299
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
10
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
11
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
12
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
13
4 O que o Puppet
Puppet uma ferramenta e plataforma Open Source para automao e gerenciamento de configurao
de servidores e infraestrutura. Foi desenvolvido para ajudar a comunidade SysAdmin na construo e
compartilhamento de ferramentas maduras e que evitem a duplicao de esforos na soluo de
problemas repetidos. O Puppet distribudo sob a Licena Apache 2.0.
Possui grande biblioteca com funcionalidades prontas para uso, fornecendo uma plataforma
poderosa para simplificar as tarefas executadas por SysAdmins.
composto de uma linguagem de configurao declarativa utilizada para expressar a configurao
do sistema. O trabalho do SysAdmin escrito como cdigo na linguagem do Puppet, que
compartilhvel tal como qualquer outro cdigo e possvel escrever avanados aplicativos de
automao de maneira simples, com apenas algumas linhas de cdigo.
Utiliza uma arquitetura cliente/servidor para a distribuio da configurao para clientes, que
possuem um agente que sempre valida e corrige quaisquer problemas encontrados.
Extensvel via mdulos e plugins, permite adicionar funcionalidades sob demanda e compartilhar
suas solues com outros SysAdmins, tornando seu trabalho mais gil.
Tradicionalmente, a gesto das configuraes de um grande conjunto de computadores feita de
prticas imperativas e comandos sequenciais, ou seja, simplesmente executando comandos via SSH em
um loop. Essa abordagem simples de executar comandos sequencialmente melhorou ao longo do tempo,
mas ainda carrega fundamentais limitaes, como vistas no captulo anterior.
O Puppet tem uma abordagem diferente: cada sistema recebe um catlogo de resources (recursos) e
relacionamentos, compara com o estado atual do sistema e faz as alteraes necessrias para colocar o
sistema em conformidade com o catlogo.
Os benefcios dessa metodologia vo alm de apenas resolver questes de divergncia de configurao
de mquinas: modelar sistemas como dados permite ao Puppet:
Simular mudanas de configurao.
Acompanhar o histrico de um sistema atravs de seu ciclo de vida.
Provar que um cdigo refatorado ainda produz o mesmo estado do sistema.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
14
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
15
5 Instalao
Diversas distribuies empacotam o Puppet, mas as verses empacotadas e a qualidade desses pacotes
variam muito, portanto a melhor maneira de instal-lo utilizando os pacotes oficiais da PuppetLabs. Os
pacotes oficiais so extensivamente testatos e extremamente confiveis.
Existem duas verses do Puppet distribudas pela PuppetLabs: Puppet Open Source e o Puppet
Enterprise. O Puppet Enterprise distribudo gratuitamente para o gerenciamento de at 10 nodes,
possui suporte oficial e vem acompanhado de uma verstil interface web para administrao.
Para uma comparao mais detalhada sobre as diferenas entre a verso Open Source e a Enterprise,
visite as pginas abaixo:
https://puppet.com/product/puppet-enterprise-and-open-source-puppet
https://puppet.com/product/faq
Aviso
Instalao a partir do cdigo fonte
O Puppet um projeto grande e complexo que possui muitas dependncias, e instal-lo a partir
do cdigo fonte no recomendado. A prpria Puppet Labs no recomenda a instalao a partir
do cdigo fonte. muito mais confivel e conveniente utilizar pacotes j homologados e testados.
Dica
Turbinando o Vim
Utilize os plugins disponveis em https://github.com/rodjek/vim-puppet para facilitar a edio de
cdigo no Vim.
cd /tmp
wget http://apt.puppetlabs.com/puppetlabs-release-pc1-jessie.deb
dpkg -i puppetlabs-release-pc1-jessie.deb
apt-get update
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
16
cd /tmp
wget http://apt.puppetlabs.com/puppetlabs-release-pc1-trusty.deb
dpkg -i puppetlabs-release-pc1-trusty.deb
apt-get update
cd /tmp
wget http://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb
dpkg -i puppetlabs-release-pc1-xenial.deb
apt-get update
Voc tambm pode acessar a pgina http://apt.puppetlabs.com e localizar o pacote adequado para
outras verses do Debian ou Ubuntu.
2. Instale o pacote puppet-agent:
# apt-get -y install puppet-agent
CentOS/Red Hat 7
# yum install -y http://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
Voc tambm pode acessar a pgina http://yum.puppetlabs.com e localizar o pacote adequado de outras
verses e distribuies da famlia Red Hat.
2. Instale o pacote puppet-agent:
# yum -y install puppet-agent
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
17
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
18
Dica
Ordens ao invs de passos
Atravs do RAL dizemos somente o que queremos e no precisamos nos preocupar no como
ser feito. Portanto, temos que pensar em ordens como "o pacote X deve estar instalado", ou
ainda, "o servio Z deve estar parado e desativado".
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
19
shell
uid
=> '/bin/sh',
=> '34',
}
...
A sada mostra todos os usurios, com atributos como UID, GID e shell j formatados na linguagem do
Puppet que estejam presentes no sistema operacional.
Ns podemos ser mais especficos e consultar apenas um resource:
# puppet resource user root
user { 'root':
ensure
=> 'present',
comment
=> 'root',
gid
=> '0',
home
=> '/root',
shell
=> '/bin/bash',
uid
=> '0',
}
Esse cdigo gerado pode ser utilizado depois, e funcional.
possvel passarmos alguns atributos para o puppet resource, fazendo com que ele altere o estado
de um recurso no sistema.
Tradicionalmente, para criarmos um usurio usamos comandos como useradd
adduser. Ao invs de usar um desses comandos, vamos usar o Puppet:
ou o interativo
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
20
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
21
No Debian:
# dpkg -s aide
Package `aide' is not installed and no info is available.
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.
# puppet resource package aide ensure=installed
Notice: /Package[aide]/ensure: created
package { 'aide':
ensure => '0.16~a2.git20130520-3',
}
# dpkg -s aide
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
22
Parameters
---------allowdupe, attribute_membership, attributes, auth_membership, auths,
comment, ensure, expiry, forcelocal, gid, groups, home, ia_load_module,
iterations, key_membership, keys, loginclass, managehome, membership,
name, password, password_max_age, password_min_age, profile_membership,
profiles, project, purge_ssh_keys, role_membership, roles, salt, shell,
system, uid
Providers
--------aix, directoryservice, hpuxuseradd, ldap, openbsd, pw, user_role_add,
useradd, windows_adsi
Pronto, agora temos uma lista de parmetros sobre o tipo user.
Dica
Documentao completa
O argumento -s mostra uma verso resumida da documentao. Use o comando
puppet describe sem o -s para ter acesso documentao completa do resource type.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
23
=>
=>
=>
=>
=>
=>
=>
=>
'present',
'1004',
'/home/joe',
'!',
'99999',
'0',
'/bin/bash',
'1004',
=>
=>
=>
=>
=>
=>
=>
=>
=>
'present',
'1004',
['bin', 'adm'],
'/home/joe',
'!',
'99999',
'0',
'/bin/bash',
'1004',
4. Basta sair do vim, salvando o arquivo, para que o Puppet aplique a nova configurao. Teremos
uma sada parecida com essa:
Info: Applying configuration version '1447253347'
Notice: /Stage[main]/Main/User[joe]/groups: groups changed '' to ['adm', 'bin']
Notice: Applied catalog in 0.07 seconds
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
24
11. Execute um comando de ping para o Google.com e direcione a sada do comando para um arquivo
/tmp/ping.txt.
# puppet resource exec 'ping -c3 google.com > /tmp/ping.txt' path='/bin:/usr/bin'
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
25
7 Manifests
As declaraes de configurao so chamadas de manifests (manifestos) e so salvas em arquivos com
a extenso .pp.
A principal utilidade da linguagem do Puppet a declarao de resources, representando um estado
desejado.
Nos manifests tambm podemos ter condies, agrupar resources, gerar texto com funes, utilizar e
referenciar cdigo em outros manifests e muitas outras coisas. Mas o principal garantir que resources
sejam declarados e gerenciados de maneira correta.
Temos um resource type, nesse caso, file, seguido por um par de colchetes que englobam todo o
restante das informaes sobre o resource.
Dentro dos colchetes, temos:
O ttulo do recurso seguido de dois pontos.
E uma sequncia de atributo => valor que serve para descrever como deve ser o
recurso. Vrios valores devem ser separados por vrgula.
Alm disso, algumas regras so fundamentais sobre a sintaxe:
Esquecer de separar atributos usando a vrgula um erro muito comum, tenha cuidado. O ltimo
par atributo => valor pode ser seguido de vrgula tambm.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
26
de
recursos,
Colocar aspas nos valores faz diferena! Valores e palavras reservadas da linguagem, como
present, no precisam estar entre aspas, apenas strings.
Aspas simples so para valores literais e o nico escape para a prpria aspa (') e a barra
invertida (\).
Aspas duplas servem para interpolar variveis e podem incluir um \n (nova linha).
Dica
Teste antes de executar
O Puppet fornece algumas funcionalidades que nos permitem testar o cdigo antes de execut-lo.
Primeiramente podemos validar se existe algum erro de sintaxe, usando o comando
puppet parser validate arquivo.pp.
O comando puppet parser validate apenas verifica se o manifest est correto.
Para
simularmos
as
alteraes
puppet apply --noop arquivo.pp.
que
sero
ou
no
feitas,
usamos
Mais exemplos:
# vim /root/manifests/arquivo-2.pp
file { '/tmp/teste1.txt':
ensure => present,
content => "Ola!\n",
}
file { '/tmp/teste2':
ensure => directory,
mode
=> '0644',
}
file { '/tmp/teste3.txt':
ensure => link,
target => '/tmp/teste1.txt',
}
notify {"Gerando uma notificao!":}
notify {"Outra notificao":}
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
27
/tmp/teste2:
total 8
drwxr-xr-x 2 root root 4096 Nov 11 13:28 .
drwxrwxrwt 8 root root 4096 Nov 11 13:28 ..
# cat /tmp/teste3.txt
Ola!
Repare que deixamos de fora alguns atributos, como path, e ainda assim tudo funcionou. Quase todos
os resourse types possuem algum atributo que assume como valor padro o ttulo de resource. Para o
resource file, o atributo path. Para o recurso notify, message. Em muitos outros casos, como
user, group, package e outros, simplesmente o atributo name.
No jargo do Puppet, o atributo que recebe como valor padro o ttulo de um recurso chamado de
namevar. Esse valor sempre utilizado em um atributo que deve ser capaz de dar uma identidade ao
recurso, que deve sempre ser nico.
Utilizar o valor do ttulo do resource conveniente, mas algumas vezes pode ser desajeitado. Em certas
ocasies melhor dar um ttulo curto que simbolize e identifique o resource e atribuir um valor
diretamente ao namevar como um atributo. Isso prtico principalmente se o nome de um recurso
longo.
notify {'grandenotificacao':
message => "Essa uma grande notificao! Ela to grande que
melhor utilizar um nome pequeno como ttulo do resource.",
}
No possvel declarar o mesmo resource mais de uma vez. O Puppet no permite que resources com o
mesmo ttulo sejam criados e, em vrios casos, tambm no vai permitir que recursos diferentes tenham
o mesmo valor de namevar.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
28
# vim /root/manifests/conflito.pp
file {'arquivo':
path => '/tmp/arquivo.txt',
ensure => present,
}
file {'outroarquivo':
path => '/tmp/arquivo.txt',
ensure => present,
}
# puppet apply /root/manifests/conflito.pp
Error: Evaluation Error: Error while evaluating a Resource Statement, \
Cannot alias File[outroarquivo] to ["/tmp/arquivo.txt"] at \
/root/manifests/conflito.pp:6; resource ["File", "/tmp/arquivo.txt"] \
already declared at /root/manifests/conflito.pp:1 at /root/manifests/conflito.pp:6:3
2. Crie um usurio chamado elvis com shell padro /bin/sh e grupo adm:
user {'elvis':
shell
=> '/bin/sh',
gid
=> 'adm',
managehome => true,
}
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
29
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
30
8 Ordenao
Agora que entendemos os manifests e a declarao de recursos, vamos aprender sobre
meta-parmetros e ordenao de recursos.
Voltemos ao manifest /root/manifests/arquivo-2.pp, que criou um arquivo, um diretrio e um link
simblico:
file { '/tmp/teste1.txt':
ensure => present,
content => "Ola!\n",
}
file { '/tmp/teste2':
ensure => directory,
mode
=> '0644',
}
file { '/tmp/teste3.txt':
ensure => link,
target => '/tmp/teste1.txt',
}
notify {"Gerando uma notificao!":}
notify {"Outra notificao":}
Embora as declaraes estejam escritas uma aps a outra, o Puppet pode aplic-las em qualquer ordem.
Ao contrrio de uma linguagem procedural, a ordem da escrita de recursos em um manifest no implica
na mesma ordem lgica para a aplicao.
Alguns recursos dependem de outros recursos. Ento, como dizer ao Puppet qual deve vir primeiro?
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
31
Nota
Maisculo ou minsculo?
Lembre-se: usamos caixa baixa quando estamos declarando novos resources. Quando queremos
referenciar um resource que j existe, usamos letra maiscula na primeira letra do seu tipo,
seguido do ttulo do resource entre colchetes.
file{'arquivo': } uma declarao de recurso e File['arquivo'] uma referncia ao
resource declarado.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
32
Aviso
Quando acontece um refresh?
Refreshes acontecem somente durante a aplicao da configurao pelo Puppet e nunca fora
dele.
O agente do Puppet no monitora alteraes nos arquivos.
Nota
Resources que suportam refresh
Somente os tipos built-in exec, service e mount podem ser refreshed.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
33
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
34
3. Temos uma limitao, pois, caso exista algum erro no arquivo de origem, o arquivo, sempre ser
copiado para /etc/sudoers. Faamos uma verificao antes de o arquivo ser copiado.
Copie o arquivo /etc/sudoers para /root/manifests/sudoers. Edite o arquivo
/root/manifests/sudoers de forma a deix-lo invlido antes de aplicar o manifest abaixo.
package { 'sudo':
ensure => 'installed'
}
file { '/etc/sudoers':
ensure => 'file',
mode
=> '0440',
owner
=> 'root',
group
=> 'root',
source => '/root/manifests/sudoers',
require => [Package['sudo'], Exec['parse_sudoers']],
}
exec { 'parse_sudoers':
command => '/usr/sbin/visudo -c -f /root/manifests/sudoers',
require => Package['sudo'],
}
4. Ainda temos uma limitao. Toda vez que o manifest aplicado, o resource
Exec['parse_sudoers'] executado. Precisamos de uma condio para que ele s seja
executado se necessrio.
package {'sudo':
ensure => 'installed'
}
file {'/etc/sudoers':
ensure => 'file',
mode
=> 0440,
owner
=> 'root',
group
=> 'root',
source => '/root/manifests/sudoers',
require => [Package['sudo'], Exec['parse_sudoers']],
}
exec {'parse_sudoers':
command => '/usr/sbin/visudo -c -f /root/manifests/sudoers',
unless => '/usr/bin/diff /root/manifests/sudoers /etc/sudoers',
require => Package['sudo'],
}
Ao executar esse manifest, o arquivo /etc/sudoers no ser atualizado porque h um problema de
validao de contedo do arquivo de origem /root/manifests/sudoers.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
35
Nota
Atributos onlyif e unless do resource exec
Quando o recurso exec possuir o atributo onlyif ou unless declarado, s ser executado se
o(s) comando(s) informado(s) nestes atributos for(em) executado(s) sem erros. Ou seja, se
retornarem
o
cdigo
0.
Veja
mais
informaes
em:
http://www.puppetcookbook.com/posts/exec-onlyif.html
e
https://docs.puppet.com/puppet/latest/reference/types/exec.html
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
36
=
=
=
=
'8.8.8.8'
'8.8.4.4'
'/etc/resolv.conf'
"nameserver ${dns1}\nnameserver ${dns2}"
file { $arquivo:
ensure => 'present',
content => $conteudo,
}
Mais alguns detalhes sobre variveis:
Variveis comeam com o smbolo de cifro ($).
Variveis podem ser usadas para dar nomes em resources e atributos.
Para interpolar variveis, a string deve estar entre aspas duplas e a varivel deve estar entre
chaves: ${var}.
Variveis do topo do
$::variavel_global.
escopo
(algo
como
global)
podem
ser
acessadas
assim:
9.2 Fatos
Antes de gerar a configurao, o Puppet executa o facter.
O facter uma ferramenta fundamental do ecossistema do Puppet, que gera uma lista de variveis
chamadas de fatos, que contm diversas informaes sobre o sistema operacional.
Exemplo de sada da execuo do comando facter:
# facter
dmi => {
bios => {
release_date => "12/01/2006",
vendor => "innotek GmbH",
version => "VirtualBox"
},
board => {
manufacturer => "Oracle Corporation",
product => "VirtualBox",
serial_number => "0"
},
manufacturer => "innotek GmbH",
product => {
name => "VirtualBox",
serial_number => "0",
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
37
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
38
notify {'kernel':
message => "O sistema operacional ${::kernel} verso ${::kernelversion}."
}
notify {'distro':
message => "A distribuio GNU/Linux ${::operatingsystem} verso ${::operatingsystem
}
E teremos a seguinte sada:
# puppet apply facter.pp
Notice: O sistema operacional Linux verso 3.16.0
Notice: /Stage[main]/Main/Notify[kernel]/message: defined 'message' as \
'O sistema operacional Linux verso 3.16.0'
Notice: A distribuio Debian e verso 8.2
Notice: /Stage[main]/Main/Notify[distro]/message: defined 'message' as \
'A distribuio Debian verso 8.2'
Notice: Applied catalog in 0.03 second
Nota
Sistemas operacionais diferentes
Alguns fatos podem variar de um sistema operacional para outro. Alm disso, possvel estender
as variveis do facter.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
39
9.3 Condicionais
A linguagem declarativa do Puppet possui mecanismos de condio que funcionam de maneira parecida
em relao s linguagens de programao. Mas existem algumas diferenas.
9.3.1 if
Exemplo de um bloco de condio if:
if expressao {
bloco de codigo
}
elsif expressao {
bloco de codigo
}
else {
bloco de codigo
}
O else e o elsif so opcionais.
Outro exemplo, usando uma varivel do facter:
if $::is_virtual == true {
notify {'Estamos em uma maquina virtual': }
}
else {
notify {'Estamos em uma maquina real': }
}
Os blocos podem conter qualquer qualquer tipo de definio de configurao, mais alguns exemplos:
if $::osfamily == 'RedHat' {
service {'sshd':
ensure => 'running',
enable => true,
}
}
elsif $::osfamily == 'Debian' {
service {'ssh':
ensure => 'running',
enable => true,
}
}
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
40
9.3.2 Expresses
9.3.2.1 Comparao
== (igualdade, sendo que comparao de strings case-insensitive)
!= (diferente)
< (menor que)
> (maior que)
<= (menor ou igual)
>= (maior ou igual)
=~ (casamento de regex)
!~ (no casamento de regex)
in (contm, sendo que comparao de strings case-sensitive)
Exemplo do operador in:
'bat'
'Bat'
'bat'
'bat'
'bat'
in
in
in
in
in
'batata' # TRUE
'batata' # FALSE
['bat', 'ate', 'logo'] # TRUE
{ 'bat' => 'feira', 'ate' => 'fruta'} # TRUE
{ 'feira' => 'bat', 'fruta' => 'ate' } # FALSE
9.3.3 Case
Alm do if, o Puppet fornece a diretiva case.
case $::operatingsystem {
centos: { $apache = "httpd" }
redhat: { $apache = "httpd" }
debian: { $apache = "apache2" }
ubuntu: { $apache = "apache2" }
# fail uma funo
default: {
fail("sistema operacional desconhecido")
}
}
package {'apache':
name
=> $apache,
ensure => 'latest',
}
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
41
9.3.4 Selectors
Ao invs de escolher a partir de um bloco, um selector escolhe seu valor a partir de um grupo de
valores. Selectors so usados para atribuir valor a variveis.
$apache = $::operatingsystem ? {
centos
=> 'httpd',
redhat
=> 'httpd',
/Ubuntu|Debian/ => 'apache2',
default
=> undef,
}
O ponto de interrogao assinala $operatingsystem como o piv do selector, e o valor final que
atribudo a $apache determinado pelo valor corresponde de $::operatingsystem.
Pode parecer um pouco estranho, mas h muitas situaes em que a forma mais concisa de se obter
um valor.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
42
package {'ntp':
ensure => 'installed',
}
if $::osfamily == 'RedHat' {
service {'ntpd':
ensure => 'running',
enable => 'true',
}
}
elsif $::osfamily == 'Debian' {
service {'ntp':
ensure => 'running',
enable => 'true',
}
}
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
43
10 Laboratrio
O padro mais comum na utilizao do Puppet a trade pacote, arquivo de configurao e servio.
Codifique um manifest que declare o seguinte:
1. O pacote openssh-server deve estar instalado.
2. O arquivo de configurao /etc/ssh/sshd_config depende do pacote openssh-server e
tem como fonte o caminho /root/manifests/sshd_config.
Dica: faa uma cpia do arquivo /etc/ssh/sshd_config para /root/manifests.
3. O servio sshd deve ser recarregado quando o arquivo de configurao sshd_config for
modificado.
4. Seu manifest deve tratar qual o sistema operacional em relao ao servio. Se for RedHat/CentOS
o servio ser sshd, se for Debian/Ubuntu ser apenas ssh.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
44
11 Master / Agent
O Puppet deve ser utilizado com a arquitetura Master / Agent. O ciclo de operao nesses casos o
seguinte:
1. Os clientes (chamados de node) possuem um agente instalado que permanece em execuo e se
conecta ao servidor central (chamado tipicamente de Master) periodicamente (a cada 30 minutos,
por padro).
2. O node solicita a sua configurao, que compilada e enviada pelo Master.
3. Essa configurao chamada de catlogo.
4. O agente aplica o catlogo no node.
5. O resultado da aplicao do catlogo reportado ao Master, havendo divergncias ou no.
Outra maneira comum de implantao do Puppet a ausncia de um agente em execuo nos nodes. A
aquisio e aplicao do catlogo agendada na crontab.
Dica
Configurao de hostname no CentOS/Red Hat e Debian/Ubuntu
Para resoluo de nomes, configure corretamente o arquivo /etc/resolv.conf com os
parmetros domain e search com o domnio de sua rede.
O arquivo /etc/hosts deve possuir pelo menos o nome da prpria mquina, com seu IP, FQDN
e depois o hostname. Exemplo: 192.168.1.10 node1.domain.com.br node1.
No Debian/Ubuntu, coloque apenas o hostname no arquivo /etc/hostname.
No
CentOS/Red
Hat,
ajuste
/etc/sysconfig/network.
valor
da
varivel
HOSTNAME
no
arquivo
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
45
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
46
|
|
|
|-|
|
|
|--
|-- metadata-help.erb
|-- rpc-help.erb
|-- server.cfg
puppet/
|-- ssl/
|-- auth.conf
|-- puppet.conf
puppetserver/
|-- conf.d/
|
|-- ca.conf
|
|-- global.conf
|
|-- puppetserver.conf
|
|-- web-routes.conf
|
|-- webserver.conf
|-- bootstrap.cfg
|-- logback.xml
|-- request-logging.xml
Dica
Sobre os arquivos de configurao
Nas pginas abaixo voc encontra mais detalhes sobre os arquivos de configurao do Puppet:
https://docs.puppet.com/puppet/latest/reference/config_important_settings.html
https://docs.puppet.com/puppet/latest/reference/dirs_confdir.html
https://docs.puppet.com/puppet/latest/reference/config_about_settings.html
https://docs.puppet.com/puppet/latest/reference/config_file_main.html
https://docs.puppet.com/references/latest/configuration.html
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
47
Nota
Sobre os binrios do Puppet
A instalao do Puppet 4 e todos seus componentes fica em /opt/puppetlabs.
Os arquivos de configurao ficam em /etc/puppetlabs.
2. Configurando o servio:
Altere as configuraes de memria da JVM que utilizada pelo Puppet Server para adequ-las a
quantidade de memria disponvel.
No CentOS/Red Hat edite o arquivo /etc/sysconfig/puppetserver e no Debian/Ubuntu edite o
arquivo /etc/default/puppetserver:
JAVA_ARGS="-Xms512m -Xmx512m -XX:MaxPermSize=256m"
Com esta configurao ser alocado 512 MB para uso da JVM usada pelo Puppet Server. Por padro,
so alocados 2 GB de memria para uso da JVM.
3. Na mquina PuppetServer, gere um certificado e inicie os servio com os comandos abaixo.
# puppet cert generate master.domain.com.br
# puppet resource service puppetserver ensure=running enable=true
Nota
Configurao de firewall e NTP
Mantenha a hora corretamente configurada utilizando NTP para evitar problemas na assinatura de
certificados.
A porta 8140/TCP do servidor Puppet Server precisa estar acessvel para as demais mquinas
que possuem o Puppet Agent instalado.
As
solicitaes
de
assinatura
de
/etc/puppetlabs/puppet/ssl/ca/requests/
certificados
no
Puppet-Server
ficam
em:
Se precisar revogar os certificados assinados de um host cliente (node1, por exemplo) no Puppet-Server
s usar o comando: puppet cert clean node1.domain.com.br.
Os logs do PuppetServer ficam em:
/var/log/puppetlabs/puppetserver/puppetserver.log
/var/log/puppetlabs/puppetserver/puppetserver-daemon.log
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
48
2. Em uma mquina em que o agente est instalado, precisamos configur-la para que ela saiba quem
o Master.
No arquivo /etc/puppetlabs/puppet/puppet.conf, adicione as linhas abaixo:
[main]
certname = node1.domain.com.br
server = master.domain.com.br
environment = production
[agent]
report = true
Nota
Conectividade
Certifique-se de que o servidor Master na porta 8140/TCP est acessvel para os nodes.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
49
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
50
Dica
Possveis problemas com certificados SSL
importante que os horrios do Master e dos nodes estejam sincronizados.
Conexes SSL confiam no relgio e, se estiverem incorretos, ento sua conexo pode falhar com
um erro indicando que os certificados no so confiveis.
Procure manter os relgios corretamente configurados utilizando NTP.
Voc
tambm
pode
consultar
esta
pgina
https://docs.puppet.com/puppet/4.4/reference/ssl_regenerate_certificates.html para saber como
reconfigurar os certificados no Agente e Master.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
51
12 Nodes
O Puppet comea a compilao da configurao de um catlogo pelo arquivo
/etc/puppetlabs/code/environments/production/manifests/site.pp. O site.pp o
ponto de entrada do master para identificar a configurao que ser enviada a um agente.
Para saber qual configurao deve ser enviada a um agente, precisamos declarar o hostname do agente,
utilizando a diretiva node. Diretivas node casam sempre com o nome do agente. Por padro, o nome do
agente o valor de certname presente no certificado de um agente (por padro, o FQDN).
Nota
Classificao de nodes
O Puppet fornece um recurso chamado External Node Classifier (ENC), que tem a finalidade de
delegar o registro de nodes para uma entidade externa, evitando a configurao de longos
manifests. Esse recurso ser visto mais adiante.
A documentao oficial est em: https://docs.puppet.com/guides/external_nodes.html
12.2 Nomes
A diretiva node casa com agentes por nome. O nome de um node um identificador nico, que por
padro valor de certname, ou seja o FQDN.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
52
12.4 Prtica
1. Declare
a
mquina
node1.domain.com.br
no
arquivo
/etc/puppetlabs/code/environments/production/manifests/site.pp do master.
2. Declare o pacote tcpdump como instalado para node1.domain.com.br.
3. Execute o comando puppet agent -t no node1, certifique-se de que o pacote tcpdump foi
instalado.
Dica
Simulando a configurao
Para simularmos as alteraes que sero ou no realizadas no host cliente, usamos o comando
puppet agent -t --noop.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
53
URL_BASE="https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-6-x86_64/"
rpm -ivh --force $URL_BASE/pgdg-redhat95-9.5-2.noarch.rpm
yum -y install postgresql95-server postgresql95-contrib
service postgresql-9.5 initdb
chkconfig postgresql-9.5 on
No CentOS/RedHat 7 64 bits:
#
#
#
#
#
#
URL_BASE="https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/"
rpm -ivh --force $URL_BASE/pgdg-redhat95-9.5-2.noarch.rpm
yum -y install postgresql95-server postgresql95-contrib
/usr/pgsql-9.5/bin/postgresql95-setup initdb
service postgresql-9.5 start
chkconfig postgresql-9.5 on
No Debian 8:
# su # echo "deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main" > \
/etc/apt/sources.list.d/pgdg.list
# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add # apt-get update
# apt-get -y install postgresql-9.5
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
54
all
all
all
all
postgres
all
127.0.0.1/32
::1/128
all
all
all
all
postgres
all
127.0.0.1/32
::1/128
peer
peer
md5
md5
Depois:
local
local
host
host
trust
trust
trust
trust
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
55
3. No
servidor
PuppetServer,
edite
o
/etc/puppetlabs/puppetdb/conf.d/database.ini e altere as seguinte linhas:
arquivo
[database]
classname = org.postgresql.Driver
subprotocol = postgresql
subname = //localhost:5432/puppetdb
username = puppetdb
password = SENHA-DO-USUARIO-PUPPETDB
Agora edite o arquivo /etc/puppetlabs/puppetdb/conf.d/jetty.ini e altere os parmetros a
seguir para deix-los com esses valores.
[jetty]
host = 0.0.0.0
port = 8080
ssl-host = 0.0.0.0
ssl-port = 8081
Execute o comando abaixo para gerar os certificados a serem usados pelo PuppetDB e configurar o
arquivo jetty.ini.
# puppetdb ssl-setup
Reinicie o PuppetDB com o comando abaixo:
# service puppetdb restart
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
56
Aviso
Informaes sobre o PuppetDB
Mais informaes sobre a instalao do PuppetDB podem ser encontradas nas pginas:
https://docs.puppet.com/puppetdb/latest/configure.html
e
https://docs.puppet.com/puppetdb/4.1/connect_puppet_master.html
em:
http://master.domain.com.br:8080
ou
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
57
Aviso
Possveis problemas no acesso ao PuppetDB
Se no conseguir acessar a interface web do PuppetDB, verifique se h algum firewall
bloqueando a porta.
No CentOS/Red Hat 6, voc pode desabilitar o firewall seguindo estas instrues:
http://www.cyberciti.biz/faq/fedora-redhat-centos-5-6-disable-firewall
No CentOS/Red Hat 7, voc pode desabilitar o firewall seguindo estas instrues:
http://www.liquidweb.com/kb/how-to-stop-and-disable-firewalld-on-centos-7
Voc tambm pode precisar desabilitar o SELinux no CentOS/RedHat. Siga estas instrues:
http://www.revsys.com/writings/quicktips/turn-off-selinux.html
ou
http://aruljohn.com/info/centos-selinux/
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
58
node master.domain.com.br {
class {'::puppetexplorer':
vhost_options => {
rewrites => [ { rewrite_rule => ['^/api/metrics/v1/mbeans/puppetlabs.puppetdb\
.query.population:type=default,name=(.*)$ https://master.domain.com.br:8081/\
api/metrics/v1/mbeans/puppetlabs.puppetdb.population:name=$1 [R=301,L]'] } ] }
}
}
Agora execute o comando abaixo.
# puppet agent -t
Ao final da instalao, o PuppetExplorer ficar acessvel em: https://master.domain.com.br
Aviso
Problema no PupppetExplorer
O mdulo de instalao do PuppetExplorer foi declarado passando o recurso vhost_options,
afim de corrigir um bug no PuppetExplorer devido a uma atualizao realizada no PuppetDB. Veja
o report em: https://github.com/spotify/puppetexplorer/issues/49 normalmente, o PuppetExplorer
deveria ser instalado apenas usando a declarao abaixo no arquivo site.pp.
node puppetserver.domain.com.br {
include puppetexplorer
}
Mais informaes sobre o PuppetExplorer podem ser encontradas em:
https://groups.google.com/forum/#!topic/puppet-users/VDywEgW2Y54
https://forge.puppet.com/spotify/puppetexplorer
https://github.com/spotify/puppetexplorer
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
59
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
60
podem
ser
encontradas
em:
adicione
no
arquivo
[agent]
report = true
Reinicie o Puppet-Agent com o comando abaixo:
# service puppet restart
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
61
14 Classes e Mdulos
Ao criar diversos resources para vrios nodes, em algum momento passa a fazer sentido que certos
resources que so relacionados estejam juntos, ou resources que sejam utilizados muitas vezes possam
ser resumidos.
Muitas vezes, configuraes especficas de um node precisam ser aproveitadas em outro e torna-se
necessrio copiar tudo para o outro node. Quando alteraes so necessrias, preciso realizar diversas
modificaes.
O Puppet fornece alguns mecanismos chamados resource collections, que so a aglutinao de vrios
resources para que possam ser utilizados em conjunto.
14.1 Classes
Deixe seu conhecimento sobre programao orientada a objetos de lado a partir de agora.
Para o Puppet, uma classe a juno de vrios resources sob um nome, uma unidade. um bloco de
cdigo que pode ser ativado ou desativado.
Definindo uma classe:
class nomedaclasse {
...
}
Dentro do bloco de cdigo da classe podemos colocar qualquer cdigo Puppet, por exemplo:
# vim ntp.pp
class ntp {
package { 'ntp':
ensure => installed,
}
service {
ensure
enable
require
}
'ntpd':
=> running,
=> true,
=> Package['ntp'],
}
Vejamos o resultado ao aplicar esse cdigo:
# puppet apply ntp.pp
Finished catalog run in 0.03 seconds
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
62
'ntpd':
=> running,
=> true,
=> Package['ntp'],
}
# declarando a classe
class {'ntp': }
Aplicando-a novamente:
# puppet apply --verbose ntp.pp
Info: Applying configuration version '1352909337'
/Stage[main]/Ntp/Package[ntp]/ensure: created
/Stage[main]/Ntp/Service[ntpd]/ensure: ensure changed 'stopped' to 'running'
Finished catalog run in 5.29 seconds
Portanto, primeiro definimos uma classe e depois a declaramos.
Nota
Declarao de classes sem usar include
A sintaxe class {'ntp': } utilizada quando usamos classes que recebem parmetros.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
63
14.2 Mdulos
Usando classes puramente no resolve nosso problema de repetio de cdigo. O cdigo da classe
ainda est presente nos manifests.
Para solucionar esse problema, o Puppet possui o recurso de carregamento automtico de mdulos
(module autoloader).
Primeiramente, devemos conhecer de nosso ambiente onde os mdulos devem estar localizados. Para
isso, verificamos o valor da opo de configurao modulepath.
# puppet config print modulepath
/etc/puppetlabs/code/environments/production/modules: \
/etc/puppetlabs/code/modules:/opt/puppetlabs/puppet/modules
No Puppet, mdulos so a unio de um ou vrios manifests que podem ser reutilizados. O Puppet
carrega automaticamente os manifests dos mdulos presentes em modulepath e os torna disponveis.
uma
classe
chamada
minha_outra_classe2.pp:
contm
meu_modulo::um_diretorio::minha_outra_classe2
uma
classe
chamada
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
64
2. O nome de nosso mdulo ntp. Todo mdulo deve possuir um arquivo init.pp, e nele deve
haver uma classe com o nome do mdulo.
# vim /etc/puppetlabs/code/environments/production/modules/ntp/manifests/init.pp
class ntp {
case $::operatingsystem {
centos, redhat: { $service_ntp = "ntpd" }
debian, ubuntu: { $service_ntp = "ntp" }
default: { fail("sistema operacional desconhecido") }
}
package { 'ntp':
ensure => installed,
}
service {
ensure
enable
require
}
$service_ntp:
=> running,
=> true,
=> Package['ntp'],
Nota
Nome do servio NTP
No Debian/Ubuntu, o nome do servio ntp. No CentOS/Red Hat, o nome do servio ntpd.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
65
2. Como aplicamos o mdulo ntp no master, ele ter o arquivo /etc/ntp.conf disponvel. Copie-o:
# cp /etc/ntp.conf /etc/puppetlabs/code/environments/production/modules/ntp/files/
3. Acrescente
um
resource
type
file
ao
cdigo
da
classe
ntp
em
/etc/puppetlabs/code/environments/production/modules/ntp/manifests/init.pp:
class ntp {
...
file { 'ntp.conf':
path
=> '/etc/ntp.conf',
require => Package['ntp'],
source => "puppet:///modules/ntp/ntp.conf",
notify => Service[$service_ntp],
}
}
4. Faa
qualquer
alterao
no
arquivo
ntp.conf
do
mdulo
(em
/etc/puppetlabs/code/environments/production/modules/ntp/files/ntp.conf),
por exemplo, acrescentando ou removendo um comentrio.
5. Aplique a nova configurao no node1.
# puppet agent -t
Dica
Servidor de arquivos do Puppet
O Puppet pode servir os arquivos dos mdulos, e funciona da mesma maneira se voc est
operando de maneira serverless ou master/agente. Todos os arquivos no diretrio files do
mdulo ntp esto disponveis na URL puppet:///modules/ntp/.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
66
15 Puppet Forge
Ao longo da histria da computao, programadores desenvolveram diversas tcnicas para evitar
retrabalho. Esto disponveis aos programadores bibliotecas de cdigo que implementam diversas
funcionalidades prontas para uso. Alm disso, ao desenvolver um software, certamente um programador
competente concentra rotinas repetidas ou parecidas em bibliotecas que podem ser reutilizadas no seu
projeto.
Infelizmente, no mundo da administrao de sistemas, aproveitar solues de problemas que j foram
resolvidos por outro administrador muito raro. SysAdmins de diferentes organizaes esto resolvendo
os mesmos problemas todos os dias. Configurando e instalando servidores web, banco de dados,
fazendo ajustes de segurana e etc.
No seria incrvel se os SysAdmins pudessem aproveitar o trabalho uns dos outros? Para isso o Puppet
Forge foi criado (https://forge.puppet.com)!
Puppet Forge um repositrio de mdulos escritos pela comunidade para o Puppet Open Source e
Puppet Enterprise. Nele encontramos diversos mdulos prontos para uso, e que com pouqussimas
linhas em um manifest podemos poupar horas e horas de trabalho aproveitando mdulos teis
desenvolvidos por SysAdmins ao redor do mundo.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
67
4. Ou
declarando
um
valor
para
um
dos
nossos
nodes,
/etc/puppetlabs/code/environments/production/manifests/site.pp:
no
node 'node1.domain.com.br' {
sysctl { 'net.ipv4.ip_forward':
value
=> '1',
enable => true,
}
}
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
68
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
69
16 Templates
Muitas vezes temos um mesmo servio ativado em diversas mquinas, mas em um conjunto de
mquinas esse servio precisa ser configurado de uma maneira e, no restante das mquinas, de outra.
Assim, cada conjunto de mquinas precisaria de um arquivo de configurao especfico, mesmo que
esse arquivo tivesse uma ou duas linhas de diferena.
Ento, quando fosse necessrio atualizar uma opo de configurao que comum aos dois conjuntos
de mquinas, seria necessrio atualizar dois arquivos de configurao. Alm do cuidado extra de garantir
que ambos estivessem corretos.
O Puppet tem um recurso de templates, em que podemos usar somente um arquivo de dentro dele.
Colocamos uma lgica e valores de variveis que venham do seu cdigo, tornando a nossa configurao
mais robusta.
Vamos usar como exemplo um mdulo chamado foo:
# cd /etc/puppetlabs/code/environments/production/modules/
# mkdir -p foo/manifests
# mkdir -p foo/templates
Adicione
o
contedo
abaixo
ao
arquivo
/etc/puppetlabs/code/environments/production/modules/foo/manifests/init.pp:
# vim /etc/puppetlabs/code/environments/production/modules/foo/manifests/init.pp
class foo {
$var1 = '123456'
$var2 = 'bar'
file {'/tmp/foo.conf':
ensure => 'file',
content => template('foo/foo.conf.erb')
}
}
At aqui ns usvamos o atributo content com uma string contendo o que queramos dentro do arquivo,
mas agora estamos usando a funo template(), que processa o arquivo foo.conf.erb.
Adicione
o
contedo
abaixo
ao
arquivo
/etc/puppetlabs/code/environments/production/modu les/foo/templates/foo.conf.erb:
# vim /etc/puppetlabs/code/environments/production/modules/foo/templates/foo.conf.erb
var1=<%= @var1 %>
var2=<%= @var2 %>
<% if @osfamily == 'RedHat' %>
var3=RedHat
<% else %>
var3=Outro
<% end %>
Repare que as variveis do manifest esto disponveis dentro da template, inclusive as variveis do
facter.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
70
Nota
Localizao de uma template no sistema de arquivos
Note que o caminho que deve ser passado para a funo template() deve conter o nome do mdulo, seguido
do nome do arquivo de template que usaremos. Portanto, template('foo/foo.conf.erb') significa abrir o
arquivo
/etc/puppetlabs/code/environments/production/modules/foo/templates/foo.conf.erb.
Dica
Concatenando templates
A funo template() pode concatenar vrias templates de uma vez s, possibilitando
configuraes sofisticadas.
template("foo/foo.conf-1.erb", "foo/foo.conf-2.erb")
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
71
Condies:
<% if @var1 != "foo" %>
<%= @var1 %> is not foo!
<% end %>
Dica
Evitando linhas em branco
Repare que no exemplo do arquivo /tmp/foo.conf as linhas em que estavam as tags com o if e
end acabaram saindo em branco no arquivo final.
Caso isso seja um problema, existem dois jeitos de resolvermos.
1. Colocar todo o cdigo em apenas uma linha, assim o arquivo final no conter linhas em branco:
<% if @osfamily == 'RedHat' %>var3=RedHat<% else %>var3=Outro<% end %>,
2. A outra opo colocar um hfen no final de cada tag, assim o ERB no retornar uma linha em
branco:
<% if @osfamily == 'RedHat' -%> var3=RedHat <% else -%> var3=Outro
<% end -%>
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
72
Dica
Mais informaes sobre a sintaxe ERB
Para saber mais detalhes sobre a sintaxe ERB, acesse a pgina abaixo.
https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html
Para saber mais detalhes sobre o uso de linguagens para manipulao de templates no Puppet,
acesse a pgina abaixo.
https://docs.puppet.com/puppet/latest/reference/lang_template.html
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
73
17 Environments
O Puppet permite voc dividir os seus sistemas em diferentes conjuntos de mquinas, chamados
environments.
Cada environment pode servir um conjunto diferente de mdulos. Isso usado geralmente para gerenciar
verses de mdulos, usando-os em sistemas destinados a testes.
O uso de environments introduz uma srie de outras possibilidades, como separar um ambiente em DMZ,
dividir tarefas entre administradores de sistemas ou dividir o seu parque por tipo de hardware.
O environment de um node especificado no arquivo puppet.conf. Sempre que um node faz um
pedido de configurao ao Puppet Master, o environment do node utilizado para determinar a qual
configurao e quais mdulos sero forneceidos.
Por padro, o agente envia ao Puppet Master um environment chamado production.
Dica
Enviroment em linha de comando
Opcionalmente, podemos chamar o agente passando o environment pela linha de comando:
puppet agent -t --environment desenv.
3. No Puppet Master, vamos modificar a template do mdulo motd no environment desenv, apenas
acrescentando uma linha ao final:
# cd /etc/puppetlabs/code/environments/desenv/modules/motd/templates
# echo "Puppet verso <%= @puppetversion -%>" >> motd.erb
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
74
# puppet agent -t
5. Agora temos dois mdulos motd, um para cada environment. Uma vez que o mdulo no
environment desenv esteja aprovado, ele pode ser copiado para o environment production com o
comando a seguir.
# rsync -a /etc/puppetlabs/code/environments/desenv/modules/motd/ \
/etc/puppetlabs/code/environments/production/modules/motd/
6. Nos nodes que so do environment production, a nova verso do mdulo motd ser utilizada a
partir de agora.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
75
18 Hiera
O Hiera uma ferramenta que busca por dados de configurao de seus manifests. Ele foi criado pelo
R.I.Piennar (que tambm criou o extlookup).
O Hiera permite separar os dados do cdigo Puppet. Com ele voc pode definir dados para diferentes
nodes usando o mesmo cdigo. Ao invs dos dados serem armazenados dentro de um manifest, com o
Hiera eles sero armazenados externamente.
O Hiera facilita a configurao de seus nodes de forma que podemos ter configuraes com dados
default ou ento vrios nveis de hierarquia. Ou seja, com o Hiera voc pode definir dados comuns para a
maioria dos seus nodes e sobrescrever dados para nodes especficos.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
76
mkdir -p /etc/puppetlabs/code/environments/production/hieradata/meucliente/os
mkdir -p /etc/puppetlabs/code/environments/production/hieradata/meucliente/host
mkdir -p /etc/puppetlabs/code/environments/production/hieradata/meucliente/domain
cd /etc/puppetlabs/code/environments/production/hieradata/meucliente/
touch os/ubuntu.yaml
touch os/redhat.yaml
touch domain/domain.com.br.yaml
touch host/node2.yaml
touch host/node1.domain.com.br.yaml
touch common.yaml
Dentro de cada arquivo YAML, so definidos os valores para as variveis a serem usadas nos manifests.
Essas variveis podem ter valores diferentes para cada arquivo especificado no exemplo acima. Se
houverem variveis com o mesmo nome e valores diferentes em vrios arquivos, o Hiera seguir a ordem
de
prioridade
da
hierarquia
dos
dados
que
definimos
no
arquivo
/etc/puppetlabs/puppet/hiera.yaml. A seguir est o exemplo do contedo de cada arquivo.
Exemplo do contedo do arquivo host/node1.domain.com.br.yaml:
#SSH
ssh_port: '22'
ssh_allow_users: 'puppetbr teste'
#Postfix
smtp_port: '25'
smtp_server: '127.0.0.1'
#Diretorio de conteudos
content_dir:
- '/home/puppetbr'
- '/home/puppetbr/content2/'
Exemplo do contedo do arquivo host/node2.yaml:
#SSH
ssh_port: '2220'
ssh_allow_users: 'teste'
#Postfix
smtp_port: '587'
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
77
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
78
Nota
Mais documentao sobre o Hiera
Mais
informaes
sobre
o
https://docs.puppet.com/hiera/3.1/
Hiera
podem
ser
encontradas
nesta
pgina:
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
79
2. O nosso mdulo doc ter dois manifests: o init.pp (cdigo principal) e o params.pp (apenas
para declarao de variveis).
# vim doc/manifests/init.pp
class doc(
#Usando as variaveis definidas no manifest params.pp
$apache_service = $doc::params::apache_service,
$ssh_port
= $doc::params::ssh_port,
$ssh_allow_users = $doc::params::ssh_allow_users,
$smtp_port
= $doc::params::smtp_port,
$smtp_server
= $doc::params::smtp_server,
$content_dir
= $doc::params::content_dir,
$config_package = $doc::params::config_package,
$deploy_scripts = $doc::params::deploy_scripts,
$scripts_version = $doc::params::scripts_version,
) inherits doc::params {
file { '/tmp/doc.txt':
ensure => 'file',
content => template("doc/documentation.txt.erb"),
mode
=> '0644',
owner
=> 'root',
group
=> 'root',
}
}
# vim doc/manifests/params.pp
class doc::params {
#Variaveis gerais
$content_dir
= hiera('content_dir', ['/home/puppetbr',
'/home/puppetbr/content/'])
$config_package = hiera('config_package', 'config.tar.bz2')
$deploy_scripts = hiera('deploy_scripts', true)
$scripts_version = hiera('scripts_version', '1.0')
#Apache
$apache_service = hiera('apache_service', 'apache2')
#SSH
$ssh_port
= hiera('ssh_port', '22')
$ssh_allow_users = hiera('ssh_allow_users', 'puppetbr teste')
#SMTP
$smtp_server = hiera('smtp_server', '127.0.0.1')
$smtp_port
= hiera('smtp_port', '25')
}
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
80
# vim doc/templates/documentation.txt.erb
#Informacoes sobre SSH
SSH_PORT=<%= @ssh_port %>
Usuario que podem acessar o SSH=<%= @ssh_allow_users %>
Distribuio GNU/Linux=<%= @osfamily %>
Hostname=<%= @hostname %>
Qual o nome do processo do Apache nesta distro? <%= @apache_service %>
#Informacoes sobre o servico de envio de email
SMTP_PORT=<%= @smtp_port %>
SMTP_SERVER=<%= @smtp_server %>
Diretorio de conteudos=<%= @content_dir %>
#Informacoes sobre a atualizacao do Script
PACKAGE=<%= @config_package %>
ENABLE_DEPLOY=<%= @deploy_scripts %>
PACKAGE_VERSION=<%= @scripts_version %>
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
81
5. Em
master.domain.com.br
/root/manifests.
mova
arquivo
node1.domain.com.br.yaml
para
# cd /etc/puppetlabs/code/environments/production/hieradata/meucliente/host/
# mv node1.domain.com.br.yaml /root/manifests.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
82
19 Augeas
Muitas vezes precisamos manipular arquivos de configurao e, geralmente, recorremos a solues
simples usando grep, sed, awk ou alguma linguagem de script.
Com isso, tem-se muito trabalho para manipular esses arquivos e o resultado final nunca flexvel ou
muito confivel.
O Augeas uma ferramenta para edio segura de arquivos de configurao, que analisa arquivos de
configurao em seus formatos nativos e os transforma em uma rvore. As alteraes so feitas
manipulando essa rvore e salvando-a de volta ao formato nativo do arquivo de configurao. Usando o
Augeas ficamos livres de problemas como tratar linhas em branco ou com comentrios.
Para dar suporte a diversos formatos de arquivos de configurao, o Augeas usa o que ele chama de
Lenses (lentes). Uma lente um registro de como um arquivo de configurao deve ser suportado pelo
Augeas, e atualmente so suportados mais de 100 formatos diferentes.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
83
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
84
augtool> ls /files/etc/resolv.conf
domain = outrodominio
search/ = (none)
nameserver[1] = 8.8.8.8
nameserver[2] = 8.8.4.4
3. Use o comando print no arquivo /etc/hosts. Identifique qual o nmero do registro do host
node1.domain.com.br.
augtool> print /files/etc/hosts
4. De posse do nmero do registro do host node1.domain.com.br, crie um novo alias para o host:
augtool> set /files/etc/hosts/NUMERO_DO_HOST/alias[2] node1
augtool> save
Saved 1 file(s)
augtool> quit
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
85
augeas { "runlevel":
context => "/files/etc/inittab",
changes => [
"set id/runlevels 3",
],
}
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
86
20 Puppet no Windows
O suporte a Windows no Puppet vem melhorando a cada nova verso. Mas no possvel hospedar o
Puppet Server no Windows, sendo somente o agente suportado.
Praticamente onde possvel criar compatibilidade, os resources do Puppet suportam Windows
normalmente. Em alguns casos so necessrios certos cuidados devido as diferenas semnticas entre
sistemas Unix-like e Windows.
Para obter detalhes sobre a instalao do Puppet Agent
https://docs.puppet.com/puppet/latest/reference/install_windows.html
no
Windows
acesse:
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
87
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
88
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
89
5. Aps a instalao, como o servio Puppet estava em execuo, um certificado j foi solicitado ao
master. Como de praxe, assine o certificado:
# puppet cert list
"win7.domain.com.br" (SHA256) EE:58:97:E3:6F:64:15:DF:68:A4:21:DA:A3:E2:81:43:3F: ...
# puppet cert sign win7.domain.com.br
Signed certificate request for win7.domain.com.br
Removing file Puppet::SSL::CertificateRequest win7.domain.com.br at \
'/var/lib/puppet/ssl/ca/requests/win7.domain.com.br.pem'
Nota
Privilgios
No Windows, o Puppet precisa de privilgios elevados para funcionar corretamente, afinal ele
precisa configurar o sistema.
O servio do Puppet executado com privilgio LocalSystem, ou seja, sempre com privilgios
elevados.
Quando usar a linha de comando, sempre necessrio utilizar o Puppet com privilgios elevados.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
90
Dica
Ttulo do resource package
O ttulo do resource package precisa ser igual a propriedade DisplayName utilizada no registro do
Windows para instalao de um pacote MSI. Caso o ttulo seja diferente, o Puppet executar a
instalao em todas as execues.
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
91
para o node
service {'Audiosrv':
ensure => 'stopped',
enable => false,
}
: 20 WIN32_SHARE_PROCESS
: 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
: 0 (0x0)
: 0 (0x0)
: 0x0
: 0x0
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
92
:
:
:
:
:
:
20 WIN32_SHARE_PROCESS
1 STOPPED
0 (0x0)
0 (0x0)
0x0
0x0
na
declarao
dos
resources
no
Windows:
4. Execute o agente no Windows para que a chave no registro seja criada (lembre-se de abrir o
terminal do Puppet como Administrator):
# puppet agent -t
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
93
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
94
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
95
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
96
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
97
22 Histrico de mudanas
Verso 2.0 lanada dia 23/06/2016
Verso 1.0 lanada dia 20/03/2014
22.1 Colaboradores
Acio Pires:
aeciopires @ gmail.com http://aeciopires.com
Guto Carvalho
gutocarvalho @ gmail.com http://gutocarvalho.net
Miguel Di Ciurcio Filho:
miguel @ instruct.com.br http://instruct.com.br
Licena CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
98