Está en la página 1de 98

Apostila sobre

https://github.com/puppet-br/apostila-puppet

Mantida por membros da comunidade

Apostila Puppet versão 2.0

Licença CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
2

Apostila Puppet versão 2.0

Sumário
1 Licença de uso desta obra
2 Sobre a Instruct
2.1 Sobre a Apostila
3 Introdução ao Gerenciamento de Configuração

5
10
10
11

3.1 Os desafios no gerenciamento de infraestrutura e serviços

11

3.2 Questões sobre a cultura estabelecida na administração de sistemas

11

3.3 Limitações das soluções comuns de automação

13

4 O que é o Puppet
4.1 Como o Puppet funciona?
5 Instalação

14
14
16

5.1 Debian e Ubuntu

16

5.2 CentOS e Red Hat

17

6 Resource Abstraction Layer (RAL)

19

6.1 Manipulando resources via RAL

19

6.2 Prática: Modificando recursos interativamente

24

7 Manifests

26

7.1 Declarando resources

26

7.2 Prática: conhecendo os resources

29

8 Ordenação

31

8.1 Meta-parâmetros e referência a recursos

31

8.2 Prática: validando o arquivo /etc/sudoers

34

9 Variáveis, fatos e condições

37

9.1 Variáveis

37

9.2 Fatos

37

9.3 Condicionais

40

9.4 Prática: melhor uso de variáveis

42

10 Laboratório

44

11 Master / Agent

45

11.1 Resolução de nomes

45

11.2 Segurança e autenticação

46

11.3 Prática Master / Agent

46

12 Nodes

52

12.1 Declarando nodes

52

12.2 Nomes

52

Licença CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
3

1 Instalando o PuppetExplorer 58 13.1 Classes 62 14.3 O node default 53 12.1 Prática: módulo para sysctl do Puppet Forge 67 15.1 Prática: Instalação 87 20.0 BR .Apostila Puppet versão 2.4 Criando um módulo para usar dados vindos do Hiera 79 19 Augeas 83 19.1 Usando o Augeas 83 19.2 Augeas e Puppet 85 20 Puppet no Windows 87 20.3 Comandos e consultas Hiera 79 18.2 Configurando Hiera 76 18.2 Prática: resources para Windows 91 20.4 Prática: arquivos de configuração em módulos 66 15 Puppet Forge 67 15.2 Prática: usando templates 73 17 Environments 17.2 Prática: módulo para autofsck do Puppet Forge 68 16 Templates 70 16.3 Prática: manipulando o registro 93 21 Outras Fontes de estudo 95 22 Histórico de mudanças 98 22.1 Sintaxe ERB 71 16.3 Configurando os Agentes Puppet 61 14 Classes e Módulos 62 14.Apostila cedida pela Instruct e mantida pela Puppet-BR 4 .1 Hiera Datasources 76 18.2 Módulos 64 14.1 Colaboradores 98 Licença CC BY-SA 3.0 12.1 Prática: configurando environments 18 Hiera 74 74 76 18.4 Prática 53 13 PuppetDB e Dashboards Web 54 13.2 Instalando o PuppetBoard 60 13.3 Prática: criando um módulo 64 14.

performance ou fonograma.0 1 Licença de uso desta obra A OBRA (CONFORME DEFINIDA ABAIXO) É DISPONIBILIZADA DE ACORDO COM OS TERMOS DESTA LICENÇA PÚBLICA CREATIVE COMMONS ("CCPL" OU "LICENÇA"). participem Licença CC BY-SA 3. cantores. no caso de uma Obra literária. f. dançarinos. QUALQUER USO DA OBRA QUE NÃO O AUTORIZADO SOB ESTA LICENÇA OU PELA LEGISLAÇÃO AUTORAL É PROIBIDO. fonogramas ou transmissões. artísticas ou científicas. músicos. incluindo adaptações cinematográficas ou qualquer outra forma na qual a Obra possa ser refeita. o indivíduo ou indivíduos que criaram a Obra ou. Para evitar dúvidas. ou fonograma ou performance. aprovada pela Creative Commons como sendo essencialmente equivalente a esta Licença.Apostila cedida pela Instruct e mantida pela Puppet-BR 5 . "Autor Original" significa. "Distribuir" significa colocar à disposição do público o original e cópias da Obra ou Obra Derivada. tais quais enciclopédias e antologias. g. constituam criações intelectuais nas quais a Obra é incluída na sua integridade em forma não-modificada. arranjo musical ou outras alterações de uma Obra literária. O LICENCIANTE CONCEDE A VOCÊ OS DIREITOS AQUI CONTIDOS EM CONTRAPARTIDA A SUA ACEITAÇÃO DESTES TERMOS E CONDIÇÕES. d. A Obra que constituir uma Obra Coletiva não será considerada uma Obra Derivada (como definido acima) para os propósitos desta Licença. "Elementos da Licença" significam os principais atributos da licença correspondente. "Obra Derivada" significa uma Obra baseada na Obra ou na Obra e outras Obras pré-existentes. "Obra Coletiva" significa uma coleção de Obras literárias. juntamente com uma ou mais contribuições. com exceção da Obra que constitua uma Obra Coletiva. por meio de venda ou qualquer outra forma de transferência de propriedade ou posse. recitem. Definições a. c. que em razão da seleção e arranjo do seu conteúdo. 1. sob esta Licença. e. artística ou científica. abrangendo qualquer forma reconhecível como derivada da original.org/compatiblelicenses. "Titular de Direitos Conexos" significa (i) no caso de uma performance os atores. transformada ou adaptada.Apostila Puppet versão 2. declamem. e outras pessoas que atuem. cada qual constituindo separada e independentemente uma Obra em si própria. h. A OBRA É PROTEGIDA POR DIREITO AUTORAL E/OU OUTRAS LEIS APLICÁVEIS. ou performances. se nenhum indivíduo puder ser identificado. VOCÊ ACEITA E CONCORDA FICAR OBRIGADO NOS TERMOS DESTA LICENÇA. incluindo ao menos: (i) termos que possuam a mesma finalidade. tal qual uma tradução. a qual não será considerada uma Obra Derivada para os propósitos desta Licença. (ii) permissão explícita para o relicenciamento de Obras Derivadas das Obras tornadas disponíveis sob aquela licença. a sincronização da Obra em relação cronometrada com uma imagem em movimento (“synching”) será considerada uma Obra Derivada para os propósitos desta Licença. "Licença Compatível Creative Commons" significa uma licença que se encontre listada no site http://creativecommons. b. "Licenciante" significa a pessoa física ou jurídica que oferece a Obra sob os termos desta Licença. o que for apropriado. ou outras Obras ou materiais não indicados na Seção 1(i) abaixo. quando a Obra for uma Obra musical. AO EXERCER QUAISQUER DOS DIREITOS À OBRA AQUI CONCEDIDOS.0 BR . artística ou científica. Compartilhamento pela mesma licença. a editora. que juntas são reunidas em um todo coletivo. cantem. adaptação. significado e efeito dos Elementos da Licença desta Licença e. conforme escolhidos pelo Licenciante e indicados no título desta licença: Atribuição. uma licença Creative Commons Unported ou uma licença Creative Commons de outra jurisdição com os mesmos Elementos da Licença desta Licença.

uma Obra de arte aplicada. que não tenha previamente violado os termos desta Licença com relação à Obra. perpétua (pela duração do direito autoral aplicável).Apostila cedida pela Instruct e mantida pela Puppet-BR 6 . Nada nesta licença deve ser interpretado de modo a reduzir. a empresa de radiodifusão. não-exclusiva. j. "Obra" significa a Obra literária. uma Obra cinematográfica e as expressas por um processo análogo ao da cinematografia. escultura. uma performance. inclusive por meios com ou sem fio ou performances públicas digitais. em qualquer meio. uma Obra de desenho. em forma digital ou qualquer outro meio eletrônico. Uma tradução. Criar e Reproduzir Obras Derivadas. demarcar ou de qualquer maneira identificar que mudanças foram feitas à Obra original. Executar a Obra para o público por qualquer meio ou processo e comunicar ao público performances da Obra. uma composição musical com ou sem palavras. sem royalties. qualquer que seja o modo ou a forma de sua expressão. inclusive sinais. e o direito de fixar e Reproduzir fixações da Obra. desde que qualquer Obra Derivada. para exercer os direitos sobre a Obra definidos abaixo: a. Reproduzir a Obra. Concessão da Licença. por gravação sonora ou visual. sem limitação. k. b. i. sendo este a pessoa ou entidade legal que primeiramente fixar os sons de uma performance ou outros sons. mapa. Limitações e exceções ao direito autoral e outros usos livres. na medida em que tais Obras/direitos sejam reconhecidos e protegidos pela legislação aplicável. uma compilação de dados. e (iii) no caso de radiodifusão. uma Obra dramática ou dramático-musical. brochuras e outros escritos. tal qual um livro. plano. inclusive. interpretem ou façam performances de Obras literárias ou artísticas ou expressões de folclore (ii) no caso de um fonograma. inclusive qualquer tradução. na extensão em que ela seja protegida como uma Obra sujeita ao regime dos direitos autorais.” ou uma modificação poderia indicar que “A Obra original foi modificada”. por qualquer meio ou processo. l. sem qualquer limitação.0 BR . ou que tenha recebido permissão expressa do Licenciante para exercer direitos sob esta Licença apesar de uma violação prévia. Licença CC BY-SA 3. transmissão ou fonograma. gravura ou litografia.0 em. o produtor. alocução. artístico e científico. 3. disponibilizar ao público Obras de tal forma que membros do público possam acessar essas Obras de um local e em um local escolhido individualmente por eles.Apostila Puppet versão 2. ou uma Obra executada por artistas circenses ou de shows de variedade. esboço ou Obra tridimensional relativa a geografia. topografia. artística ou científica. qualquer produção nos domínios literário. sujeita aos termos e condições desta Licença. adote razoáveis medidas para claramente indicar. uma ilustração. sob a legislação autoral ou outras leis aplicáveis. artística e/ou científica oferecida sob os termos desta Licença. O Licenciante concede a Você uma licença de abrangência mundial. pintura. limitar ou restringir qualquer uso permitido de direitos autorais ou direitos decorrentes de limitações e exceções estabelecidas em conexão com a proteção autoral. "Executar Publicamente" significa fazer a utilização pública da Obra e comunicar ao público a Obra. "Você" significa a pessoa física ou jurídica exercendo direitos sob esta Licença. "Reproduzir" significa fazer cópias da Obra por qualquer meio. incluindo a forma digital. incluindo. uma Obra coreográfica ou pantomima. uma conferência. conforme ela não for considerada uma Obra literária. sons ou imagens. uma Obra fotográfica e as Obras expressas por um processo análogo ao da fotografia. arquitetura. inclusive por performance pública digital. transmitir e retransmitir a Obra por quaisquer meios. 2. incorporar a Obra em uma ou mais Obras Coletivas e Reproduzir a Obra quando incorporada em Obras Coletivas. sermão e outras Obras da mesma natureza. inclusive o armazenamento de uma performance protegida ou fonograma. poderia assinalar que “A Obra original foi traduzida do Inglês para o Português. por exemplo. arquitetura ou ciência.

Você não poderá impor Licença CC BY-SA 3. BMI. retirar da Obra Derivada qualquer crédito conforme estipulado na Seção 4(c). Restrições.. na medida do possível. Todos os direitos não concedidos expressamente pelo Licenciante ficam ora reservados. Distribuir e Executar Publicamente Obras Derivadas. b. Você deve. Se Você criar uma Obra Coletiva. d. Você não poderá oferecer ou impor quaisquer termos sobre a Obra que restrinjam os termos desta Licença ou a habilidade do destinatário exercer os direitos a ele aqui concedidos sob os termos desta Licença. e Você deve incluir uma cópia desta Licença ou o Identificador Uniformizado de Recursos (Uniform Resource Identifier) para esta Licença em cada cópia da Obra que Você Distribuir ou Executar Publicamente. O Licenciante renuncia ao direito de recolher royalties. à parte da Obra em si. Atribuição-Compartilhamento pela mesma licença 3. Você não pode sublicenciar a Obra. e. na medida do razoável. ASCAP.Apostila cedida pela Instruct e mantida pela Puppet-BR 7 . Se Você licenciar a Obra Derivada sob os termos de qualquer das licenças mencionadas em 4(i) a 4(iii) (a “Licença Aplicável”). (ii) uma versão posterior desta Licença que contenha os mesmos Elementos da Licença. SESAC).0 c. em havendo notificação de qualquer Licenciante. (iii) uma Licença Creative Commons Unported ou uma Licença Creative Commons de outra jurisdição (seja a versão atual ou uma versão posterior). na hipótese de o Licenciante ser membro de uma sociedade de gestão coletiva de direitos (por exemplo. Se Você criar uma Obra Derivada. (IV) Quando Você Distribuir ou Executar Publicamente uma Obra Derivada. Esta Seção 4(a) se aplica à Obra enquanto quando incorporada em uma Obra Coletiva. 4. Você deverá manter intactas todas as informações que se referem a esta Licença e à exclusão de garantias em toda cópia da Obra que Você Distribuir ou Executar Publicamente. Você pode Distribuir ou Executar Publicamente uma Obra Derivada somente sob: (i) os termos desta Licença. Quando Você Distribuir ou Executar Publicamente a Obra. Você não poderá impor qualquer medida tecnológica eficaz à Obra que restrinja a possibilidade do destinatário exercer os direitos concedidos a ele sob os termos desta Licença. Se Você licenciar a Obra Derivada sob os termos de uma das licenças a que se refere o item 4(iv). (III) Você deverá manter intactas todas as informações que se referirem à Licença Aplicável e à exclusão de garantia em toda cópia da Obra tal como incluída na Obra Derivada que Você Distribuir ou Executar Publicamente. esteja sujeita aos termos desta Licença. em havendo aviso de qualquer Licenciante. ex. Os direitos acima incluem o direito de fazer as modificações que forem tecnicamente necessárias para exercer os direitos em outras mídias.Apostila Puppet versão 2.0 Unported). via essa sociedade. meios e formatos. (iv) uma Licença Compatível Creative Commons. (II) Você não pode oferecer ou impor quaisquer termos sobre a Obra Derivada que restrinjam os termos da Licença Aplicável. Distribuir e Executar Publicamente a Obra. Você deve respeitar os termos da Licença Aplicável e o seguinte: (I) Você deve incluir uma cópia da Licença Aplicável ou o Identificador Uniformizado de Recursos (Uniform Resource Identifier) para aquela Licença em toda cópia de qualquer Obra Derivada que Você Distribuir ou Executar Publicamente. Você deve. independente de serem conhecidos agora ou concebidos posteriormente.0 BR . conforme estipulado na Seção 4(c). ou a habilidade dos destinatários da Obra Derivada exercerem os direitos que lhes são garantidos sob os termos da Licença Aplicável. A licença concedida na Seção 3 acima está expressamente sujeita e limitada pelas seguintes restrições: a. seja individualmente ou. e. de acordo com o solicitado. desde que elas contenham os mesmos Elementos da Licença da presente Licença (p. Você pode Distribuir ou Executar Publicamente a Obra apenas sob os termos desta Licença. Os direitos acima podem ser exercidos em todas as mídias e formatos. por qualquer exercício Seu sobre os direitos concedidos sob esta Licença. remover da Obra Coletiva qualquer crédito. mas isto não requer que a Obra Coletiva. quando solicitado. Você deve respeitar os termos daquela licença. incluindo as Obras incorporadas em Obras Coletivas. ECAD.

a menos que um pedido relacionado à Seção 4(a) tenha sido feito. do Titular de Direitos Conexos. (ii) o título da Obra. de forma razoável em relação ao meio ou mídia por Você utilizado: (i) o nome do Autor Original (ou seu pseudônimo.0 quaisquer medidas tecnológicas 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 Licença Aplicável. ESPECIAIS. SEJAM ELAS EXPRESSAS OU IMPLÍCITAS. ORIUNDOS DESTA LICENÇA OU DO USO DA OBRA. se for o caso). Licenciante e/ou Partes de Atribuição. ao exercer Seus direitos sob esta Licença. (iv) em conformidade com a Seção 3(b). ADEQUAÇÃO PARA QUAISQUER PROPÓSITOS. DECORRENTES DA LEI OU QUAISQUER OUTRAS. Licença CC BY-SA 3. e. à parte da própria Obra Derivada. se fornecido. periódico) para atribuição (“Partes de Atribuição”) nas informações relativas aos direitos autorais do Licenciante. ACURACIDADE. (iii) na medida do razoável. Titular de Direitos Conexos. Você apenas poderá fazer uso do crédito exigido por esta Seção para o propósito de atribuição na forma estabelecida acima e. 6. na indicação de crédito feita aos autores participantes da Obra Derivada ou Obra Coletiva. ou "Roteiro baseado na Obra original do Autor Original/Titular de Direitos Conexos"). NÃO-VIOLAÇÃO DE DIREITOS.0 BR . mas não exige que a Obra Coletiva. Você não poderá implícita ou explicitamente afirmar ou sugerir qualquer vínculo. editora. o que for cabível. manter intactas todas as informações relativas a direitos autorais sobre a Obra e exibir. se o Autor Original/Titular de Direitos Conexos e/ou o Licenciante designar outra parte ou partes (p. PUNITIVOS OU EXEMPLARES. O LICENCIANTE OFERECE A OBRA “NO ESTADO EM QUE SE ENCONTRA” (AS IS) E NÃO PRESTA QUAISQUER GARANTIAS OU DECLARAÇÕES DE QUALQUER ESPÉCIE RELATIVAS À OBRA. sem a prévia e expressa autorização do Autor Original. Você deve. Declarações. garantias e exoneração EXCETO QUANDO FOR DE OUTRA FORMA MUTUAMENTE ACORDADO PELAS PARTES POR ESCRITO. o nome dessa parte ou partes. SEJAM ELES APARENTES OU OCULTOS. Se Você Distribuir ou Executar Publicamente a Obra ou qualquer Obra Derivada ou Obra Coletiva. QUAISQUER GARANTIAS SOBRE A TITULARIDADE DA OBRA.Apostila cedida pela Instruct e mantida pela Puppet-BR 8 . De modo a evitar dúvidas. Licenciante e/ou Partes de Atribuição. O crédito exigido por esta Seção 4(c). OU INEXISTÊNCIA DE QUAISQUER DEFEITOS LATENTES. se fornecido e quando aplicável. exceto se o URI não se referir ao aviso de direitos autorais ou à informação sobre o regime de licenciamento da Obra. se fornecido. EXCETO NA EXTENSÃO EXIGIDA PELA LEI APLICÁVEL. e/ou. EM NENHUMA CIRCUNSTÂNCIA O LICENCIANTE SERÁ RESPONSÁVEL PARA COM VOCÊ POR QUAISQUER DANOS. no caso de uma Obra Derivada ou Obra Coletiva. ex. termos de serviço ou por outros meios razoáveis. ex. c. ESTAS EXCLUSÕES PODEM NÃO SE APLICAR A VOCÊ. Limitação de responsabilidade. Titular de Direitos Conexos. SEM LIMITAÇÃO. o crédito apareça como parte dessa indicação. pode ser implementado de qualquer forma razoável. esteja sujeita aos termos da Licença Aplicável. por Você ou Seu uso da Obra. patrocínio ou apoio do Autor Original. INCIDENTAIS. MESMO QUE O LICENCIANTE TENHA SIDO AVISADO SOBRE A POSSIBILIDADE DE TAIS DANOS. se houver. d. entretanto. EM JURISDIÇÕES QUE NÃO ACEITEM A EXCLUSÃO DE GARANTIAS IMPLÍCITAS. INCLUINDO. o Identificador Uniformizado de Recursos (URI) que o Licenciante especificar para estar associado à Obra. Esta Seção 4(b) se aplica à Obra Derivada enquanto incorporada a uma Obra Coletiva. crédito identificando o uso da Obra na Obra Derivada (p.Apostila Puppet versão 2. CONSEQÜENCIAIS.: um instituto patrocinador.: "Tradução Francesa da Obra do Autor Original/Titular de Direitos Conexos". e de modo ao menos tão proeminente quanto os créditos para os outros autores participantes. direitos morais não são afetados por esta Licença. ainda. 5. desde que. Na extensão em que reconhecidos e considerados indisponíveis pela legislação aplicável. no caso de Obra Derivada. PRESENÇA OU AUSÊNCIA DE ERROS.

o Licenciante oferece ao destinatário uma licença da Obra nos mesmos termos e condições que a licença concedida a Você sob esta Licença. acordos ou declarações relativas à Obra que não estejam especificados aqui. Terminação a. entre o Licenciante e Você. entretanto. quaisquer destas ações não sirvam como meio de retratação desta Licença (ou de qualquer outra licença que tenha sido concedida sob os termos desta Licença. Outras disposições a. Pessoas físicas ou jurídicas que tenham recebido Obras Derivadas ou Obras Coletivas de Você sob esta Licença.Apostila cedida pela Instruct e mantida pela Puppet-BR 9 . a não ser que tal renúncia ou consentimento seja feito por escrito e assinado pela parte que será afetada por tal renúncia ou consentimento. Não há entendimentos. ou que deva ser concedida sob os termos desta Licença) e esta Licença continuará válida e eficaz a não ser que seja terminada de acordo com o disposto acima. Cada vez que Você Distribuir ou Executar Publicamente a Obra ou uma Obra Coletiva. sem a necessidade de qualquer ação adicional das partes deste acordo. Esta Licença representa o acordo integral entre as partes com respeito à Obra aqui licenciada. isto não afetará a validade ou a possibilidade de execução do restante dos termos desta Licença e. Esta Licença não pode ser modificada sem o mútuo acordo. no entanto. Se qualquer disposição desta Licença for tida como inválida ou não-executável sob a lei aplicável. d. por escrito. 6. Licença CC BY-SA 3. a licença aqui concedida é perpétua (pela duração do direito autoral aplicável à Obra). Cada vez que Você Distribuir ou Executar Publicamente uma Obra Derivada. Esta Licença e os direitos aqui concedidos terminarão automaticamente no caso de qualquer violação dos termos desta Licença por Você. o Licenciante reserva-se o direito de difundir a Obra sob termos diferentes de licença ou de cessar a distribuição da Obra a qualquer momento. c. 8. desde que. o Licenciante oferece ao destinatário uma licença à Obra original nos mesmos termos e condições que foram concedidos a Você sob esta Licença. 5. O Licenciante não será obrigado por nenhuma disposição adicional que possa aparecer em quaisquer comunicações provenientes de Você. Sujeito aos termos e condições dispostos acima. As Seções 1. e.0 BR . não terão suas licenças terminadas desde que tais pessoas físicas ou jurídicas permaneçam em total cumprimento com essas licenças. b. Não obstante o disposto acima. b.0 7. 2.Apostila Puppet versão 2. Nenhum termo ou disposição desta Licença será considerado renunciado e nenhuma violação será considerada consentida. 7 e 8 subsistirão a qualquer terminação desta Licença. tal disposição será reformada na mínima extensão necessária para tal disposição tornar-se válida e executável.

Possuímos os profissionais mais experientes do mercado. mas foi cedida em Jun/2016 para a comunidade Puppet-BR.com/InstructBR • https://facebook. licenciamento.com/puppet-br/apostila-puppet. como Miguel Di Ciurcio Filho e José Augusto (Guto) Carvalho.com/InstructBR Caso esteja procurando serviços profissionais relacionados a automação e Puppet. Versões mais novas e outras informações sobre essa apostila podem ser encontradas em: https://github. primeiros certificados Puppet Certified Professional (PCP) pela Puppet Labs na América Latina e também os únicos Puppet Certified Instructor. 247.0 BR .com/instructbr • https://twitter.com. Telefone: 61 3246-9299 2.com/puppet-br/apostila-puppet O código fonte e instruções de como compilar contribuir para com esta apostila estão publicados no GitHub: https://github.br • Escritório em Campinas/SP: Rua Joaquim Pinto de Moraes.Apostila cedida pela Instruct e mantida pela Puppet-BR 10 . treinamento e consultoria. Bl. entre em contato conosco: • Email: contato@instruct.1 Sobre a Apostila Esta apostila foi criada pela Instruct em 2014. Telefone: 19 2511-6506 • Estritório em Brasília/DF: SRCS 502. A empresa tem como especialidade soluções na área de automação de infraestrutura e gerenciamento de configuração e possui equipe capacitada e certificada. 27. Licença CC BY-SA 3. Saiba mais sobre Puppet e a Instruct com o conteúdo do nosso canal no YouTube e nas redes socias: • https://youtube. C.Apostila Puppet versão 2. Asa Sul. Lj. Sala 11.0 2 Sobre a Instruct A Instruct é a autoridade em automação e Puppet no Brasil e somos parceiros e representantes oficiais da Puppet Labs no Brasil para suporte.

As alterações necessárias na configuração de um grande parque de servidores.Apostila Puppet versão 2. 3.1 Os desafios no gerenciamento de infraestrutura e serviços A quantidade de servidores e serviços computacionais existentes nos mais variados setores de atividades têm crescido constantemente na última década. Administrar. consomem muito tempo e podem causar mais problemas do que solucioná-los. Ele sabe que. o SysAdmin é muito conservador quando analisa qualquer tipo de mudança no ambiente. Diante desse cenário. • Aversão a mudanças Por ter que garantir que tudo esteja sempre funcionando. gerenciamento de configuração é o processo de absorção controlada de mudanças. muitas vezes. sistemas e serviços estejam sempre disponíveis. Licença CC BY-SA 3.0 3 Introdução ao Gerenciamento de Configuração 3. são difíceis de manter e podem causar diversos problemas.1 O que é gerenciamento de configuração? Grande parte de problemas de disponibilidade em serviços de missão crítica na área de TI são causados por falhas humanas e gestão de processos. por menor que seja.0 BR . que não utilize scripts que apenas executam comandos sequencialmente. é fundamental utilizar uma ferramenta robusta. sem se basear em documentação que pode estar desatualizada ou. muitas vezes. Muitas organizações de TI utilizam processos manuais. E. Em grandes ambientes ou nos que possuem diversas equipes. A visão negativa do SysAdmin tem um certo fundamento. em caso de qualquer imprevisto. aplicação de patches e cumprimento de normas de segurança. Esses profissionais geralmente são sobrecarregados e estão sob constante pressão. padronizando a aplicação de configurações em infraestrutura de TI de uma forma automatizada e ágil. como: divergências entre a configuração de fato e a documentação.Apostila cedida pela Instruct e mantida pela Puppet-BR 11 . pois as organizações precisam que suas redes.1. pois existem algumas características nele que são muito comuns. esses métodos rudimentares não são escaláveis. Diante disso. garantir que dezenas. configurar. mesmo que manualmente. imagens de sistema e outras técnicas rudimentares para execução de tarefas repetitivas. incorreta. É importante também que essa ferramenta certifique-se da corretude da configuração do ambiente. sendo fundamental para o sucesso de diversos processos. alterações a princípio simples e inocentes podem causar sérias consequências. as alterações possam ser revertidas. atualizar e documentar esses crescentes ambientes computacionais torna-se cada vez mais desafiador. ou até mesmo centenas de sistemas estejam configurados corretamente torna-se cada vez mais inviável.2 Questões sobre a cultura estabelecida na administração de sistemas Diversos setores de Tecnologia da Informação têm uma visão relativamente negativa dos Administradores de Sistemas (''System Administrator'' ou simplesmente ''SysAdmin'') e profissionais que trabalham em atividades correlatas. sejam para melhorias ou para correção de problemas são maçantes. 3. Os mais precavidos não fazem nenhuma alteração antes de se montar um plano para que. Parte significativa desses problemas poderia ser evitada se fosse feita uma melhor coordenação na gerência de mudanças e de configuração. por isso. devido a erros operacionais e muitas vezes também a inviabilidade de revertê-los. e não há sinais de que vá diminuir. como provisionamento de novos sistemas. scripts customizados. não cumprimento de normas e perda de produtividade e agilidade.

Apostila Puppet versão 2. B e C.0 BR . configurações e planos. sobram críticas do tipo "Lógico que deu problema. • Validação da documentação. treinamento de usuários. infelizmente. N e O. As organizações fazem o que podem para solucionar esses problemas. Ciclano cuida das máquinas X. A questão é. Y e Z e Beltrano de M. Utilizando qualquer wiki. conseguir acesso a servidores que anteriormente ele não tinha é uma conquista.0 • Lentidão na entrega de novos serviços Por estar sempre sob pressão para garantir a disponibilidade e qualidade dos serviços que já estão na rede. E. geralmente as equipes não utilizam nenhum tipo de controle mais rígido no acesso e controle de alterações na configuração. alguém se lembrará de atualizar a documentação com as mudanças? Provavelmente não. Das diversas soluções que existem para documentação. Para muitos SysAdmins. ao longo do tempo a documentação apresentará diversas limitações. Mais por questões sociais do que técnicas. o próprio SysAdmin geralmente é extremamente cético sobre a eficácia dele documentar suas atividades. talvez a menos pior seja a equipe utilizar uma wiki. espaço alocado. Certamente. é muito comum encontrar rachas dentro da equipe do tipo: Fulano cuida das máquinas A. As empresas. mesmo utilizando a wiki. PHP e PostgreSQL. Como testar se todos os comandos e arquivos registrados na wiki estão corretos? Provavelmente não houve má fé do SysAdmin quando ele registrou o como se chegou ao estado de um servidor com Apache. ao longo do dia-a-dia da área de TI.Apostila cedida pela Instruct e mantida pela Puppet-BR 12 . O que um gerente deve fazer? Ordenar que outro SysAdmin valide tudo o que o colega fez? Não é nada divertido de se fazer. cobram do SysAdmin uma extensa carga de atividades extras na entrega de um novo serviço. • Permissões de acesso são vistas como troféu Nada como ter plenos poderes. Afinal. Muitos acreditam que o principal método para solucionar essas questões é a criação de uma boa documentação sobre o ambiente. quando feitas. de graça vem o versionamento e mecanismo de busca. • A documentação ficará desatualizada. mas basta que apenas um dos passos seja deixado de lado para que ninguém mais consiga repetir com sucesso a instalação e configuração. operadores e etc. • Compartilhamento de informações é tabu Em organizações onde existe mais de um SysAdmin. essas perguntas são difíceis de serem respondidas: • Quando foi configurado? • Quem configurou? • Mudou por quê? • Quem mandou? Licença CC BY-SA 3. É natural que. mas muitas vezes é um mal necessário. olha como ele fez!" ou "Onde está a documentação disso?" e. emergências surjam e sejam necessárias intervenções imediatas no ambiente. muitas vezes por questões de certificação com padrões de qualidade. Dentro do ambiente de servidores. muitos encaram isso como a derrota do colega que anteriormente tinha acesso exclusivo a um determinado servidor e agora perdeu esse "privilégio". novos serviços ou a atualização dos já em funcionamento geralmente não são prioridade. Ajustes como limites de conexões. mas não é uma tarefa fácil. depois da emergência. Porém. E nenhum deles se ajuda ou sabe claramente o quê ou como o outro configurou. ainda por cima. pior ainda. quando Fulano precisa intervir nas máquinas de Ciclano. "A documentação dele está toda errada!". etc. Porém. como documentação.

para o SysAdmin é a solução: shell script. É comum copiar arquivos de configuração de uma máquina "que funciona" para uma máquina nova. O ciclo vicioso de necessidade constante de manutenção e documentação leva um imenso gasto de tempo que deveria ser dedicado a atividades mais nobres e estimulantes para o trabalho. Mas isso tem um preço. Longos scripts com comandos encadeados e conectados com pipes e saídas filtradas com expressões regulares. é necessário evoluir. apenas com o uso desses mecanismos. scripts sempre são: • Protegidos quanto à concorrência? Você está checando se tem acesso exclusivo à máquina ou aos arquivos e diretórios que está manipulando? • Testáveis? É possível simular a execução de um script? • Reversíveis? Os comandos dados pelo script podem ser revertidos naturalmente? • Legíveis? Não existem convenções para estilo. que resultam na entrada de outro comando que ordena e depois corta e recorta a saída final. até as dos mais experientes. como garantir que tudo estará configurado corretamente semana que vem? O resultado disso tudo é que. em diferentes níveis de prioridade? • Portáveis? O mesmo script funciona em todos os sistemas do seu ambiente? (Você tem muita sorte se todos os seus sistemas são idênticos) Diante de todos esses problemas. • Geram bons logs? É possível saber o que está acontecendo. Sejamos honestos. máquinas e etc. quanto mais aplicações.0 BR .3 Limitações das soluções comuns de automação É aceito de praxe pelo mercado que um bom SysAdmin é aquele que faz suas próprias ferramentas e automatiza ao máximo seu trabalho. alterações incorretas em configurações que estavam funcionando são piores do que deixar de configurar. 3. manter documentação consistente ao longo do tempo requer um grande esforço e disciplina.Apostila Puppet versão 2. É comum SysAdmins que descartam todos os scripts de um antecessor na empresa. Por outro lado. O que para muitos é magia negra. têm certos limites de viabilidade em ambientes mais complexos ou com equipes multidisciplinares. maior é o risco de problemas. Shell Script é excelente para atividades repetitivas e cotidianas. mas os reflexos dessa burocracia no SysAdmin fazem com que ele se torne menos motivado. as práticas da maioria dos SysAdmins. sistemas. serviços. principalmente para quem não é o autor. pois é mais fácil fazer um novo do que tentar entender o que já existe.0 Uma ferramenta de sistema de chamados combinada com muita disciplina da equipe podem ajudar na resposta dessas perguntas. Licença CC BY-SA 3. sem dúvida. Além do mais. nos desprendemos de diversas amarras das linguagens de programação. precisamos quebrar paradigmas.Apostila cedida pela Instruct e mantida pela Puppet-BR 13 . quando estamos desenvolvendo um Shell Script. ainda por cima. tornando o sucesso do trabalho do SysAdmin muito improvável. E. fazer SSH em um laço com uma lista de IPs ou nomes de máquinas também é comum. mas bom apenas para soluções ad-hoc e pontuais. E. já que antes funcionava. Muitas vezes. Além disso. Para isso. É de difícil leitura. quando são necessárias alterações em muitas máquinas.

O Puppet tem uma abordagem diferente: cada sistema recebe um catálogo de resources (recursos) e relacionamentos. como Subversion ou Git. • Possui grande biblioteca com funcionalidades prontas para uso.Apostila Puppet versão 2.0 4 O que é o Puppet Puppet é uma ferramenta e plataforma Open Source para automação e gerenciamento de configuração de servidores e infraestrutura. O trabalho do SysAdmin é escrito como código na linguagem do Puppet. Essa configuração "compilada" é chamada de catálogo. Os clientes (chamados de nó. • Extensível via módulos e plugins. como vistas no capítulo anterior.0. • Utiliza uma arquitetura cliente/servidor para a distribuição da configuração para clientes. 3. a configuração do ambiente codificada na linguagem do Puppet está armazenada em um sistema de controle de versão. a gestão das configurações de um grande conjunto de computadores é feita de práticas imperativas e comandos sequenciais. que é copilada e enviada pelo master. 5. • Acompanhar o histórico de um sistema através de seu ciclo de vida. Licença CC BY-SA 3. O agente aplica o catálogo no node. 2. O ciclo de operação nesses casos é o seguinte: 1.1 Como o Puppet funciona? O Puppet é geralmente (mas nem sempre) usado como cliente/servidor. por padrão). compara com o estado atual do sistema e faz as alterações necessárias para colocar o sistema em conformidade com o catálogo.0 BR . com apenas algumas linhas de código. simplesmente executando comandos via SSH em um loop. que é compartilhável tal como qualquer outro código e é possível escrever avançados aplicativos de automação de maneira simples. Outra maneira comum de implantação do Puppet é a ausência de um agente em execução nos nodes. ou node) possuem um agente instalado que permanece em execução e se conecta a um servidor central (chamado tipicamente de master) periodicamente (a cada 30 minutos.Apostila cedida pela Instruct e mantida pela Puppet-BR 14 . O node solicita a sua configuração. • Provar que um código refatorado ainda produz o mesmo estado do sistema. Tradicionalmente. que possuem um agente que sempre valida e corrige quaisquer problemas encontrados. havendo divergências ou não. Os benefícios dessa metodologia vão além de apenas resolver questões de divergência de configuração de máquinas: modelar sistemas como dados permite ao Puppet: • Simular mudanças de configuração. Foi desenvolvido para ajudar a comunidade SysAdmin na construção e compartilhamento de ferramentas maduras e que evitem a duplicação de esforços na solução de problemas repetidos. Essa abordagem simples de executar comandos sequencialmente melhorou ao longo do tempo. O resultado da aplicação do catálogo é reportado ao master. tornando seu trabalho mais ágil. O Puppet é distribuído sob a Licença Apache 2. permite adicionar funcionalidades sob demanda e compartilhar suas soluções com outros SysAdmins. mas ainda carrega fundamentais limitações. fornecendo uma plataforma poderosa para simplificar as tarefas executadas por SysAdmins. 4. A aquisição e aplicação do catálogo é agendada na crontab ou é disparada via Mcollective. Geralmente. ou seja. 4. • É composto de uma linguagem de configuração declarativa utilizada para expressar a configuração do sistema.

Nomes. usar XML ou YAML limitaria qualquer garantia de que a interface fosse declarativa. 4. ou seja. como XML ou YAML? Ou ainda. 4. que devolvem ao master um relatório sobre o que foi feito. 4. não são boas interfaces para humanos. 3. Licença CC BY-SA 3. sem operação). seguindo essas etapas: 1. como um tradicional banco de dados onde alterações podem ser revertidas.1 Linguagem de configuração O fato de possuir uma linguagem própria de configuração é um dos maiores diferenciais do Puppet em relação a outras soluções. sendo cada uma responsável por uma parte do sistema como um todo. pois um processo poderia tratar uma configuração XML diferentemente de outro. Reportar os resultados para o master. por que não usar algum formato de arquivo ou dados já existente. O Puppet vai alterar somente o que está em divergência com o declarado.1. controle de serviços e outras tantas diferenças que existem. Aplicar a configuração no node. Para cada resource. Isso permite ao Puppet decidir a melhor ordem para aplicação da configuração com base em relacionamentos criados pelo SysAdmin. Isso não faz o Puppet ser totalmente transacional. Porém. Os resourses são compilados no que chamamos de catálogo. Uma das consequências do modo de operação do Puppet é a idempotência. por exemplo.1. XML e YAML. que é enviado aos nodes e aplicado pelos agentes. Para isso.0 BR . as configurações podem ser aplicadas repetidas vezes de maneira segura. sendo formatos desenvolvidos para intercâmbio de dados e para facilitar o processamento por computadores.0 As funcionalidades do Puppet são separadas basicamente em três camadas. onde é possível testar a execução de sua configuração sem realmente aplicá-la. existe um provider (provedor). é possível modelar sua configuração com um modo "noop" (no operation. é criado um grafo que contém todos os resources e suas relações uns com os outros. por que não usar Ruby como linguagem.Apostila cedida pela Instruct e mantida pela Puppet-BR 15 .2 Camada de transação A camada de transação é o motor do Puppet. já que o Puppet é desenvolvido em Ruby? A linguagem declarativa de configuração do Puppet é como se fosse a interface com um humano. Enviar ao agente a configuração compilada. Além disso. mas há uma razão por que usamos os navegadores ao invés de apenas ler documentos HTML diretamente.3 Camada de abstração de recursos A Resource Abstraction Layer (RAL) do Puppet é o que garante a simplificação das dores de cabeça de um SysAdmin por ter que lidar com diversos sistemas operacionais diferentes. Nela é realizada a configuração de cada node. vai depender do que está sendo procurado. formatos de arquivos. O Puppet analisa a sua configuração e calcula como aplicá-la no agente. Uma vez que você declara que quer o pacote sudo instalado. não será mais necessário se preocupar se a plataforma utiliza apt ou yum. 4. Afinal. Esse questionamento é natural. argumentos e localização de comandos. O provider é responsável pelo "como" fazer para gerenciar um resource. e muitas vezes não fazem sentido. são abstraídas na linguagem de configuração do Puppet. a instalação de pacotes. Algumas pessoas podem ter facilidade para ler e escrever nesses formatos. Isso pode ser ao mesmo tempo um ponto forte ou um ponto fraco. Interpretar e compilar a configuração 2.Apostila Puppet versão 2.1.

A própria Puppet Labs não recomenda a instalação a partir do código fonte.com/puppetlabs-release-pc1-jessie.1 Debian e Ubuntu 1. mas as versões empacotadas e a qualidade desses pacotes variam muito.com/product/faq Aviso Instalação a partir do código fonte O Puppet é um projeto grande e complexo que possui muitas dependências. É muito mais confiável e conveniente utilizar pacotes já homologados e testados. 5. Os pacotes oficiais são extensivamente testatos e extremamente confiáveis. visite as páginas abaixo: • https://puppet. Existem duas versões do Puppet distribuídas pela PuppetLabs: Puppet Open Source e o Puppet Enterprise.puppetlabs. Dica Turbinando o Vim Utilize os plugins disponíveis em https://github.deb apt-get update Licença CC BY-SA 3. O Puppet Enterprise é distribuído gratuitamente para o gerenciamento de até 10 nodes. e instalá-lo a partir do código fonte não é recomendado.com/product/puppet-enterprise-and-open-source-puppet • https://puppet.Apostila Puppet versão 2.0 BR . possui suporte oficial e vem acompanhado de uma versátil interface web para administração.deb dpkg -i puppetlabs-release-pc1-jessie.Apostila cedida pela Instruct e mantida pela Puppet-BR 16 . portanto a melhor maneira de instalá-lo é utilizando os pacotes oficiais da PuppetLabs. Para uma comparação mais detalhada sobre as diferenças entre a versão Open Source e a Enterprise.com/rodjek/vim-puppet para facilitar a edição de código no Vim. Adicione o repositório da Puppet Labs: • Debian 8 (Jessie) # # # # cd /tmp wget http://apt.0 5 Instalação Diversas distribuições empacotam o Puppet.

puppetlabs.com/puppetlabs-release-pc1-trusty.puppetlabs.rpm • CentOS/Red Hat 7 # yum install -y http://yum.puppetlabs.bashrc # export PATH=/opt/puppetlabs/bin:$PATH 5.bashrc # echo "export PATH" >> /etc/bash.04 LTS (Xenial) # # # # cd /tmp wget http://apt.Apostila Puppet versão 2. Adicione o repositório da Puppet Labs: • CentOS/Red Hat 6 # yum install -y https://yum. Instale o pacote puppet-agent: # apt-get -y install puppet-agent 3. 2.deb apt-get update Você também pode acessar a página http://apt. 2.com e localizar o pacote adequado de outras versões e distribuições da família Red Hat.rpm Você também pode acessar a página http://yum. Torne os comandos do pacote puppet-agent disponíveis no path do sistema: # echo "PATH=/opt/puppetlabs/bin:$PATH" >> /etc/bash.deb dpkg -i puppetlabs-release-pc1-xenial.2 CentOS e Red Hat 1.puppetlabs.0 • Ubuntu 14.com e localizar o pacote adequado para outras versões do Debian ou Ubuntu.com/puppetlabs-release-pc1-xenial.04 LTS (Trusty) # # # # cd /tmp wget http://apt.com/puppetlabs-release-pc1-el-6.deb apt-get update • Ubuntu 16.puppetlabs.noarch.deb dpkg -i puppetlabs-release-pc1-trusty.com/puppetlabs-release-pc1-el-7.Apostila cedida pela Instruct e mantida pela Puppet-BR 17 . Instale o pacote puppet-agent: # yum -y install puppet-agent Licença CC BY-SA 3.0 BR .puppetlabs.noarch.

0 3.Apostila cedida pela Instruct e mantida pela Puppet-BR 18 . Torne os comandos do pacote puppet-agent disponíveis no path do sistema: # echo "PATH=/opt/puppetlabs/bin:$PATH" >> /etc/bashrc # echo "export PATH" >> /etc/bashrc # export PATH=/opt/puppetlabs/bin:$PATH 4.Apostila Puppet versão 2.0 BR . Obtenha a versão do puppet-agent # puppet --version Licença CC BY-SA 3.

usuários. 6. Vamos manipular um pouco o RAL antes de escrevermos código. temos que pensar em ordens como "o pacote X deve estar instalado". "o serviço Z deve estar parado e desativado". visualizando a configuração na linguagem do Puppet. shell => '/bin/false'. e unindo os atributos que sempre estão presentes possibilita a criação de resource types (tipos de recursos). gid => '108'. grupos.Apostila cedida pela Instruct e mantida pela Puppet-BR 19 .Apostila Puppet versão 2. O RAL divide resources em tipos (alto nível) e providers (provedores. arquivos. Essa combinação de resources. gid => '34'. etc) de maneira independente de sistema operacional. home => '/var/run/avahi-daemon'. pacotes. processos e serviços em execução.0 BR . um arquivo tem um caminho e um dono.1. Os resources têm certas similaridades entre si.. } user { 'backup': ensure => 'present'. comment => 'backup'.0 6 Resource Abstraction Layer (RAL) O que existe em um sistema operacional? Arquivos. Essas características chamamos de atributos. independentemente de como as implementações venham a diferir. resource types e atributos formam o Resource Abstraction Layer (RAL) do Puppet.1 Manipulando resources via RAL O comando puppet resource permite consultar e manipular o sistema operacional via RAL. programas. ou ainda. comment => 'Avahi mDNS daemon. e isso nos permite manipular resources (pacotes. isso são resources (recursos). Os atributos mais importantes de um resource type geralmente são conceitualmente idênticos em todos os sistemas operacionais. etc.. # puppet resource user user { 'avahi': ensure => 'present'. A descrição de um resource pode ser separada de como ela é implementada. implementações específicas de cada plataforma). Para o Puppet. Dica Ordens ao invés de passos Através do RAL dizemos somente o que queremos e não precisamos nos preocupar no como será feito. Portanto. home => '/var/backups'.'.1 Gerenciando usuários O primeiro argumento que deve ser passado é o resource type que será consultado. uid => '105'. Licença CC BY-SA 3. Por exemplo. contas de usuários. todo usuário possui um grupo e um número identificador. 6.

com atributos como UID. gid => '0'.. home => '/root'. home => '/home/joe'. para criarmos um usuário usamos comandos como useradd adduser. e é funcional. } Verifique se o usuario jor foi criado. } Esse código gerado pode ser utilizado depois. Licença CC BY-SA 3. A saída mostra todos os usuários. É possível passarmos alguns atributos para o puppet resource. Nós podemos ser mais específicos e consultar apenas um resource: # puppet resource user root user { 'root': ensure => 'present'.0 shell uid => '/bin/sh'. shell => '/bin/bash'.Apostila cedida pela Instruct e mantida pela Puppet-BR 20 . GID e shell já formatados na linguagem do Puppet que estejam presentes no sistema operacional.Apostila Puppet versão 2. Tradicionalmente.0 BR . fazendo com que ele altere o estado de um recurso no sistema. Podemos usar somente argumentos. } . => '34'. # id joe uid=500(joe) gid=500(joe) groups=500(joe) Repare que a linha de comando não necessariamente lê código Puppet. comment => 'root'. Ao invés de usar um desses comandos. vamos usar o Puppet: ou o interativo # puppet resource user joe ensure=present home="/home/joe" managehome=true Notice: /User[joe]/ensure: created user { 'joe': ensure => 'present'.. uid => '0'.

Além disso.1. podemos também manipular a instalação de software via RAL do Puppet.3 Gerenciando pacotes Além de usuários e serviços. O comando acima listou todos os serviços da máquina e seus estados. # puppet resource service service { 'acpid': ensure => 'running'. ao invés de utilizarmos os tradicionais comandos update-rc. } # service iptables status iptables is stopped Inciando um serviço que estava parado: # service saslauthd status saslauthd is stopped # puppet resource service saslauthd ensure=running Notice: /Service[saslauthd]/ensure: ensure changed 'stopped' to 'running' service { 'saslauthd': ensure => 'running'.0 BR .. Licença CC BY-SA 3. Parando um serviço que está em execução: # puppet resource service iptables ensure=stopped Notice: /Service[iptables]/ensure: ensure changed 'running' to 'stopped' service { 'iptables': ensure => 'stopped'.d no Debian/Ubuntu ou chkconfig no CentOSRed Hat.Apostila Puppet versão 2. } service { 'auditd': ensure => 'running'. 6.Apostila cedida pela Instruct e mantida pela Puppet-BR 21 . enable => 'true'.0 6. Podemos manipular os serviços via Puppet.1.. } .. enable => 'true'.. } # service saslauthd status iptables (pid 2731) is running. } service { 'crond': ensure => 'running'. enable => 'true'. Outro resource type muito útil é o service. também podemos parar e iniciar serviços.2 Gerenciando serviços Vamos continuar explorando mais resources.

el6_2. podemos fazer a instalação. Use dpkg --info (= dpkg-deb --info) to examine archive files. Vamos executar puppet resource package aide ensure=installed em ambos os sistemas. tanto no Debian quanto no CentOS.0 Com um mesmo comando. Os principais são: • file • package • service • user • group • cron • exec Podemos dizer também que esses tipos nos fornecem primitivas. do aide. com as quais podemos criar soluções de configuração completas e robustas. Licença CC BY-SA 3.Apostila Puppet versão 2.git20130520-3'.2'.1. and dpkg --contents (= dpkg-deb --contents) to list their contents. pois todos são distribuídos por padrão com o Puppet e estão disponíveis em qualquer instalação. Mais resource types podem ser adicionados usando módulos. } # dpkg -s aide 6. por exemplo.4 Principais Resource Types O Puppet possui uma série de resource types prontos para uso. • No CentOS: # rpm -qi aide package aide is not installed # puppet resource package aide ensure=installed Notice: /Package[aide]/ensure: created package { 'aide': ensure => '0. também chamados de core resource types. # puppet resource package aide ensure=installed Notice: /Package[aide]/ensure: created package { 'aide': ensure => '0.Apostila cedida pela Instruct e mantida pela Puppet-BR 22 .14-3.16~a2.0 BR . } # rpm -qi aide • No Debian: # dpkg -s aide Package `aide' is not installed and no info is available.

comment. attributes. Porém. auth_membership. windows_adsi Pronto. It does not directly modify `/etc/passwd` or anything.0 BR . groups. o próprio comando puppet nos fornece documentação completa. openbsd. password_min_age. **Autorequires:** If Puppet is managing the user's primary group (as provided in the `gid` attribute). key_membership. Dica Documentação completa O argumento -s mostra uma versão resumida da documentação. system. so it is lacking some features useful for managing normal users. Licença CC BY-SA 3. loginclass. pw. hpuxuseradd. ia_load_module. roles. iterations.Apostila Puppet versão 2. home. membership. user_role_add. Use o comando puppet describe sem o -s para ter acesso à documentação completa do resource type. profiles. salt. This type is mostly built to manage system users. # puppet describe -s user user ==== Manage users. service e package. project. the user resource will autorequire that group. agora temos uma lista de parâmetros sobre o tipo user. the user resource will autorequire those role accounts. password_max_age. useradd.5 Atributos de Resource Types Até agora vimos atributos básicos dos tipos user.0 6. role_membership. name. keys. attribute_membership. shell. Para sabermos os atributos de um tipo. forcelocal. If Puppet is managing any role accounts corresponding to the user's roles. profile_membership. This resource type uses the prescribed native tools for creating groups and generally uses POSIX APIs for retrieving information about them. Parameters ---------allowdupe. auths. ensure. ldap. gid. managehome. esses recursos possuem muito mais atributos do que vimos até agora. directoryservice. uid Providers --------aix. expiry.Apostila cedida pela Instruct e mantida pela Puppet-BR 23 . purge_ssh_keys. password.1.

Apostila Puppet versão 2. '1004'. Vamos acrescentar o seguinte código: user { 'joe': ensure gid groups home password password_max_age password_min_age shell uid } => => => => => => => => => 'present'. Com ele. 'bin'] Notice: Applied catalog in 0. '1004'. # puppet resource user joe ensure=absent Licença CC BY-SA 3. #<-. 3. '99999'. Vamos colocar o usuário joe aos grupos adm e bin.Apostila cedida pela Instruct e mantida pela Puppet-BR 24 . Basta sair do vim.2 Prática: Modificando recursos interativamente Além de podermos manipular recursos em nosso sistema pelo comando puppet resource. '/bin/bash'.essa linha é nova! 4. '0'. '/home/joe'. '!'. ['bin'. Vamos fazer isso no estilo Puppet! 1. 'adm']. O Puppet abrirá o vim com o seguinte código: user { 'joe': ensure gid home password password_max_age password_min_age shell uid } => => => => => => => => 'present'. Remova o usuário joe com o comando a seguir.07 seconds 5.0 BR . '1004'. '1004'. Execute o seguinte comando: # puppet resource user joe --edit 2. '/bin/bash'. Teremos uma saída parecida com essa: Info: Applying configuration version '1447253347' Notice: /Stage[main]/Main/User[joe]/groups: groups changed '' to ['adm'. podemos ter um contato direto com a linguagem do Puppet para manipular recursos. '99999'. ao invés de usarmos apenas a linha de comando. Normalmente faríamos isso usando o comando usermod ou editando manualmente o arquivo /etc/group. para que o Puppet aplique a nova configuração. '/home/joe'.0 6. salvando o arquivo. '!'. '0'. ele fornece um parâmetro interessante: --edit.

txt.txt' path='/bin:/usr/bin' Licença CC BY-SA 3. # puppet resource file /tmp/teste.txt ensure=file content='isso eh um teste' 11.0 6. # puppet resource exec 'ping -c3 google. # puppet resource service ssh 10.Apostila cedida pela Instruct e mantida pela Puppet-BR 25 .com > /tmp/ping. Instale a última versão do nmap. # puppet resource file /home/joe ensure=absent force=true 7.Apostila Puppet versão 2.0 BR . Remova o diretório /home/joe com o comando a seguir. # puppet resource package nmap ensure=latest 8.com e direcione a saída do comando para um arquivo /tmp/ping. Execute um comando de ping para o Google. Verifique o status do serviço ssh. Crie o grupo de usuário teste. # puppet resource group teste ensure=present 9. Crie o arquivo /tmp/teste com o conteúdo "isso é um teste".

devemos estar logados como root. ensure => present.0 BR . Mas o principal é garantir que resources sejam declarados e gerenciados de maneira correta. tenha cuidado. gerar texto com funções.05 seconds # cat /tmp/teste. Nos manifests também podemos ter condições. agrupar resources. 1. 7. temos: • O título do recurso seguido de dois pontos. file.0 7 Manifests As declarações de configuração são chamadas de manifests (manifestos) e são salvas em arquivos com a extensão .pp. Com o manifest criado. seguido por um par de colchetes que englobam todo o restante das informações sobre o resource. content => "Conteudo de teste!\n". } 2.pp file { 'teste': path => '/tmp/teste.txt'.Apostila Puppet versão 2. algumas regras são fundamentais sobre a sintaxe: • Esquecer de separar atributos usando a vírgula é um erro muito comum.1 root root 19 Nov 11 13:21 /tmp/teste. mode => '0640'.pp Notice: /Stage[main]/Main/File[teste]/ensure: \ defined content as '{md5}14c8346a185a9b0dd3f44c22248340f7' Notice: Applied catalog in 0. Vamos criar nosso primeiro resource. vamos colocar nosso código em /root/manifests. nesse caso. representando um estado desejado. Para melhor organização. Além disso. • Dentro dos colchetes. Vários valores devem ser separados por vírgula. Licença CC BY-SA 3.1 Declarando resources Para manipular diversos aspectos de nosso sistema. nesse caso. utilizar e referenciar código em outros manifests e muitas outras coisas.Apostila cedida pela Instruct e mantida pela Puppet-BR 26 . A principal utilidade da linguagem do Puppet é a declaração de resources.txt • Temos um resource type. um arquivo: # mkdir /root/manifests # vim /root/manifests/arquivo-1.txt -rw-r----. • E uma sequência de atributo => valor que serve para descrever como deve ser o recurso. é hora de aplicá-lo ao sistema: # puppet apply /root/manifests/arquivo-1. O último par atributo => valor pode ser seguido de vírgula também.txt Conteudo de teste! # ls -l /tmp/teste.

content => "Ola!\n".0 BR . significa outra coisa que veremos mais adiante.Apostila Puppet versão 2. mode => '0644'. } file { '/tmp/teste3. Para simularmos as alterações puppet apply --noop arquivo.. que serão ou não feitas.txt'. Primeiramente podemos validar se existe algum erro de sintaxe.pp. apenas strings. • Aspas duplas servem para interpolar variáveis e podem incluir um \n (nova linha). não precisam estar entre aspas. target => '/tmp/teste1.. como present. Dica Teste antes de executar O Puppet fornece algumas funcionalidades que nos permitem testar o código antes de executá-lo. usando o comando puppet parser validate arquivo.txt': ensure => link. • Colocar aspas nos valores faz diferença! Valores e palavras reservadas da linguagem. } file { '/tmp/teste2': ensure => directory. de recursos.0 • Letras maiúsculas e minúsculas fazem diferença! Na declaração File {'teste':. • Aspas simples são para valores literais e o único escape é para a própria aspa (') e a barra invertida (\).pp file { '/tmp/teste1.Apostila cedida pela Instruct e mantida pela Puppet-BR 27 .pp. usamos Mais exemplos: # vim /root/manifests/arquivo-2. O comando puppet parser validate apenas verifica se o manifest está correto. } notify {"Gerando uma notificação!":} notify {"Outra notificação":} Licença CC BY-SA 3.txt': ensure => present.

Licença CC BY-SA 3. em vários casos.". e ainda assim tudo funcionou. Esse valor é sempre utilizado em um atributo que deve ser capaz de dar uma identidade ao recurso. Em muitos outros casos. que deve sempre ser único. Quase todos os resourse types possuem algum atributo que assume como valor padrão o título de resource.txt]/ensure: \ defined content as '{md5}50c32e08ab3f0df064af1a8c98d1b6ce' Notice: /Stage[main]/Main/File[/tmp/teste2]/ensure: created Notice: /Stage[main]/Main/File[/tmp/teste3. também não vai permitir que recursos diferentes tenham o mesmo valor de namevar.txt /tmp/teste2: total 8 drwxr-xr-x 2 root root 4096 Nov 11 13:28 .1 root root 5 Nov 11 13:28 /tmp/teste1.Apostila cedida pela Instruct e mantida pela Puppet-BR 28 .Apostila Puppet versão 2. drwxrwxrwt 8 root root 4096 Nov 11 13:28 . Para o resource file.pp Notice: /Stage[main]/Main/File[/tmp/teste1.1 root root lrwxrwxrwx 1 root root -rw-r----. é simplesmente o atributo name. No jargão do Puppet.0 BR . Utilizar o valor do título do resource é conveniente. finalmente.05 seconds # ls -la /tmp/teste* -rw-r--r-.txt -> /tmp/teste1. Para o recurso notify.txt Ola! Repare que deixamos de fora alguns atributos.0 E. vamos aplicar: # puppet apply /root/manifests/arquivo-2.txt 19 Nov 11 13:21 /tmp/teste. } Não é possível declarar o mesmo resource mais de uma vez. O Puppet não permite que resources com o mesmo título sejam criados e.txt 15 Nov 11 13:28 /tmp/teste3.. notify {'grandenotificacao': message => "Essa é uma grande notificação! Ela é tão grande que é melhor utilizar um nome pequeno como título do resource.txt]/ensure: created Notice: Gerando uma notificação! Notice: /Stage[main]/Main/Notify[Gerando uma notificação!]/message: \ defined 'message' as 'Gerando uma notificação!' Notice: Outra notificação Notice: /Stage[main]/Main/Notify[Outra notificação]/message: \ defined 'message' as 'Outra notificação' Notice: Applied catalog in 0. o atributo que recebe como valor padrão o título de um recurso é chamado de namevar. é o atributo path. Isso é prático principalmente se o nome de um recurso é longo. como user. como path. é message. package e outros. mas algumas vezes pode ser desajeitado. group. Em certas ocasiões é melhor dar um título curto que simbolize e identifique o resource e atribuir um valor diretamente ao namevar como um atributo. # cat /tmp/teste3.

0 BR .99'. resource ["File". o ls -lah mostrou o comum 0755. } file {'outroarquivo': path => '/tmp/arquivo. file. A ideia é que se possa gerenciar recursivamente arquivos em diretórios com permissão 0644 sem tornar os arquivos executáveis.pp Error: Evaluation Error: Error while evaluating a Resource Statement.Apostila cedida pela Instruct e mantida pela Puppet-BR 29 . Isso acontece porque o Puppet ativa o bit de leitura e acesso de diretórios. directory e link.1. ensure => present. ensure => present.txt"] \ already declared at /root/manifests/conflito.pp:6:3 7.pp file {'arquivo': path => '/tmp/arquivo. ip => '192. Para saber mais. } 2. : # puppet describe file 7.pp e aplique-o usando o comando puppet apply. host_aliases => ['teste']. leia a referência do tipo file.0 # vim /root/manifests/conflito. Crie um usuário chamado elvis com shell padrão /bin/sh e grupo adm: user {'elvis': shell => '/bin/sh'.pp:1 at /root/manifests/conflito. "/tmp/arquivo. absent.2 Prática: conhecendo os resources Salve o conteúdo de cada exercício em um arquivo .1 Observações sobre o resource file Nós declaramos que /tmp/teste2/ teria permissões 0644.Apostila Puppet versão 2. managehome => true. gid => 'adm'.txt"] at \ /root/manifests/conflito. porém. \ Cannot alias File[outroarquivo] to ["/tmp/arquivo.56.168.txt'. O tipo file tem diversos valores para o atributo ensure: present. Crie uma entrada no arquivo /etc/hosts: host { 'teste.txt'. pois isso é geralmente o que queremos.puppet': ensure => 'present'. } # puppet apply /root/manifests/conflito. 1.pp:6. } Licença CC BY-SA 3.

} 4. Crie um grupo chamado super: group {'super': gid => 777. force => true. } Licença CC BY-SA 3. ensure => absent.0 3. ensure => absent.0 BR .Apostila cedida pela Instruct e mantida pela Puppet-BR 30 . } group{ 'remove_group': name => super.Apostila Puppet versão 2. ensure => absent. Desfaça as alterações anteriores: file{ 'remove_dir': path => '/home/elvis'. } user{ 'remove_user': name => elvis.

0 8 Ordenação Agora que entendemos os manifests e a declaração de recursos. Alguns recursos dependem de outros recursos. vamos aprender sobre meta-parâmetros e ordenação de recursos. Meta-parâmetros não influenciam no estado final de um resource. que criou um arquivo. a ordem da escrita de recursos em um manifest não implica na mesma ordem lógica para a aplicação. chamado meta-parâmetros. } file { '/tmp/teste3. Voltemos ao manifest /root/manifests/arquivo-2. ficando assim: Tipo['titulo']. apenas descrevem como o Puppet deve agir. Então. require. Nós temos quatro meta-parâmetros que nos permitem impor ordem aos resources: before. que pode ser utilizado em qualquer resource.0 BR . target => '/tmp/teste1.txt': ensure => link. Ao contrário de uma linguagem procedural.': require => File['/tmp/teste1. Todos eles aceitam um resource reference (referência a um recurso). o Puppet pode aplicá-las em qualquer ordem.Apostila cedida pela Instruct e mantida pela Puppet-BR 31 . Licença CC BY-SA 3.txt'. mode => '0644'. } notify {"Gerando uma notificação!":} notify {"Outra notificação":} Embora as declarações estejam escritas uma após a outra. como dizer ao Puppet qual deve vir primeiro? 8. mas existe outro conjunto de atributos. } notify { '/tmp/teste1.txt': ensure => present. content => "Ola!\n". notify e subscribe. content => "Ola!\n". } file { '/tmp/teste2': ensure => directory.1 Meta-parâmetros e referência a recursos file { '/tmp/teste1.txt': ensure => present.Apostila Puppet versão 2.txt'].pp. } Cada resource type tem o seu próprio conjunto de atributos. um diretório e um link simbólico: file { '/tmp/teste1.txt foi sincronizado.

txt': ensure => present.1 Meta-parâmetros before e require before e require criam um simples relacionamento entre resources.Apostila cedida pela Instruct e mantida pela Puppet-BR 32 .txt'].txt foi criado!'.txt foi criado!'. } notify {'mensagem': message => 'O arquivo teste1.txt ser criado acontece a notificação. recarregados). listando quais resources dependem dele.txt': ensure => present. file { '/tmp/teste1. message => 'O arquivo teste1.Apostila Puppet versão 2.0 Nota Maiúsculo ou minúsculo? Lembre-se: usamos caixa baixa quando estamos declarando novos resources. content => "Ola!\n". Esses dois meta-parâmetros são apenas duas maneiras diferentes de escrever a mesma relação. listando de quais resources ele depende. } 8.1. O mesmo comportamento pode ser obtido usando o meta-parâmetro require: file { '/tmp/teste1. usamos letra maiúscula na primeira letra do seu tipo. require é usado no resource posterior.1. } No exemplo acima. file{'arquivo': } é uma declaração de recurso e File['arquivo'] é uma referência ao resource declarado. ou seja. } notify {'mensagem': require => File['/tmp/teste1. content => "Ola!\n". devem reagir quando houver mudanças. Quando queremos referenciar um resource que já existe. Licença CC BY-SA 3. before é utilizado no resource anterior. seguido do título do resource entre colchetes. 8. após /tmp/teste1.0 BR .2 Meta-parâmetros notify e subscribe Alguns tipos de resources podem ser refreshed (refrescados. before => Notify['mensagem']. dependendo apenas da sua preferência por um ou outro. onde um resource deve ser sincronizado antes que outro.

3 Encadeando relacionamentos Existe um outro jeito de declarar relacionamentos entre os resources: usando setas de ordenação -> e notificação ~>. mas para relações de refresh. O Puppet chama isso de channing. source => '/root/manifests/sshd_config'.0 BR . enable => true.1. } 8. Os meta-parâmetros notify e subscribe estabelecem relações de dependência da mesma maneira que before e require. No exemplo abaixo. notify => Service['sshd']. significa reiniciar ou recarregar após um arquivo de configuração modificado. hasstatus => true. Não só o resource anterior será sincronizado. O agente do Puppet não monitora alterações nos arquivos. Para um resource exec. Aviso Quando acontece um refresh? Refreshes acontecem somente durante a aplicação da configuração pelo Puppet e nunca fora dele. Caso isso ocorra. ele será sincronizado.Apostila Puppet versão 2. toda vez que o arquivo /etc/ssh/sshd_config divergir de /root/manifests/sshd_config. Service['sshd'] receberá um refresh e fará com que o serviço sshd seja recarregado.Apostila cedida pela Instruct e mantida pela Puppet-BR 33 .0 Para um resource service. Nota Resources que suportam refresh Somente os tipos built-in exec. significa ser executado toda vez que o resource for modificado. mode => '0600'. como após a sincronização será gerado um evento refresh e o resource deverá reagir de acordo. } service { 'sshd': ensure => running. Licença CC BY-SA 3. file { '/etc/ssh/sshd_config': ensure => file. hasrestart => true. service e mount podem ser refreshed.

Crie um manifest com o código abaixo e execute-o.funciona também) e você deve pensar nelas como o fluxo do tempo.'. O arquivo depende do pacote sudo. package { 'sudo': ensure => 'installed' } file { '/etc/sudoers': ensure => 'file'. salve o conteúdo de cada exercício em um arquivo . 1.0 Essas setas podem apontar para qualquer direção (<. group => 'root'.txt': ensure => present. Certifique-se de que o pacote sudo está instalado.2 Prática: validando o arquivo /etc/sudoers Para essa atividade.txt foi sincronizado.txt'] -> Notify['depois'] 8. package { 'sudo': ensure => 'installed' } 2. pois sem ele o arquivo não deve existir. } notify {'depois': message => '/tmp/teste1. content => "Hi.pp e aplique-o usando o comando puppet apply. O resource de onde parte a seta é sincronizado antes que o recurso para qual a seta aponta. source => '/root/manifests/sudoers'. mas com muitos resources envolvidos elas podem ser bem mais práticas. require => Package['sudo'] } Licença CC BY-SA 3. Agora vamos declarar o controle do arquivo /etc/sudoers e usar como origem /root/manifests/sudoers. Para exemplos pequenos as vantagens de se usar setas podem não ser óbvias.". O exemplo abaixo demonstra o mesmo efeito de ordenação. owner => 'root'. mode => '0440'. file {'/tmp/teste1. mas de maneira diferente.Apostila Puppet versão 2. } File['/tmp/teste1.0 BR .Apostila cedida pela Instruct e mantida pela Puppet-BR 34 .

owner => 'root'. } exec {'parse_sudoers': command => '/usr/sbin/visudo -c -f /root/manifests/sudoers'. } Ao executar esse manifest. unless => '/usr/bin/diff /root/manifests/sudoers /etc/sudoers'. source => '/root/manifests/sudoers'. pois. sempre será copiado para /etc/sudoers.Apostila cedida pela Instruct e mantida pela Puppet-BR 35 . Exec['parse_sudoers']]. require => Package['sudo']. package {'sudo': ensure => 'installed' } file {'/etc/sudoers': ensure => 'file'. o arquivo /etc/sudoers não será atualizado porque há um problema de validação de conteúdo do arquivo de origem /root/manifests/sudoers. } exec { 'parse_sudoers': command => '/usr/sbin/visudo -c -f /root/manifests/sudoers'. require => Package['sudo']. source => '/root/manifests/sudoers'. group => 'root'.0 BR . require => [Package['sudo']. Exec['parse_sudoers']]. Licença CC BY-SA 3. } 4. mode => '0440'. owner => 'root'.Apostila Puppet versão 2. o resource Exec['parse_sudoers'] é executado. Temos uma limitação. mode => 0440.0 3. o arquivo. Toda vez que o manifest é aplicado. Precisamos de uma condição para que ele só seja executado se necessário. Ainda temos uma limitação. require => [Package['sudo']. Edite o arquivo /root/manifests/sudoers de forma a deixá-lo inválido antes de aplicar o manifest abaixo. package { 'sudo': ensure => 'installed' } file { '/etc/sudoers': ensure => 'file'. • Copie o arquivo /etc/sudoers para /root/manifests/sudoers. group => 'root'. caso exista algum erro no arquivo de origem. Façamos uma verificação antes de o arquivo ser copiado.

0 Nota Atributos onlyif e unless do resource exec Quando o recurso exec possuir o atributo onlyif ou unless declarado.Apostila Puppet versão 2. só será executado se o(s) comando(s) informado(s) nestes atributos for(em) executado(s) sem erros.Apostila cedida pela Instruct e mantida pela Puppet-BR 36 .html e https://docs.com/posts/exec-onlyif. se retornarem o código 0. Veja mais informações em: http://www.html Licença CC BY-SA 3.com/puppet/latest/reference/types/exec.0 BR .puppetcookbook.puppet. Ou seja.

0 BR . O facter é uma ferramenta fundamental do ecossistema do Puppet.Apostila Puppet versão 2.conf' "nameserver ${dns1}\nnameserver ${dns2}" file { $arquivo: ensure => 'present'. o Puppet executa o facter. Exemplo de saída da execução do comando facter: # facter dmi => { bios => { release_date => "12/01/2006".2 Fatos Antes de gerar a configuração. product => "VirtualBox".4. que gera uma lista de variáveis chamadas de fatos. board => { manufacturer => "Oracle Corporation". product => { name => "VirtualBox". version => "VirtualBox" }.Apostila cedida pela Instruct e mantida pela Puppet-BR 37 . } Mais alguns detalhes sobre variáveis: • Variáveis começam com o símbolo de cifrão ($). serial_number => "0" }.8. • Variáveis podem ser usadas para dar nomes em resources e atributos. serial_number => "0".8.1 Variáveis A linguagem declarativa do Puppet pode usar variáveis. • Variáveis do topo do $::variavel_global. fatos e condições 9. content => $conteudo.8' '8. 9. manufacturer => "innotek GmbH".8.0 9 Variáveis. a string deve estar entre aspas duplas e a variável deve estar entre chaves: ${var}. que contém diversas informações sobre o sistema operacional. • Para interpolar variáveis. Licença CC BY-SA 3. escopo (algo como global) podem ser acessadas assim: • Uma variável só pode ter seu valor atribuído uma vez. vendor => "innotek GmbH".4' '/etc/resolv. como no exemplo abaixo: $dns1 $dns2 $arquivo $conteudo = = = = '8.

used_bytes => 0 }.00 MiB". hardware => "i686". used => "83. used => "0 bytes". minor => "2" }. total_bytes => 922742784. used_bytes => 87216128 } } os => { architecture => "i386". O manifest facter. system => { available => "670. available_bytes => 703074304. total_bytes => 790290432.Apostila cedida pela Instruct e mantida pela Puppet-BR 38 .0 BR .2". selinux => { enabled => false } } system_uptime => { days => 0. capacity => "0%".50 MiB". hours => 2. name => "Debian". total => "880.00 MiB". total => "753.68 MiB". seconds => 8416.Apostila Puppet versão 2. major => "8".pp a seguir usa algumas das variáveis geradas pelo facter: Licença CC BY-SA 3.04%".0 uuid => "95E9353C-948D-4D93-A004-536701C2C673" } } memory => { swap => { available => "880. available_bytes => 922742784. uptime => "2:20 hours" } timezone => BRST virtual => virtualbox Todas essas variáveis estão disponíveis para uso dentro de qualquer manifest e dizemos que estão no escopo do topo (top scope).18 MiB". capacity => "11. release => { full => "8. family => "Debian".

Veja que é possível extrair fatos específicos: # facter ipaddress # facter ipaddress_eth0 3.2' Notice: Applied catalog in 0. é possível estender as variáveis do facter.0' Notice: A distribuição é Debian e versão 8.2 Notice: /Stage[main]/Main/Notify[distro]/message: defined 'message' as \ 'A distribuição é Debian versão 8.16. Execute o facter: # facter 2.Apostila cedida pela Instruct e mantida pela Puppet-BR 39 .2. 9. # facter --json # facter --yaml Licença CC BY-SA 3.Apostila Puppet versão 2.0 BR ." } notify {'distro': message => "A distribuição GNU/Linux é ${::operatingsystem} versão ${::operatingsystem } E teremos a seguinte saída: # puppet apply facter. Além disso.pp Notice: O sistema operacional é Linux versão 3.0 Notice: /Stage[main]/Main/Notify[kernel]/message: defined 'message' as \ 'O sistema operacional é Linux versão 3. É possível extrair os fatos em formatos como YAML e JSON.0 notify {'kernel': message => "O sistema operacional é ${::kernel} versão ${::kernelversion}.16.03 second Nota Sistemas operacionais diferentes Alguns fatos podem variar de um sistema operacional para outro.1 Prática: facter 1.

Outro exemplo.Apostila cedida pela Instruct e mantida pela Puppet-BR 40 .0 BR . 9.1 if Exemplo de um bloco de condição if: if expressao { bloco de codigo } elsif expressao { bloco de codigo } else { bloco de codigo } O else e o elsif são opcionais.0 9. } } elsif $::osfamily == 'Debian' { service {'ssh': ensure => 'running'. mais alguns exemplos: if $::osfamily == 'RedHat' { service {'sshd': ensure => 'running'. } } Licença CC BY-SA 3.3 Condicionais A linguagem declarativa do Puppet possui mecanismos de condição que funcionam de maneira parecida em relação às linguagens de programação. Mas existem algumas diferenças. enable => true.Apostila Puppet versão 2.3. usando uma variável 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 definição de configuração. enable => true.

o Puppet fornece a diretiva case.3.3 Case Além do if.2 Operadores booleanos • and • or • ! (negação) 9. case $::operatingsystem { centos: { $apache = "httpd" } redhat: { $apache = "httpd" } debian: { $apache = "apache2" } ubuntu: { $apache = "apache2" } # fail é uma função default: { fail("sistema operacional desconhecido") } } package {'apache': name => $apache.3. 'logo'] # TRUE { 'bat' => 'feira'. 'ate' => 'fruta'} # TRUE { 'feira' => 'bat'.2.2 Expressões 9.0 BR .Apostila cedida pela Instruct e mantida pela Puppet-BR 41 .1 Comparação • == (igualdade. sendo que comparação de strings é case-insensitive) • != (diferente) • < (menor que) • > (maior que) • <= (menor ou igual) • >= (maior ou igual) • =~ (casamento de regex) • !~ (não casamento de regex) • in (contém. } Licença CC BY-SA 3. 'fruta' => 'ate' } # FALSE 9.Apostila Puppet versão 2. ensure => 'latest'.2.0 9. sendo que comparação de strings é case-sensitive) Exemplo do operador in: 'bat' 'Bat' 'bat' 'bat' 'bat' in in in in in 'batata' # TRUE 'batata' # FALSE ['bat'.3. 'ate'.3.

O valor default é especial.0 Ao invés de testar uma única condição.4 Prática: melhor uso de variáveis Reescreva o código do exemplo a seguir usando uma variável para armazenar o nome do serviço e usando somente um resource service no seu código. /Ubuntu|Debian/ => 'apache2'. O case pode tentar casar com strings. redhat: { $apache = "httpd" } debian. redhat => 'httpd'. O casamento de strings é case-insensitive como o operador de comparação ==. Pode parecer um pouco estranho. e é auto-explicativo. o case testa a variável em diversos valores. ubuntu: { $apache = "apache2" } default: { fail("sistema operacional desconhecido") } } package {'apache': name => $apache. ensure => 'latest'. 9. Licença CC BY-SA 3. $apache = $::operatingsystem ? { centos => 'httpd'. default => undef. } } } 9.Apostila cedida pela Instruct e mantida pela Puppet-BR 42 . } O ponto de interrogação assinala $operatingsystem como o pivô do selector. } Exemplo usando uma expressão regular: case $ipaddress_eth0 { /^127[\d. e o valor final que é atribuído a $apache é determinado pelo valor corresponde de $::operatingsystem. um selector escolhe seu valor a partir de um grupo de valores. Selectors são usados para atribuir valor a variáveis. Expressões regulares devem ser escritas entre barras e são case sensitive.4 Selectors Ao invés de escolher a partir de um bloco.]+$/: { notify {'erro': message => "Configuração estranha!".3.Apostila Puppet versão 2. mas há muitas situações em que é a forma mais concisa de se obter um valor. O exemplo anterior pode ser reescrito assim: case $::operatingsystem { centos. expressões regulares ou uma lista de ambos.0 BR .

enable => 'true'. } } Licença CC BY-SA 3.Apostila Puppet versão 2.Apostila cedida pela Instruct e mantida pela Puppet-BR 43 .0 package {'ntp': ensure => 'installed'. } } elsif $::osfamily == 'Debian' { service {'ntp': ensure => 'running'. } if $::osfamily == 'RedHat' { service {'ntpd': ensure => 'running'. enable => 'true'.0 BR .

O serviço sshd deve ser recarregado quando o arquivo de configuração sshd_config for modificado.0 BR . O pacote openssh-server deve estar instalado.Apostila cedida pela Instruct e mantida pela Puppet-BR 44 . arquivo de configuração e serviço. se for Debian/Ubuntu será apenas ssh. 3. • Dica: faça uma cópia do arquivo /etc/ssh/sshd_config para /root/manifests. Codifique um manifest que declare o seguinte: 1. Licença CC BY-SA 3. 2. Seu manifest deve tratar qual é o sistema operacional em relação ao serviço.0 10 Laboratório O padrão mais comum na utilização do Puppet é a tríade pacote.Apostila Puppet versão 2. 4. Se for RedHat/CentOS o serviço será sshd. O arquivo de configuração /etc/ssh/sshd_config depende do pacote openssh-server e tem como fonte o caminho /root/manifests/sshd_config.

No CentOS/Red Hat.10 node1. 2.Apostila Puppet versão 2. O ciclo de operação nesses casos é o seguinte: 1. é fundamental para o correto funcionamento do Puppet. 4.168.com.conf com os parâmetros domain e search com o domínio de sua rede. A saída desse comando nos mostra se o sistema está configurado corretamente. Os clientes (chamados de node) possuem um agente instalado que permanece em execução e se conecta ao servidor central (chamado tipicamente de Master) periodicamente (a cada 30 minutos.Apostila cedida pela Instruct e mantida pela Puppet-BR 45 .domain. Exemplo: 192. 5. com seu IP. além da resolução de nomes. que é compilada e enviada pelo Master. O agente aplica o catálogo no node.br node1. O arquivo /etc/hosts deve possuir pelo menos o nome da própria máquina.1 Resolução de nomes A configuração de nome e domínio do sistema operacional.com. 3. coloque apenas o hostname no arquivo /etc/hostname. # hostname node1 # hostname --domain domain. A aquisição e aplicação do catálogo é agendada na crontab.domain. por padrão). utilize o comando hostname.1.0 11 Master / Agent O Puppet é deve ser utilizado com a arquitetura Master / Agent. FQDN e depois o hostname. Outra maneira comum de implantação do Puppet é a ausência de um agente em execução nos nodes. o valor da variável HOSTNAME no arquivo Licença CC BY-SA 3.com.br Dica Configuração de hostname no CentOS/Red Hat e Debian/Ubuntu Para resolução de nomes.br # hostname --fqdn node1. 11. ajuste /etc/sysconfig/network. configure corretamente o arquivo /etc/resolv. No Debian/Ubuntu. havendo divergências ou não. Para verificar a configuração de seu sistema. Essa configuração é chamada de catálogo. devido ao uso de certificados SSL para a autenticação de agentes e o servidor Master. O node solicita a sua configuração.0 BR . O resultado da aplicação do catálogo é reportado ao Master.

Apostila Puppet versão 2.0
Para um bom funcionamento do Puppet é fundamental que sua rede possua configurado a resolução de
nomes via DNS. O hostname e domínio de cada sistema operacional devem resolver corretamente para
seu respectivo IP, e o IP deve possuir o respectivo nome reverso.

11.2 Segurança e autenticação
As conexões entre agente e servidor Puppet são realizadas usando o protocolo SSL e, através de
certificados, ambos se validam. Assim, o agente sabe que está falando com o servidor correto e o
servidor sabe que está falando com um agente conhecido.
Um servidor Master do Puppet é um CA (Certificate Authority) e implementa diversas funcionalidades
como gerar, assinar, revogar e remover certificados para os agentes.
Os agentes precisam de um certificado assinado pelo Master para receber o catálogo com as
configurações.
Quando um agente e Master são executados pela primeira vez, um certificado é gerado automaticamente
pelo Puppet, usando o FQDN do sistema operacional no certificado.

11.3 Prática Master / Agent
11.3.1 Instalação do Master
1. O pacote puppetserver deverá ser instalado na máquina que atuará como Master. Certifique-se
de que o hostname está correto:
# hostname --fqdn
master.domain.com.br
Assumindo que os passos do capítulo Instalação foram executados anteriormente, instale o
PuppetServer com o comando abaixo.
# puppet resource package puppetserver ensure=latest
Teremos a seguinte estrutura em /etc/puppetlabs:
# tree -F --dirsfirst /etc/puppetlabs/
/etc/puppetlabs/
|-- code/
|
|-- environments/
|
|
|-- production/
|
|
|-- hieradata/
|
|
|-- manifests/
|
|
|-- modules/
|
|
|-- environment.conf
|
|-- modules/
|
|-- hiera.yaml
|-- mcollective/
|
|-- client.cfg
|
|-- data-help.erb
|
|-- discovery-help.erb
|
|-- facts.yaml

Licença CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
46

Apostila Puppet versão 2.0

|
|
|
|-|
|
|
|--

|-- 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

• Os arquivos e diretórios de configuração mais importantes são:
• auth.conf: regras de acesso a API REST do Puppet.
• code/environments/production/manifests/: Armazena a configuração que será
compilada e servida para os agentes que executam no ambiente de production (padrão).
• code/environments/production/modules/: Armazena módulos com classes, arquivos,
plugins e mais configurações para serem usadas nos manifests para o ambiente de production
(padrão).
• puppet.conf: Arquivo de configuração usado pelo Master assim como o Agent.

Dica
Sobre os arquivos de configuração
Nas páginas abaixo você encontra mais detalhes sobre os arquivos de configuração 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

Licença CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
47

Apostila Puppet versão 2.0

Nota
Sobre os binários do Puppet
A instalação do Puppet 4 e todos seus componentes fica em /opt/puppetlabs.
Os arquivos de configuração ficam em /etc/puppetlabs.

2. Configurando o serviço:
Altere as configurações de memória da JVM que é utilizada pelo Puppet Server para adequá-las a
quantidade de memória disponível.
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 configuração será alocado 512 MB para uso da JVM usada pelo Puppet Server. Por padrão,
são alocados 2 GB de memória para uso da JVM.
3. Na máquina PuppetServer, gere um certificado e inicie os serviço com os comandos abaixo.
# puppet cert generate master.domain.com.br
# puppet resource service puppetserver ensure=running enable=true

Nota
Configuração 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 acessível para as demais máquinas
que possuem o Puppet Agent instalado.

As
solicitações
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

Licença CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
48

precisamos configurá-la para que ela saiba quem é o Master.puppet Info: Caching certificate for ca Info: Creating a new SSL certificate request for node1. No servidor Master aparecerá a solicitação de assinatura para a máquina node1.domain. Assine-a.br. Licença CC BY-SA 3. 3. 4.com.com.com.Apostila cedida pela Instruct e mantida pela Puppet-BR 49 .conf. Em uma máquina em que o agente está instalado.Apostila Puppet versão 2.br 2.br.com.br environment = production [agent] report = true Nota Conectividade Certifique-se de que o servidor Master na porta 8140/TCP está acessível para os nodes.br server = master..domain. Configure o Puppet Agent com os passos a seguir.br Info: Certificate Request fingerprint (SHA256): 6C:7E:E6:3E:EC:A4:15:56: .domain.2 Instalação do agente em node1 Assumindo que os passos do capítulo Instalação foram executados anteriormente na máquina node1. Certifique-se de que o nome e domínio do sistema estejam corretos: # hostname --fqdn node1.3. No arquivo /etc/puppetlabs/puppet/puppet.domain.domain..com. • O comando abaixo deve ser executado em master.com. 1. O Puppet Agent já está instalado.domain.0 11.0 BR . Conecte-se ao Master e solicite assinatura de certificado: # puppet agent -t Info: Creating a new SSL key for node1. adicione as linhas abaixo: [main] certname = node1.

.0 BR . • O comando abaixo deve ser executado em node1.domain.pem' Para listar todos os certificados que já foram assinados pelo Puppet Server.Apostila Puppet versão 2.com.com. • /var/log/puppetlabs/puppet Licença CC BY-SA 3.domain.com. use o comando abaixo: # puppet cert list -a 5.com.br.br Signed certificate request for node1.com.br at '/var/lib/puppet/ssl/ca/requests/node1..br.domain.domain.domain. # puppet cert sign node1. os certificados assinados ficam em: /etc/puppetlabs/puppet/ssl/ Se precisar refazer a assinatura de certificados do host puppet-agent é só para o servico puppet-agent com o comando abaixo e depois apagar os arquivos e sub-diretórios que ficam em: /etc/puppetlabs/puppet/ssl/.br Info: Caching certificate_revocation_list for ca Info: Retrieving plugin Info: Caching catalog for node1. Execute o agente novamente e estaremos prontos para distribuir a configuração. # puppet agent -t Info: Caching certificate for node1.domain.domain.yaml Finished catalog run in 0. # puppet resource service puppet ensure=stop Os logs do puppet-agent ficam em: • /var/log/messages (no Debian/Ubuntu) • /var/log/syslog (no CentOS/Red Hat).0 # puppet cert list "node1.br Info: Applying configuration version '1352824182' Info: Creating state file /var/lib/puppet/state/state.br" (SHA256) 6C:7E:E6:3E:EC:A4:15:56:49:C3:1E:A5:E4:7F:58:B8: .com.domain.com.05 seconds Agora execute os comandos abaixo para iniciar o agente do Puppet como serviço e habilitá-lo para ser executado após o boot do sistema operacional: # puppet resource service puppet ensure=running enable=true No Puppet-Agent.br Removing file Puppet::SSL::CertificateRequest node1.Apostila cedida pela Instruct e mantida pela Puppet-BR 50 .com.

então sua conexão pode falhar com um erro indicando que os certificados não são confiáveis.com/puppet/4. Conexões SSL confiam no relógio e. Você também pode consultar esta página https://docs. Procure manter os relógios corretamente configurados utilizando NTP. Licença CC BY-SA 3.4/reference/ssl_regenerate_certificates.0 Dica Possíveis problemas com certificados SSL É importante que os horários do Master e dos nodes estejam sincronizados. se estiverem incorretos.0 BR .puppet.html para saber como reconfigurar os certificados no Agente e Master.Apostila cedida pela Instruct e mantida pela Puppet-BR 51 .Apostila Puppet versão 2.

com.br' { package {'nano': ensure => 'present'. A documentação oficial está em: https://docs. precisamos declarar o hostname do agente.pp. o nome do agente é o valor de certname presente no certificado de um agente (por padrão. 12. o agente que se identificar como node1.br' { package {'vim': ensure => 'present'.pp node 'node1.com. o FQDN).domain. utilizando a diretiva node.com. } } No exemplo acima.puppet. evitando a configuração de longos manifests. enquanto node2.2 Nomes A diretiva node casa com agentes por nome.0 12 Nodes O Puppet começa a compilação da configuração de um catálogo pelo arquivo /etc/puppetlabs/code/environments/production/manifests/site.Apostila Puppet versão 2.br receberá a ordem de instalar o pacote nano. Diretivas node casam sempre com o nome do agente.pp é o ponto de entrada do master para identificar a configuração que será enviada a um agente.domain. Para saber qual configuração deve ser enviada a um agente.Apostila cedida pela Instruct e mantida pela Puppet-BR 52 .domain.0 BR . O site. Por padrão.br deverá instalar o pacote vim. que por padrão é valor de certname. ou seja o FQDN.domain. Esse recurso será visto mais adiante.html 12.1 Declarando nodes Sintaxe para se declarar um node: # vim /etc/puppetlabs/code/environments/production/manifests/site. Licença CC BY-SA 3. } } node 'node2. O nome de um node é um identificador único. que tem a finalidade de delegar o registro de nodes para uma entidade externa.com/guides/external_nodes. Nota Classificação de nodes O Puppet fornece um recurso chamado External Node Classifier (ENC).com.

em última instância pode-se criar um node simplesmente chamado default.4 Prática 1.Apostila Puppet versão 2. www999.com. 'www3.com. node default { } 12.0 É possível casar nomes de nodes usando expressões regulares: Para: www1.Apostila cedida pela Instruct e mantida pela Puppet-BR 53 . certifique-se de que o pacote tcpdump foi instalado.domain. node 'www1. Declare o pacote tcpdump como instalado para node1.domain. Dica Simulando a configuração Para simularmos as alterações que serão ou não realizadas no host cliente.0 BR .br.domain. 2.br no arquivo /etc/puppetlabs/code/environments/production/manifests/site. 'www2.com. 3. usamos o comando puppet agent -t --noop.domain.pp do master.br'. Execute o comando puppet agent -t no node1.com.com.com.br$/ { } Também podemos aproveitar uma configuração em comum usando uma lista de nomes na declaração de um node.domain. a declaracao pode ser: node /^www\d+$/ { } Para: foo. www13.com\.domain\. que casará apenas para os agentes que não encontraram uma definição de node.domain.br' { } 12. Declare a máquina node1.br ou bar.3 O node default Caso o Puppet Master não encontre nenhuma declaração de node explícita para um agente.br'.br. Licença CC BY-SA 3.com. a declaração pode ser: node /^(foo|bar)\.domain.

vimos como instalar o puppet-agent e puppetserver.org/pub/repos/apt/ trusty-pgdg main" > \ /etc/apt/sources.asc | apt-key add # apt-get update # apt-get -y install postgresql-9.5 Licença CC BY-SA 3.postgresql. Os passos de instalação a seguir são executados apenas na máquina master.https://www.com.list.org/pub/repos/yum/9.postgresql.5-2.org/pub/repos/apt/ jessie-pgdg main" > \ /etc/apt/sources.5 start chkconfig postgresql-9.noarch.postgresql.noarch.5 initdb chkconfig postgresql-9.0 BR .d/pgdg.5-2. • No CentOS/RedHat 6 64 bits: # # # # # URL_BASE="https://download.5 com os comandos abaixo.Apostila Puppet versão 2.0 13 PuppetDB e Dashboards Web Nos capítulos Instalação e Master / Agent. Agora vamos aprender a instalar o PuppetDB.domain. que oferecem uma interface web que permite acompanhar o que acontece em cada ciclo de operação execultado nas máquinas que possuem o agente instalado.5 • No Ubuntu Server 14.org/media/keys/ACCC4CF8. instale o PostgreSQL 9.list.br e é assumido que o puppet-agent e puppetserver estão instalados. 1.d/pgdg.org/pub/repos/yum/9.postgresql.5 on • No Debian 8: # su # echo "deb http://apt.postgresql.postgresql.5/redhat/rhel-6-x86_64/" rpm -ivh --force $URL_BASE/pgdg-redhat95-9.Apostila cedida pela Instruct e mantida pela Puppet-BR 54 . Antes de iniciar a instalação do PuppetDB.04: # sudo su # echo "deb http://apt.org/media/keys/ACCC4CF8.5/redhat/rhel-7-x86_64/" rpm -ivh --force $URL_BASE/pgdg-redhat95-9. o PuppetExplorer e o PuppetBoard.list # wget --quiet -O .5/bin/postgresql95-setup initdb service postgresql-9.5 on • No CentOS/RedHat 7 64 bits: # # # # # # URL_BASE="https://download.rpm yum -y install postgresql95-server postgresql95-contrib /usr/pgsql-9.rpm yum -y install postgresql95-server postgresql95-contrib service postgresql-9.asc | apt-key add # apt-get update # apt-get -y install postgresql-9.https://www.list # wget --quiet -O .

conf (no CentOS/Red Hat) conforme mostrado abaixo.Apostila Puppet versão 2.conf (no CentOS/Red Hat) e configure o arquivo como mostrado abaixo. Antes: #listen_addresses = 'localhost' port = 5432 Depois: listen_addresses = 'localhost' port = 5432 Depois de alterar estes arquivos é preciso reiniciar o PostgreSQL para aplicar as configurações realizadas.list.postgresql.5 restart Licença CC BY-SA 3.5 Edite o arquivo /etc/postgresql/9.conf (no Debian/Ubuntu) ou /var/lib/pgsql/9.0 BR .d/pgdg.conf (no Debian/Ubuntu) ou /var/lib/pgsql/9.0.5/data/postgresql.5/main/pg_hba.0.postgresql. Faça isso usando o comando abaixo.5/main/postgresql.0 • No Ubuntu Server 16.1/32 ::1/128 peer peer md5 md5 Depois: local local host host trust trust trust trust Outro arquivo que precisa ser editado é o /etc/postgresql/9.5/data/pg_hba.list # wget --quiet -O . No Debian/Ubuntu: # service postgresql restart No CentOS/Red Hat: # service postgresql-9.0.org/media/keys/ACCC4CF8.https://www.asc | apt-key add # apt update # apt -y install postgresql-9.Apostila cedida pela Instruct e mantida pela Puppet-BR 55 . Antes: local local host host all all all all postgres all 127.04: # echo "deb http://apt.1/32 ::1/128 all all all all postgres all 127.0.org/pub/repos/apt/ xenial-pgdg main" > \ /etc/apt/sources.

Apostila cedida pela Instruct e mantida pela Puppet-BR 56 . edite o /etc/puppetlabs/puppetdb/conf.ini e altere os parâmetros a seguir para deixá-los com esses valores. # puppet resource package puppetdb ensure=latest 3.0.postgresql.0 ssl-port = 8081 Execute o comando abaixo para gerar os certificados a serem usados pelo PuppetDB e configurar o arquivo jetty.conf e adicione o seguinte conteúdo: [main] server_urls = https://master. instale o pacote puppetdb-termini com o comando abaixo. Instale o PuppetDB com o comando abaixo.0.Driver subprotocol = postgresql subname = //localhost:5432/puppetdb username = puppetdb password = SENHA-DO-USUARIO-PUPPETDB Agora edite o arquivo /etc/puppetlabs/puppetdb/conf.0. Ainda no servidor PuppetServer.br:8081 Licença CC BY-SA 3.ini.0.com. # puppetdb ssl-setup Reinicie o PuppetDB com o comando abaixo: # service puppetdb restart 4.domain.Apostila Puppet versão 2.0 port = 8080 ssl-host = 0.0 Agora crie o banco de dados e usuário para o puppetdb com a sequencia de comandos abaixo. # puppet resource package puppetdb-termini ensure=latest Crie o arquivo /etc/puppetlabs/puppet/puppetdb.d/jetty.d/database.0 BR . No servidor PuppetServer. [jetty] host = 0. su postgres createdb puppetdb createuser -a -d -E -P puppetdb exit 2.ini e altere as seguinte linhas: arquivo [database] classname = org.

puppetdb reportstore = /var/log/puppetlabs/puppet Crie o arquivo /etc/puppetlabs/puppet/routes.com/puppetdb/latest/configure.html e https://docs.puppet.domain. storeconfigs = true storeconfigs_backend = puppetdb reports = store.com/puppetdb/4.0 Edite o arquivo /etc/puppetlabs/puppet/puppet.domain.html Os arquivos de log do PuppetDB ficam em: /var/log/puppetlabs/puppetdb/ O PuppetDB ficará acessível https://master.com.Apostila cedida pela Instruct e mantida pela Puppet-BR 57 .yaml com o seguinte conteúdo: --master: facts: terminus: puppetdb cache: yaml Atribua as permissões corretas ao arquivo com o comando abaixo: # chown -R puppet:puppet `puppet config print confdir` Reinicie o PuppetServer com o comando abaixo: # service puppetserver restart Aviso Informações sobre o PuppetDB Mais informações sobre a instalação do PuppetDB podem ser encontradas nas páginas: https://docs.0 BR .com.1/connect_puppet_master.br:8080 ou Licença CC BY-SA 3.br:8081 em: http://master.puppet.Apostila Puppet versão 2.conf e adicione o seguinte conteúdo na seção [master].

liquidweb.cyberciti.com/writings/quicktips/turn-off-selinux.biz/faq/fedora-redhat-centos-5-6-disable-firewall No CentOS/Red Hat 7.0 BR .revsys.com/info/centos-selinux/ 13.0 Aviso Possíveis problemas no acesso ao PuppetDB Se não conseguir acessar a interface web do PuppetDB. No CentOS/Red Hat 6. verifique se há algum firewall bloqueando a porta.Apostila Puppet versão 2.Apostila cedida pela Instruct e mantida pela Puppet-BR 58 . você pode desabilitar o firewall seguindo estas instruções: http://www.1 Instalando o PuppetExplorer Os módulos Puppet de instalação do PuppetExplorer e dependências podem ser instalados no Puppet-Server usando os comandos abaixo.html ou http://aruljohn.pp e adicione o seguinte conteúdo: Licença CC BY-SA 3. # puppet module install puppetlabs-apache # puppet module install puppetlabs-apt # puppet module install spotify-puppetexplorer Agora edite o aquivo /etc/puppetlabs/code/environments/production/manifests/site. Siga estas instruções: http://www.com/kb/how-to-stop-and-disable-firewalld-on-centos-7 Você também pode precisar desabilitar o SELinux no CentOS/RedHat. você pode desabilitar o firewall seguindo estas instruções: http://www.

domain.com.*)$ https://master.Apostila cedida pela Instruct e mantida pela Puppet-BR 59 .br { class {'::puppetexplorer': vhost_options => { rewrites => [ { rewrite_rule => ['^/api/metrics/v1/mbeans/puppetlabs.0 node master.query.google.com.domain. o PuppetExplorer deveria ser instalado apenas usando a declaração abaixo no arquivo site.domain.L]'] } ] } } } Agora execute o comando abaixo. afim de corrigir um bug no PuppetExplorer devido a uma atualização realizada no PuppetDB.puppet.population:type=default.com/spotify/puppetexplorer Licença CC BY-SA 3.br:8081/\ api/metrics/v1/mbeans/puppetlabs. # puppet agent -t Ao final da instalação.Apostila Puppet versão 2.puppetdb\ . o PuppetExplorer ficará acessível em: https://master.com.domain.puppetdb.population:name=$1 [R=301.pp.br Aviso Problema no PupppetExplorer O módulo de instalação do PuppetExplorer foi declarado passando o recurso vhost_options.com/spotify/puppetexplorer/issues/49 normalmente.name=(. node puppetserver.com. Veja o report em: https://github.0 BR .com/forum/#!topic/puppet-users/VDywEgW2Y54 • https://forge.br { include puppetexplorer } Mais informações sobre o PuppetExplorer podem ser encontradas em: • https://groups.com/spotify/puppetexplorer • https://github.

Apostila Puppet versão 2.br Licença CC BY-SA 3.com. # puppet agent -t Ao final da instalação. port => 443.2 Instalando o PuppetBoard Se você não quiser usar o PuppetExplorer. manage_virtualenv => 'latest'. } } Agora execute o comando abaixo. ssl => true.br'.domain. reports_count => 50 } # Configure Access Puppetboard class { 'puppetboard::apache::vhost': vhost_name => 'master.Apostila cedida pela Instruct e mantida pela Puppet-BR 60 .domain.0 13.0 BR .com. Os módulos Puppet de instalação do PuppetBoard e dependências podem ser instalados no Puppet-Server usando os comandos abaixo. pode usar o PuppetBoard.domain. o PuppetBoard ficará acessível em: https://master.pp e adicione o seguinte conteúdo: node puppetserver.com. # puppet module install puppetlabs-apache # puppet module install puppetlabs-apt # puppet module install puppet-puppetboard Agora edite o aquivo /etc/puppetlabs/code/environments/production/manifests/site.br { class {'apache': } # Configure Apache on this server class { 'apache::mod::wsgi': } # Configure Puppetboard class { 'puppetboard': manage_git => 'latest'.

Apostila Puppet versão 2.1-2. /etc/puppetlabs/puppet/puppet.pp. } Para: package { 'python-dev': ensure => present. } Depois execute: # puppet agent -t Mais informações sobre o PuppetBoard https://forge.el7. Altere todas as ocorrências de: package { 'python-dev': ensure => $dev_ensure.10. name => $pythondev. Erro: Execution of '/usr/bin/rpm -e python-devel-2.Apostila cedida pela Instruct e mantida pela Puppet-BR 61 .el7.7.noarch Solução: Edite o arquivo /etc/puppetlabs/code/environments/production/modules/python/manife sts/install.el7.x86_64' returned 1: error: Failed dependencies: python2-devel is needed by (installed) python-virtualenv-1.com/puppet/puppetboard podem ser encontradas em: 13.conf o seguinte conteúdo: adicione no arquivo [agent] report = true Reinicie o Puppet-Agent com o comando abaixo: # service puppet restart Licença CC BY-SA 3.el7.5-34.7.x86_64' returned 1: error: Failed dependencies: python2-devel is needed by (installed) python-virtualenv-1. name => $pythondev.el7 to absent failed: Execution of '/usr/bin/rpm -e python-devel-2.0 BR .5-34.10.3 Configurando os Agentes Puppet Em cada máquina que executa o Puppet-Agent.noarch Error: /Stage[main]/Python::Install/Package[python-dev]/ensure: change from 2.5-34.puppet. #ensure => $dev_ensure.0 É possível que você enfrente o problema abaixo na instalação do PuppetBoard no CentOS/Red Hat 7.7.1-2.

por exemplo: # vim ntp.03 seconds Licença CC BY-SA 3. Definindo uma classe: class nomedaclasse { . } Vejamos o resultado ao aplicar esse código: # puppet apply ntp. => Package['ntp'].Apostila cedida pela Instruct e mantida pela Puppet-BR 62 . é preciso realizar diversas modificações. Para o Puppet. Quando alterações são necessárias.. uma unidade..1 Classes Deixe seu conhecimento sobre programação orientada a objetos de lado a partir de agora. } Dentro do bloco de código da classe podemos colocar qualquer código Puppet. => true. O Puppet fornece alguns mecanismos chamados resource collections. É um bloco de código que pode ser ativado ou desativado. ou resources que sejam utilizados muitas vezes possam ser resumidos.0 14 Classes e Módulos Ao criar diversos resources para vários nodes. em algum momento passa a fazer sentido que certos resources que são relacionados estejam juntos. 14.Apostila Puppet versão 2.pp class ntp { package { 'ntp': ensure => installed. Muitas vezes. } service { ensure enable require } 'ntpd': => running.0 BR . uma classe é a junção de vários resources sob um nome.pp Finished catalog run in 0. configurações específicas de um node precisam ser aproveitadas em outro e torna-se necessário copiar tudo para o outro node. que são a aglutinação de vários resources para que possam ser utilizados em conjunto.

1 Diretiva include Existe um outro método de usar uma classe. # vim 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.pp class ntp { package { 'ntp': ensure => installed. Nota Declaração de classes sem usar include A sintaxe class {'ntp': } é utilizada quando usamos classes que recebem parâmetros.0 BR .Apostila Puppet versão 2.0 Simplesmente nada aconteceu. 14. precisamos declará-la. } # declarando a classe class {'ntp': } Aplicando-a novamente: # puppet apply --verbose ntp. Licença CC BY-SA 3.29 seconds Portanto. primeiro definimos uma classe e depois a declaramos. => true. => Package['ntp'].. # arquivo ntp. pois nós apenas definimos a classe. Para utilizá-la.Apostila cedida pela Instruct e mantida pela Puppet-BR 63 . nesse caso usando a diretiva include.pp class ntp { .1.. } service { ensure enable require } 'ntpd': => running. } # declarando a classe ntp usando include include ntp O resultado será o mesmo.

2.pp: contém definição de uma classe que deve ter o mesmo nome do módulo • outra_classe.2 Módulos Usando classes puramente não resolve nosso problema de repetição de código. devemos conhecer de nosso ambiente onde os módulos devem estar localizados. Para solucionar esse problema.pp: contém meu_modulo::um_diretorio::minha_outra_classe2 uma classe chamada • files/: arquivos estáticos que podem ser baixados pelos agentes • lib/: plugins e fatos customizados implementados em Ruby • templates/: contém templates usados no módulo • tests/: exemplos de como classes e tipos do módulo podem ser chamados 14. crie a estrutura básica de um módulo: # cd /etc/puppetlabs/code/environments/production/modules # mkdir -p ntp/manifests Licença CC BY-SA 3.Apostila cedida pela Instruct e mantida pela Puppet-BR 64 . módulos são a união de um ou vários manifests que podem ser reutilizados.0 14. 14. Primeiramente. módulos são nada mais que arquivos e diretórios.Apostila Puppet versão 2. Vamos olhar mais de perto o que há em cada diretório. O código da classe ainda está presente nos manifests. Para isso. Porém.pp: contém uma classe chamada meu_modulo::outra_classe • um_diretorio/: o nome do diretório afeta o nome das classes abaixo • minha_outra_classe1pp: contém meu_modulo::um_diretorio::minha_outra_classe1 uma classe chamada • minha_outra_classe2. verificamos o valor da opção de configuração modulepath.3 Prática: criando um módulo 1. # puppet config print modulepath /etc/puppetlabs/code/environments/production/modules: \ /etc/puppetlabs/code/modules:/opt/puppetlabs/puppet/modules No Puppet.0 BR . eles precisam estar nos lugares corretos para que o Puppet os encontre. o Puppet possui o recurso de carregamento automático de módulos (module autoloader).1 Estrutura de um módulo Como já podemos perceber. Primeiramente. • meu_modulo/: diretório onde começa o módulo e dá nome ao mesmo • manifests/: contém todos os manifests do módulo • init. O Puppet carrega automaticamente os manifests dos módulos presentes em modulepath e os torna disponíveis.

Apostila Puppet versão 2.0 BR .pp. => true. O nome de nosso módulo é ntp. } service { ensure enable require } $service_ntp: => running. No CentOS/Red Hat.domain.com. o nome do serviço é ntpd.br' { include ntp } 4.Apostila cedida pela Instruct e mantida pela Puppet-BR 65 . e nele deve haver uma classe com o nome do módulo. o nome do serviço é ntp. Em node1 aplique a configuração: # puppet agent -t 5. dessa maneira: # puppet apply -e 'include ntp' Agora temos um módulo para configuração de NTP sempre a disposição! Nota Nome do serviço NTP No Debian/Ubuntu.pp dessa maneira: # vim /etc/puppetlabs/code/environments/production/manifests/site.pp class ntp { case $::operatingsystem { centos. ubuntu: { $service_ntp = "ntp" } default: { fail("sistema operacional desconhecido") } } package { 'ntp': ensure => installed. Aplique a configuração no master também. => Package['ntp']. Todo módulo deve possuir um arquivo init.pp node 'node1. Licença CC BY-SA 3. # vim /etc/puppetlabs/code/environments/production/modules/ntp/manifests/init.0 2. Deixe o código de site. redhat: { $service_ntp = "ntpd" } debian. } 3.

Crie um diretório files dentro do módulo ntp: # cd /etc/puppetlabs/code/environments/production/modules # mkdir -p ntp/files 2.conf /etc/puppetlabs/code/environments/production/modules/ntp/files/ 3. require => Package['ntp'].. ele terá o arquivo /etc/ntp. Todos os arquivos no diretório files do módulo ntp estão disponíveis na URL puppet:///modules/ntp/.conf disponível.conf'. # puppet agent -t Dica Servidor de arquivos do Puppet O Puppet pode servir os arquivos dos módulos. por exemplo.Apostila Puppet versão 2. Copie-o: # cp /etc/ntp. Para isso.conf': path => '/etc/ntp. Como aplicamos o módulo ntp no master.conf). notify => Service[$service_ntp].0 14. módulos também podem servir arquivos. source => "puppet:///modules/ntp/ntp.pp: class ntp { .Apostila cedida pela Instruct e mantida pela Puppet-BR 66 .4 Prática: arquivos de configuração em módulos Além de conter manifests.conf". e funciona da mesma maneira se você está operando de maneira serverless ou master/agente. 5. Aplique a nova configuração no node1. faça os seguintes passos: 1. } } 4. Faça qualquer alteração no arquivo ntp. acrescentando ou removendo um comentário. file { 'ntp.0 BR . Licença CC BY-SA 3. Acrescente um resource type file ao código da classe ntp em /etc/puppetlabs/code/environments/production/modules/ntp/manifests/init.conf do módulo (em /etc/puppetlabs/code/environments/production/modules/ntp/files/ntp..

puppetlabs.Apostila Puppet versão 2. Nele encontramos diversos módulos prontos para uso.com .2) 3. Notice: Installing -. Além disso. Faça uma busca por sysctl em https://forge. via linha de comando: # puppet apply -e "sysctl { 'net. /etc/puppetlabs/code/environments/production/modules |--. fazendo ajustes de segurança e etc.puppet.com)! Puppet Forge é um repositório de módulos escritos pela comunidade para o Puppet Open Source e Puppet Enterprise. ao desenvolver um software. 15.1 Prática: módulo para sysctl do Puppet Forge Um dos itens comumente configurados em sistemas operacionais são os parâmetros de kernel.0 15 Puppet Forge Ao longo da história da computação. mas felizmente alguém já deve ter resolvido esse problema. e que com pouquíssimas linhas em um manifest podemos poupar horas e horas de trabalho aproveitando módulos úteis desenvolvidos por SysAdmins ao redor do mundo. no mundo da administração de sistemas. Infelizmente..do not interrupt . usando o comando sysctl. Notice: Downloading from https://forgeapi... programadores desenvolveram diversas técnicas para evitar retrabalho. Poderíamos criar um módulo para que essas configurações fossem gerenciadas via Puppet..ipv4.trlinkin-sysctl (v0..Apostila cedida pela Instruct e mantida pela Puppet-BR 67 . certamente um programador competente concentra rotinas repetidas ou parecidas em bibliotecas que podem ser reutilizadas no seu projeto. Não seria incrível se os SysAdmins pudessem aproveitar o trabalho uns dos outros? Para isso o Puppet Forge foi criado (https://forge. Já existem vários módulos para tratar esse problema.0. Configurando e instalando servidores web. aproveitar soluções de problemas que já foram resolvidos por outro administrador é muito raro. Usando o módulo.0 BR .ip_forward': value => '1'. 1. enable=>true }" Licença CC BY-SA 3. por isso a escolha): # puppet module install trlinkin/sysctl Notice: Preparing to install into \ /etc/puppetlabs/code/environments/production/modules .. SysAdmins de diferentes organizações estão resolvendo os mesmos problemas todos os dias. Estão disponíveis aos programadores bibliotecas de código que implementam diversas funcionalidades prontas para uso. Vamos instalar um deles (já testado anteriormente.com 2. banco de dados.puppet.

puppetlabs-stdlib (v4.com..0 4.pp: no node 'node1. por exemplo: # puppet agent -t Info: Retrieving plugin /File[/var/lib/puppet/lib/puppet]/ensure: created /File[/var/lib/puppet/lib/puppet/provider]/ensure: created /File[/var/lib/puppet/lib/puppet/provider/sysctl]/ensure: created /File[/var/lib/puppet/lib/puppet/provider/sysctl/parsed.domain. Declare o módulo autofsck na configuração de node1: node 'node1..ipv4. } } 5. Notice: Installing -.do not interrupt .12.0) 2.17 seconds 15. /etc/puppetlabs/code/environments/production/manifests/site..br' { sysctl { 'net..rb]/ensure: defined content as \ '{md5}cb94b98fb045257517de45c9616f2844' Info: Caching catalog for node1. Instale o módulo jhoblitt/autofsck: # puppet module install jhoblitt/autofsck Notice: Preparing to install into \ /etc/puppetlabs/code/environments/production/modules .ip_forward': value => '1'.. Notice: Downloading from https://forgeapi.br' { include autofsck } Licença CC BY-SA 3..domain.ip_forward' from '0' to '1' Info: FileBucket adding {md5}228c966fd2676164a120f5230fe0b0e1 Finished catalog run in 0.puppet Info: Applying configuration version '1353001737' /Stage[main]//Node[node1.puppet]/Sysctl[net. Aplique essa regra no node1.Apostila cedida pela Instruct e mantida pela Puppet-BR 68 .0) |--.puppet]/Sysctl[net.ipv4. Ou declarando um valor para um dos nossos nodes.Apostila Puppet versão 2.ip_forward]/enable: modified \ running value of 'net.com .rb]/ensure: defined \ content as '{md5}46bedf16cafa5af507d0aef0d9e126b2' /File[/var/lib/puppet/lib/puppet/type]/ensure: created /File[/var/lib/puppet/lib/puppet/type/sysctl.2 Prática: módulo para autofsck do Puppet Forge 1.0 BR .ipv4.ipv4.puppetlabs.ip_forward]/value: \ value changed '0' to '1' /Stage[main]//Node[node1. enable => true.com. /etc/puppetlabs/code/environments/production/modules |--| jhoblitt-autofsck (v1.1.

Apostila cedida pela Instruct e mantida pela Puppet-BR 69 .Apostila Puppet versão 2. Execute o agente em node1: # puppet agent -t Licença CC BY-SA 3.0 BR .0 3.

erb. Além do cuidado extra de garantir que ambos estivessem corretos.conf. Licença CC BY-SA 3.conf. de outra.conf': ensure => 'file'. Vamos usar como exemplo um módulo chamado foo: # cd /etc/puppetlabs/code/environments/production/modules/ # mkdir -p foo/manifests # mkdir -p foo/templates Adicione o conteúdo abaixo ao arquivo /etc/puppetlabs/code/environments/production/modules/foo/manifests/init.0 16 Templates Muitas vezes temos um mesmo serviço ativado em diversas máquinas.0 BR . Colocamos uma lógica e valores de variáveis que venham do seu código. Assim. cada conjunto de máquinas precisaria de um arquivo de configuração específico.pp: # vim /etc/puppetlabs/code/environments/production/modules/foo/manifests/init. Então. tornando a nossa configuração mais robusta. mesmo que esse arquivo tivesse uma ou duas linhas de diferença.conf. Adicione o conteúdo abaixo ao arquivo /etc/puppetlabs/code/environments/production/modu les/foo/templates/foo. quando fosse necessário atualizar uma opção de configuração que é comum aos dois conjuntos de máquinas. seria necessário atualizar dois arquivos de configuração. em que podemos usar somente um arquivo de dentro dele. content => template('foo/foo. mas em um conjunto de máquinas esse serviço precisa ser configurado de uma maneira e.erb var1=<%= @var1 %> var2=<%= @var2 %> <% if @osfamily == 'RedHat' %> var3=RedHat <% else %> var3=Outro <% end %> Repare que as variáveis do manifest estão disponíveis dentro da template. inclusive as variáveis do facter.conf. que processa o arquivo foo.Apostila Puppet versão 2. O Puppet tem um recurso de templates.pp class foo { $var1 = '123456' $var2 = 'bar' file {'/tmp/foo. no restante das máquinas.Apostila cedida pela Instruct e mantida pela Puppet-BR 70 .erb') } } Até aqui nós usávamos o atributo content com uma string contendo o que queríamos dentro do arquivo.erb: # vim /etc/puppetlabs/code/environments/production/modules/foo/templates/foo. mas agora estamos usando a função template().

Apostila cedida pela Instruct e mantida pela Puppet-BR 71 . que é a linguagem padrão de templates do Ruby.erb".erb.05 seconds # cat /tmp/foo. Ela é simples e poderosa. possibilitando configurações sofisticadas. template('foo/foo.erb") 16. seguido do nome do arquivo de template que usaremos.conf-2. template("foo/foo.conf-1.0 BR . "foo/foo.0 Nota Localização de uma template no sistema de arquivos Note que o caminho que deve ser passado para a função template() deve conter o nome do módulo. Usando o módulo foo em uma máquina CentOS/Red Hat: # puppet apply -e 'include foo' /Stage[main]/Foo/File[/tmp/foo.1 Sintaxe ERB Um arquivo de template no Puppet usa a sintaxe ERB.conf.conf.Apostila Puppet versão 2.erb') significa abrir o arquivo /etc/puppetlabs/code/environments/production/modules/foo/templates/foo.conf]/ensure: defined content as \ '{md5}8612fd8d198746b72f6ac0b46d631a2c' Finished catalog run in 0. • Comentário: <%# isso será ignorado %> • Extrai o valor de uma variável: <%= @qualquer_variavel %> Licença CC BY-SA 3.conf var1=123456 var2=bar var3=RedHat Dica Concatenando templates A função template() pode concatenar várias templates de uma vez só. Portanto.

Apostila Puppet versão 2.0 • Condições: <% if @var1 != "foo" %> <%= @var1 %> is not foo! <% end %> • Verificar se uma variável existe: <% if @boardmanufacturer then %> Essa maquina é do fabricante type: <%= @boardmanufacturer %> <% end %> • Iteração em um array chamado frutas: <% @frutas. 1. assim o arquivo final não conterá linhas em branco: <% if @osfamily == 'RedHat' %>var3=RedHat<% else %>var3=Outro<% end %>.Apostila cedida pela Instruct e mantida pela Puppet-BR 72 .each do |val| %> Nome: <%= val %> <% end %> Dica Evitando linhas em branco Repare que no exemplo do arquivo /tmp/foo. Colocar todo o código em apenas uma linha. A outra opção é colocar um hífen no final de cada tag.0 BR . existem dois jeitos de resolvermos.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. 2. assim o ERB não retornará uma linha em branco: <% if @osfamily == 'RedHat' -%> var3=RedHat <% else -%> var3=Outro <% end -%> Licença CC BY-SA 3.

Licença CC BY-SA 3. acesse a página abaixo. Use o módulo no node1. execute o agente e confira o resultado no arquivo /etc/motd. Crie a estrutura básica de um módulo chamado motd: # cd /etc/puppetlabs/code/environments/production/modules/ # mkdir -p motd/{manifests.puppet.com'.puppet.com'] file {'/etc/motd': ensure => 'file'. Defina a classe motd em motd/manifests/init. falar com: <% @admins.html 16.com'.<%= @operatingsystem -%> <%= @operatingsystemrelease %> Kernel: <%= @kernel -%> <%= @kernelversion %> Em caso de problemas. https://docs. } } 3.com/puppet/latest/reference/lang_template_erb. https://docs.erb").Apostila Puppet versão 2.pp. 'Edu e@foo. mode => '0644'.0 BR . Crie a template em motd/templates/motd.each do |adm| -%> <%= adm %> <% end -%> 4.html Para saber mais detalhes sobre o uso de linguagens para manipulação de templates no Puppet.2 Prática: usando templates 1.Apostila cedida pela Instruct e mantida pela Puppet-BR 73 .erb com o conteúdo abaixo: Bem vindo a <%= @fqdn -%> . conforme o código abaixo: class motd { $admins = ['Joao j@foo. content => template("motd/motd. 'Bia b@foo. acesse a página abaixo.0 Dica Mais informações sobre a sintaxe ERB Para saber mais detalhes sobre a sintaxe ERB.com/puppet/latest/reference/lang_template.templates} 2.

domain. No Puppet Master. podemos chamar o agente passando o environment pela linha de comando: puppet agent -t --environment desenv. No Puppet Master faça uma cópia do ambiente production para desenv: # cd /etc/puppetlabs/code/environments/ # cp -a production desenv 2.com. o agente envia ao Puppet Master um environment chamado production.br está declarado no arquivo /etc/puppetlabs/code/environments/desenv/manifests/site.com.erb 4.1 Prática: configurando environments Os comandos abaixo são executados no master.domain. como separar um ambiente em DMZ.Apostila cedida pela Instruct e mantida pela Puppet-BR 74 .com.com.domain.com.conf do node1.br acrescente o environment: [main] environment = desenv Dica Enviroment em linha de comando Opcionalmente.br (certifique-se de que o node1.pp e possui a classe motd declarada): Licença CC BY-SA 3.conf. O uso de environments introduz uma série de outras possibilidades.br e no node1. No arquivo /etc/puppetlabs/puppet/puppet. 17. vamos modificar a template do módulo motd no environment desenv. 3.br 1.domain. apenas acrescentando uma linha ao final: # cd /etc/puppetlabs/code/environments/desenv/modules/motd/templates # echo "Puppet versão <%= @puppetversion -%>" >> motd. Cada environment pode servir um conjunto diferente de módulos. dividir tarefas entre administradores de sistemas ou dividir o seu parque por tipo de hardware.0 BR . usando-os em sistemas destinados a testes. Por padrão. Isso é usado geralmente para gerenciar versões de módulos. chamados environments. Execute o agente Puppet no node1.0 17 Environments O Puppet permite você dividir os seus sistemas em diferentes conjuntos de máquinas. Sempre que um node faz um pedido de configuração ao Puppet Master. O environment de um node é especificado no arquivo puppet.Apostila Puppet versão 2. o environment do node é utilizado para determinar a qual configuração e quais módulos serão forneceidos.domain.

0 BR . a nova versão do módulo motd será utilizada a partir de agora. Uma vez que o módulo no environment desenv esteja aprovado. Licença CC BY-SA 3.Apostila cedida pela Instruct e mantida pela Puppet-BR 75 . # rsync -a /etc/puppetlabs/code/environments/desenv/modules/motd/ \ /etc/puppetlabs/code/environments/production/modules/motd/ 6.Apostila Puppet versão 2. um para cada environment.0 # puppet agent -t 5. Nos nodes que são do environment production. ele pode ser copiado para o environment production com o comando a seguir. Agora temos dois módulos motd.

com o Hiera eles serão armazenados externamente.com/crayfishx/hiera-mysql 18. Outros datasources podem ser suportados com plugin adicionais. com o Hiera você pode definir dados comuns para a maioria dos seus nodes e sobrescrever dados para nodes específicos.Apostila Puppet versão 2.com/crayfishx/hiera-http • https://github.1 Hiera Datasources O Hiera suporta nativamente os datasources YAML e JSON. 18. O Hiera permite separar os dados do código Puppet.0 18 Hiera O Hiera é uma ferramenta que busca por dados de configuração de seus manifests.0 BR .I.yaml :yaml: :datadir: '/etc/puppetlabs/code/environments/production/hieradata/meucliente' Observe que na configuração do arquivo.Apostila cedida pela Instruct e mantida pela Puppet-BR 76 . estamos definindo a seguinte sequencia de pesquisa: • host/fqdn • host/hostname • os/osfamily • domain/domain • common E definimos também que o backend é o YAML e que os arquivos ficarão no diretório /etc/puppetlabs/code/environments/production/hieradata/meucliente.2 Configurando Hiera A primeira coisa a se fazer é criar o arquivo /etc/puppetlabs/code/hiera."host/%{::hostname}" . Ao invés dos dados serem armazenados dentro de um manifest. Ou seja. Se esse diretório não existir.Piennar (que também criou o extlookup)."host/%{::fqdn}" . veja o exemplo abaixo: --:hierarchy: . Veja os links abaixo: • https://github. Ele foi criado pelo R. Com ele você pode definir dados para diferentes nodes usando o mesmo código. o backend e o local onde ele deverá procurar os arquivos. # mkdir -p /etc/puppetlabs/code/environments/production/hieradata/meucliente Licença CC BY-SA 3.yaml e definir a hierarquia de pesquisa. O Hiera facilita a configuração de seus nodes de forma que podemos ter configurações com dados default ou então vários níveis de hierarquia."os/%{::osfamily}" ."common" :backends: . crie-o."domain/%{::domain}" .

0 BR .Apostila cedida pela Instruct e mantida pela Puppet-BR 77 .domain.com.Apostila Puppet versão 2.yaml touch common.domain.br. Se houverem variàveis com o mesmo nome e valores diferentes em vários arquivos. A seguir está o exemplo do conteúdo de cada arquivo. por exemplo: • host/node1.br.0.'/home/puppetbr/content2/' Exemplo do conteúdo do arquivo host/node2.yaml. são definidos os valores para as variàveis a serem usadas nos manifests.yaml: #SSH ssh_port: '2220' ssh_allow_users: 'teste' #Postfix smtp_port: '587' Licença CC BY-SA 3.com.yaml • common.yaml touch host/node1.yaml touch os/redhat.0 Dentro desse diretório ficarão os diretórios e arquivos a seguir.yaml touch host/node2. Exemplo do conteúdo do arquivo host/node1.yaml • os/redhat.br.yaml Dentro de cada arquivo YAML.yaml touch domain/domain.1' #Diretorio de conteudos content_dir: .0.br.'/home/puppetbr' .yaml • host/node2.yaml # # # # # # # # # # 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. Essas variáveis podem ter valores diferentes para cada arquivo especificado no exemplo acima. o Hiera seguirá a ordem de prioridade da hierarquia dos dados que definimos no arquivo /etc/puppetlabs/puppet/hiera.br.yaml: #SSH ssh_port: '22' ssh_allow_users: 'puppetbr teste' #Postfix smtp_port: '25' smtp_server: '127.yaml • domain/domain.yaml • os/ubuntu.com.domain.com.com.

br.'/home/puppetbr' .0 Exemplo do conteúdo do arquivo domain/domain.yaml: #Apache apache_service: apache2 #SSH ssh_port: '22' ssh_allow_users: 'puppetbr teste' #Postfix smtp_port: '25' smtp_server: '127.bz2' deploy_scripts: true scripts_version: 1.0.0 Exemplo do conteúdo do arquivo os/ubuntu.1' #Diretorio de conteudos content_dir: .0 BR .yaml: #Apache apache_service: apache2 Exemplo do conteúdo do arquivo os/redhat.yaml: #Apache apache_service: httpd Exemplo do conteúdo do arquivo common.0.0 Licença CC BY-SA 3.com.yaml: scripts_version: 2.Apostila Puppet versão 2.'/home/puppetbr/content/' config_package: 'config.tar.Apostila cedida pela Instruct e mantida pela Puppet-BR 78 .

br.0 Usando o exemplo dado anteriormente.yaml Depois que o Hiera é configurado. # service puppetserver restart 18. O Hiera retornará o valor nil quando não encontrar um valor para a variável especificada na busca.yaml • domain/domain.3 Comandos e consultas Hiera Execute o hiera para uma pesquisa seguindo a hierarquia definida.0 BR . se queremos obter um valor definido para a variável apache_service.1/ Hiera podem ser encontradas nesta página: 18. 1.4 Criando um módulo para usar dados vindos do Hiera Agora que já configuramos o Hiera para localizar dados da estrutura do meucliente. o serviço puppetserver precisa ser reiniciado.yaml • host/node2.com. Nota Mais documentação sobre o Hiera Mais informações sobre o https://docs. # hiera apache_service Execute o hiera especificando parâmetros de busca: # hiera apache_service -yaml ubuntu.yaml • common.br.puppet.domain. crie a estrutura básica de um módulo doc: # cd /etc/puppetlabs/code/environments/production/modules # mkdir -p doc/manifests # mkdir -p doc/templates Licença CC BY-SA 3. o Hiera tentará obter este valor lendo a seguinte sequencia de arquivos e retornará o primeiro valor que encontrar para essa variável.yaml • os/ubuntu.yaml É bem simples fazer a pesquisa e testar se vai retornar o que você está esperando. • host/node1. caso não seja possível obter via Hiera.Apostila Puppet versão 2. Primeiramente.com. vamos criar um módulo que usará esses dados e que também definirá valores padrão para as variáveis.com/hiera/3.Apostila cedida pela Instruct e mantida pela Puppet-BR 79 .yaml • os/redhat.

pp (código principal) e o params. ['/home/puppetbr'. '/home/puppetbr/content/']) $config_package = hiera('config_package'. mode => '0644'. '127.0. 'puppetbr teste') #SMTP $smtp_server = hiera('smtp_server'. $config_package = $doc::params::config_package. true) $scripts_version = hiera('scripts_version'.0') #Apache $apache_service = hiera('apache_service'.tar. $content_dir = $doc::params::content_dir. content => template("doc/documentation. ) inherits doc::params { file { '/tmp/doc.txt. $scripts_version = $doc::params::scripts_version.0 2.Apostila cedida pela Instruct e mantida pela Puppet-BR 80 . '22') $ssh_allow_users = hiera('ssh_allow_users'.pp $apache_service = $doc::params::apache_service.txt': ensure => 'file'.erb"). $smtp_server = $doc::params::smtp_server. $deploy_scripts = $doc::params::deploy_scripts. 'config.bz2') $deploy_scripts = hiera('deploy_scripts'.pp class doc( #Usando as variaveis definidas no manifest params. 'apache2') #SSH $ssh_port = hiera('ssh_port'. group => 'root'.0. # vim doc/manifests/init. '25') } Licença CC BY-SA 3. $ssh_port = $doc::params::ssh_port. $smtp_port = $doc::params::smtp_port. '1.1') $smtp_port = hiera('smtp_port'. O nosso módulo doc terá dois manifests: o init.pp class doc::params { #Variaveis gerais $content_dir = hiera('content_dir'. $ssh_allow_users = $doc::params::ssh_allow_users. } } # vim doc/manifests/params. owner => 'root'.pp (apenas para declaração de variáveis).Apostila Puppet versão 2.0 BR .

1 Diretorio de conteudos=["/home/puppetbr".0.br' { include doc } 4.0 Licença CC BY-SA 3. "/home/puppetbr/content2/"] #Informacoes sobre a atualizacao do Script PACKAGE=config.0 BR .0.Apostila cedida pela Instruct e mantida pela Puppet-BR 81 .pp dessa maneira: # vim /etc/puppetlabs/code/environments/production/modules/doc/manifests/params.com.txt e observe se o conteúdo está como o esperado.pp node 'node1.domain.bz2 ENABLE_DEPLOY=true PACKAGE_VERSION=1.erb #Informacoes sobre SSH SSH_PORT=<%= @ssh_port %> Usuario que podem acessar o SSH=<%= @ssh_allow_users %> Distribuição 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 %> 3.Apostila Puppet versão 2.tar. Em node1 aplique a configuração: # puppet agent -t Agora veja o conteúdo do arquivo /tmp/doc. #Informacoes sobre SSH SSH_PORT=22 Usuario que podem acessar o SSH=puppetbr teste Distribuição GNU/Linux=Debian Hostname=node1 Qual é o nome do processo do Apache nesta distro? apache2 #Informacoes sobre o servico de envio de email SMTP_PORT=25 SMTP_SERVER=127.txt.0 # vim doc/templates/documentation. Deixe o código de site.

br.br. Licença CC BY-SA 3.com. 6.com.Apostila Puppet versão 2.yaml para # cd /etc/puppetlabs/code/environments/production/hieradata/meucliente/host/ # mv node1.domain. Em node1 aplique a configuração: # puppet agent -t Agora observe o que mudou no conteúdo do arquivo /tmp/doc.domain.domain. Em master.br /root/manifests.0 5.0 BR .Apostila cedida pela Instruct e mantida pela Puppet-BR 82 .txt.com.yaml /root/manifests. mova o arquivo node1.

Usando o Augeas ficamos livres de problemas como tratar linhas em branco ou com comentários.conf/search/domain = "domain. recorremos a soluções simples usando grep. Com isso.8.8.br" /files/etc/resolv.conf /files/etc/resolv. sed. e atualmente são suportados mais de 100 formatos diferentes. Vamos trocar o valor da opção domain do resolv.8. O pacote puppet-agent já traz o augtool em /opt/puppetlabs/puppet/bin.4.conf/domain = "domain.8" /files/etc/resolv.conf/nameserver[1] = "8. Para dar suporte a diversos formatos de arquivos de configuração.conf (a opção -s diz ao augtool para salvar a alteração): Licença CC BY-SA 3.8.8.8 nameserver 8. tem-se muito trabalho para manipular esses arquivos e o resultado final nunca é flexível ou muito confiável.com. awk ou alguma linguagem de script.4 Como o Augeas o representa: # /opt/puppetlabs/puppet/bin/augtool print /files/etc/resolv.0 19 Augeas Muitas vezes precisamos manipular arquivos de configuração e.0 BR .conf /files/etc/resolv. o Augeas usa o que ele chama de Lenses (lentes). geralmente.br nameserver 8.conf domain domain.4.conf/search /files/etc/resolv.com. Uma lente é um registro de como um arquivo de configuração deve ser suportado pelo Augeas. Vejamos como o arquivo /etc/resolv.Apostila cedida pela Instruct e mantida pela Puppet-BR 83 .conf está configurado: # cat /etc/resolv.4" O Augeas monta uma estrutura hierárquica da configuração. Usando um caminho completo da configuração.br search domain.com.8.br" /files/etc/resolv.conf/nameserver[2] = "8. podemos manipular de diversas formas arquivos de configuração.com. As alterações são feitas manipulando essa árvore e salvando-a de volta ao formato nativo do arquivo de configuração. podemos manipular os arquivos sem recorrer a edição manual.Apostila Puppet versão 2. através dele. que analisa arquivos de configuração em seus formatos nativos e os transforma em uma árvore. 19.1 Usando o Augeas O comando augtool é um pequeno interpretador de comandos e. O Augeas é uma ferramenta para edição segura de arquivos de configuração.

8.com.br.8.8. simplesmente executando o augtool: # /opt/puppetlabs/puppet/bin/augtool augtool> 2. set. Agora vamos utilizar o interpretador de comandos do Augeas.br nameserver 8. adicionar um terceiro nameserver e depois removê-lo: # /opt/puppetlabs/puppet/bin/augtool -s set /files/etc/resolv.1 Prática: manipulando o arquivo /etc/hosts Os comandos abaixo podem ser executados na máquina node1.conf/nameserver[3] 1 Saved 1 file(s) # cat /etc/resolv.4.8 nameserver 8.br nameserver 8. então nameserver[1] é 8.8. Dentro do interpretador. o Augeas trata a opção nameserver como um vetor.4.domain. pois podemos configurar vários servidores de nomes em nosso sistema.8.1.1 Saved 1 file(s) # cat /etc/resolv.8.4.com. os comandos print.8.4 19.conf domain outrodominio search domain.8 nameserver 8. rm funcionam como na linha de comando. Podemos incluir e remover valores no vetor.0 # /opt/puppetlabs/puppet/bin/augtool -s set /files/etc/resolv.8. 1.1. Podemos associar o caminho no sistema de arquivos com uma opção de configuração: Licença CC BY-SA 3.8 nameserver 8.1. Por exemplo.conf domain outrodominio search domain.8.Apostila cedida pela Instruct e mantida pela Puppet-BR 84 .conf/nameserver[3] 1.1.8 e nameserver[2] é 8.com. Devido a isso.conf/domain outrodominio Saved 1 file(s) # cat /etc/resolv.1.4.8.conf a opção nameserver pode aparecer mais de uma vez.8.com.conf domain outrodominio search domain.4 Em um arquivo resolv.conf/nameserver[3] rm : /files/etc/resolv.0 BR .4 nameserver 1.8.Apostila Puppet versão 2.4.1 # /opt/puppetlabs/puppet/bin/augtool -s rm /files/etc/resolv.br nameserver 8.

conf'.Apostila Puppet versão 2.br.8.domain.2 Augeas e Puppet O Puppet fornece um resource para que os poderosos recursos de edição do Augeas possam ser usados nos manifests.conf domain = outrodominio search/ = (none) nameserver[1] = 8. "set PasswordAuthentication no".conf': context => '/files/etc/resolv.4.domain. } Garante que o servidor esteja sempre no runlevel correto: Licença CC BY-SA 3. 'set nameserver[2] 8.com. } Outro exemplo. changes => ['set nameserver[1] 8.4. De posse do número do registro do host node1.br.8. 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 5. Verifique se node1 está presente no /etc/hosts 19.0 augtool> ls /files/etc/resolv. ].8.Apostila cedida pela Instruct e mantida pela Puppet-BR 85 .8.4'.8. porém agora com um manifest: augeas {'resolv.8'.4 3.8 nameserver[2] = 8. augtool> print /files/etc/hosts 4. Use o comando print no arquivo /etc/hosts. changes => [ "set PermitRootLogin no". "set RSAAuthentication yes".conf. Manipulando o /etc/resolv.8.com. que garante a configuração correta de /etc/ssh/sshd_config: augeas { "sshd_config": context => "/files/etc/ssh/sshd_config". ].0 BR . "set PubkeyAuthentication yes". "set Port 22221". Identifique qual é o número do registro do host node1.

Apostila cedida pela Instruct e mantida pela Puppet-BR 86 . ].Apostila Puppet versão 2.0 augeas { "runlevel": context => "/files/etc/inittab". } Licença CC BY-SA 3. changes => [ "set id/runlevels 3".0 BR .

0 20 Puppet no Windows O suporte a Windows no Puppet vem melhorando a cada nova versão. Execute o instalador do Puppet-Agent.0 BR .com. Também precisaremos usar a máquina master. Praticamente onde é possível criar compatibilidade.domain.br. Mas não é possível hospedar o Puppet Server no Windows.puppet.msi (Windows 64 bits) • https://downloads. Para obter detalhes sobre a instalação do Puppet Agent https://docs.puppetlabs.br. Em alguns casos são necessários certos cuidados devido as diferenças semânticas entre sistemas Unix-like e Windows. Baixe o instalado mais novo do Puppet-Agent para Windows em: • https://downloads.html no Windows acesse: 20.com/puppet/latest/reference/install_windows.com. preencha com master.com/windows/puppet-agent-x64-latest.msi (Windows 32 bits) 2.domain.Apostila Puppet versão 2. Licença CC BY-SA 3.br. sendo somente o agente suportado. Em uma delas será perguntando qual é o servidor master.domain.1 Prática: Instalação Para a realização dessa prática é necessário você instalar uma terceira máquina com o Windows 7 e aqui chamaremos de win7.br.puppetlabs.com. Aparecerão as telas a seguir. os resources do Puppet suportam Windows normalmente.com. Faça login na máquina win7.com/windows/puppet-agent-x86-latest. 1.domain.Apostila cedida pela Instruct e mantida pela Puppet-BR 87 .

0 Licença CC BY-SA 3.Apostila Puppet versão 2.Apostila cedida pela Instruct e mantida pela Puppet-BR 88 .0 BR .

Apostila Puppet versão 2.0 BR .0 3.Apostila cedida pela Instruct e mantida pela Puppet-BR 89 . pois realizaremos manualmente nossas atividades: sc stop puppet Licença CC BY-SA 3. Pare o serviço Puppet.

como o serviço Puppet estava em execução. Execute o agente da mesma maneira que no GNU/Linux.domain.com. ou seja.domain.br.br" (SHA256) EE:58:97:E3:6F:64:15:DF:68:A4:21:DA:A3:E2:81:43:3F: . afinal ele precisa configurar o sistema.Apostila cedida pela Instruct e mantida pela Puppet-BR 90 . # puppet cert sign win7.domain.0 5.br Removing file Puppet::SSL::CertificateRequest win7.com.com.0 BR . assine o certificado: # puppet cert list "win7. o Puppet precisa de privilégios elevados para funcionar corretamente.. sempre com privilégios elevados. Como de praxe.br Signed certificate request for win7..domain.com. puppet agent -t Nota Privilégios No Windows. Abra um prompt de comando como Administrador. Quando usar a linha de comando. O serviço do Puppet é executado com privilégio LocalSystem.Apostila Puppet versão 2.pem' 6.com. é sempre necessário utilizar o Puppet com privilégios elevados. Após a instalação. Licença CC BY-SA 3.br at \ '/var/lib/puppet/ssl/ca/requests/win7. conforme ilustra a figura abaixo: 7.domain. um certificado já foi solicitado ao master.

domain.domain.com. source => 'c:\Users\Puppet\Downloads\7z1602.0 20.exe'.br.com.0 BR . { 'INSTALLDIR' => 'C:\Program Files\7-Zip' } ]. Caso o título seja diferente.pp: node win7.Apostila cedida pela Instruct e mantida pela Puppet-BR 91 .br e master.02': ensure => 'installed'. Aplique o agente (lembre-se de usar um prompt com privilégios elevados) puppet agent -t Dica Título do resource package O título do resource package precisa ser igual a propriedade DisplayName utilizada no registro do Windows para instalação de um pacote MSI.domain.br. install_options => ['/q'.com.org/a/7z1602.2 Prática: resources para Windows Essa prática é realizada em win7. Declare o seguinte no arquivo /etc/puppetlabs/code/environments/production/manifests/site. } } 2. Na máquina win7.exe e copie para c:. 1.7-zip.domain.br { package {'7-Zip 16. Licença CC BY-SA 3.Apostila Puppet versão 2. baixe o pacote http://www.com. o Puppet executará a instalação em todas as execuções.

0 BR .Apostila Puppet versão 2. Agora vamos configurar um serviço. Veja que o 7-Zip foi instalado: 4.0 3.com.pp win7. Declare o seguinte no site.domain. } 5. Aplique o agente (lembre-se de usar um prompt com privilégios elevados) puppet agent -t Licença CC BY-SA 3. NOT_PAUSABLE. enable => false. IGNORES_SHUTDOWN) : 0 (0x0) : 0 (0x0) : 0x0 : 0x0 6.br: para o node service {'Audiosrv': ensure => 'stopped'. Note que o serviço está em execução (terminal com privilégio regular): C:\> sc query audiosrv SERVICE_NAME: audiosrv TYPE STATE WIN32_EXIT_CODE SERVICE_EXIT_CODE CHECKPOINT WAIT_HINT : 20 WIN32_SHARE_PROCESS : 4 RUNNING (STOPPABLE.Apostila cedida pela Instruct e mantida pela Puppet-BR 92 .

Execute o agente no Windows para instalação do módulo puppetlabs-registry (lembre-se de abrir o terminal do Puppet como Administrator): # puppet agent -t 3.domain. Veja que o serviço Windows Audio foi parado e desativado. C:\>sc query audiosrv SERVICE_NAME: audiosrv TYPE STATE WIN32_EXIT_CODE SERVICE_EXIT_CODE CHECKPOINT WAIT_HINT : : : : : : 20 WIN32_SHARE_PROCESS 1 STOPPED 0 (0x0) 0 (0x0) 0x0 0x0 Para mais detalhes sobre as diferenças http://docs. 1..12.domain.3) |-... Downloading from https://forge.. Declare uma chave de registro no nosso manifest: node 'win7.com.domain.do not interrupt .com. Installing -.com .puppetlabs-stdlib (v4.Apostila cedida pela Instruct e mantida pela Puppet-BR 93 . data => 'c:\adware\adware.br e master.br: # puppet module install puppetlabs/registry Preparing to install into /etc/puppetlabs/code/environments/production/modules .0 BR ..1.puppetlabs-registry (v1.0 7..com.com.puppetlabs.Apostila Puppet versão 2.exe' } } 4.br' { registry::value { 'Adware': key => 'HKLM\Software\Microsoft\Windows\CurrentVersion\Run'. value => 'Adware'.puppetlabs. 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 Licença CC BY-SA 3.html na declaração dos resources no Windows: 20.0) 2.br. Instalando o módulo puppetlabs-registry em master.com/windows/writing.domain.3 Prática: manipulando o registro Essa prática é realizada em win7. /etc/puppetlabs/code/environments/production/modules |-.

Apostila Puppet versão 2.0

5. A chave foi criada.

Licença CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
94

Apostila Puppet versão 2.0

21 Outras Fontes de estudo
Abaixo são listados vários links para você acessar e se aprimorar nos estudos.
Slides:
• https://speakerdeck.com/gutocarvalho/meetup-puppet-br-20160217-origens-devops
• https://speakerdeck.com/gutocarvalho/meetup-puppet-br-20160518-intro-puppet
• https://speakerdeck.com/gutocarvalho/meetup-puppet-br-20160217-introducao-ao-puppet-4
• http://www.slideshare.net/PuppetLabs
Documentação para começar a usar o Puppet:
• http://blog.aeciopires.com/configurando-um-ambiente-puppet/
• http://blog.aeciopires.com/configurando-um-ambiente-puppet-2/
• http://gutocarvalho.net/octopress/2015/08/18/instalando-puppet-4-agent-and-master/
• http://gutocarvalho.net/wordpress/2012/05/23/puppet-documentacao-e-aprendizado/
• http://pt.slideshare.net/GutoCarvalho/oficina-puppet-aprenda-a-gerenciar-configuraes
• http://gutocarvalho.net/dokuwiki/doku.php?id=puppet_serverless
• https://docs.puppetlabs.com/puppet_core_types_cheatsheet.pdf
Documentação para desenvolver manifests, classes e módulos no Puppet:
• https://docs.puppetlabs.com/pe/latest/quick_start.html
• https://docs.puppetlabs.com/guides/style_guide.html
• http://gutocarvalho.net/octopress/2013/04/20/puppet-style-guide/
• https://speakerdeck.com/gutocarvalho/meetup-puppet-br-20160518-desenvolvendo-modulos-e-fatos-puppet
• http://gutocarvalho.net/octopress/2013/04/22/puppet-melhores-praticas/
• http://pt.slideshare.net/GutoCarvalho/trabalhando-com-mdulos-no-puppet
• https://speakerdeck.com/gutocarvalho/meetup-puppet-br-20160518-testes-de-codigo-puppet
• https://docs.puppetlabs.com/guides/module_guides/bgtm.html
• https://docs.puppetlabs.com/puppet/latest/reference/modules_fundamentals.html
• https://docs.puppetlabs.com/pe/latest/puppet_modules_manifests.html
• https://docs.puppetlabs.com/puppet/latest/reference/lang_classes.html
Documentação geral sobre Puppet:
• http://docs.puppetlabs.com/
• http://docs.puppetlabs.com/puppet/latest/reference/
• http://www.example42.com/tutorials/PuppetTutorial/
• http://puppet-br.org/documentacao/

Licença CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
95

Apostila Puppet versão 2.0
Cursos online e grátis sobre Puppet:
• https://learn.puppetlabs.com/category/self-paced-training
Puppet no Windows:
• http://docs.puppetlabs.com/windows/
Livros sobre Puppet:
• http://www.puppetcookbook.com/
• http://shop.oreilly.com/product/0636920034131.do
• http://shop.oreilly.com/product/0636920038528.do
• https://www.packtpub.com/networking-and-servers/puppet-4-essentials-second-edition
• https://www.packtpub.com/networking-and-servers/mastering-puppet-second-edition
• https://www.packtpub.com/networking-and-servers/extending-puppet-second-edition
• https://www.packtpub.com/networking-and-servers/learning-puppet-windows-server
• https://www.packtpub.com/networking-and-servers/puppet-containerization
• https://www.packtpub.com/all/?search=puppet
• http://search.oreilly.com/?q=puppet&x=0&y=0
• https://puppetlabs.com/resources/books
PuppetExplorer:
• https://github.com/spotify/puppetexplorer
• http://demo.puppetexplorer.io
• http://blog.aeciopires.com/instalando-configurando-puppetdb-puppetexplorer-puppetboard/
• https://speakerdeck.com/gutocarvalho/meetup-puppet-br-20160518-projeto-pcp
• https://github.com/puppet-br/pcp
Puppetboard:
• https://github.com/puppet-community/puppetboard
• http://blog.aeciopires.com/instalando-configurando-puppetdb-puppetexplorer-puppetboard/
• http://domarques.com.br/blog/2014/08/puppet-e-puppetboard-para-automatizacao-de-servidores
• http://www.credativ.de/blog/howto-puppetdb-installation
• https://ask.puppetlabs.com/question/3557/how-to-refresh-puppet-master-cached-catalog/
• https://github.com/puppet-br/pcp

Licença CC BY-SA 3.0 BR - Apostila cedida pela Instruct e mantida pela Puppet-BR
96

com/puppetlabs/geppetto/wiki/Puppet-Code-Formatter • Kate: • http://kate-editor.com/articles/Git/article.com/book/en/v2 • http://stackoverflow.com/puppetlabs/geppetto/commit/30468cbb41d83678b898865cba72f19cf4249a73 • http://binford2k.com/ • http://rogerdudler.io/geppetto/faq.html • https://github.com/2013/09/30/understanding-github-a-journey-for-beginners-part-1 • http://readwrite.com/tutorial.com/questions/6157730/why-cant-i-push-to-this-bare-repository • https://git-scm.rivendel.Apostila Puppet versão 2. recomendamos fazer parte da comunidade Puppet-BR http://puppet-br.com.html • https://github.com/doc • https://git-scm.github.imgur.openvim.org/comunidade/ Licença CC BY-SA 3.io/geppetto/download.vogella.pdf • http://serverfault.com.0 BR .png • https://github.github.com/rodjek/vim-puppet Git e Github: • https://github.Apostila cedida pela Instruct e mantida pela Puppet-BR 97 .com/gutocarvalho/meetup-puppet-br-20160518-integracao-entre-puppet-e-vagrant • http://search.io/git-guide/index.html • https://git-scm.com/questions/570892/how-to-add-a-puppet-module-to-gepetto-when-using-git • http://puppetlabs.pt_BR.html • http://readwrite.com/sites/default/files/UsingGeppetto.html • http://i.github.com/1tiqn.br/2014/08/20/vagrant-as-vantagens-da-virtualizacao-em-ambiente-local/ • https://speakerdeck.rivendel.com/?q=vagrant&x=0&y=0 Para tirar dúvidas com usuários mais experientes.oreilly.0 Ferramentas sugeridas para desenvolver no Puppet: Geppeto: • http://puppetlabs.com/2013/10/02/github-for-beginners-part-2 • http://www.br/2015/09/18/devops-conhecendo-vagrant/ • http://blog.org/ Vim: • http://www.com/book/pt-br/v1/Git-Essencial-Tagging Vagrant: • http://blog.

1 Colaboradores Aécio Pires: aeciopires @ gmail.net Miguel Di Ciurcio Filho: miguel @ instruct.br http://instruct.com.0 lançada dia 23/06/2016 • Versão 1.br Licença CC BY-SA 3.com http://gutocarvalho.com.Apostila cedida pela Instruct e mantida pela Puppet-BR 98 .0 BR .0 lançada dia 20/03/2014 22.0 22 Histórico de mudanças • Versão 2.Apostila Puppet versão 2.com Guto Carvalho gutocarvalho @ gmail.com http://aeciopires.