Apostila Puppet

Embed Size (px)

Citation preview

  • 5/26/2018 Apostila Puppet

    1/51

    Apostila Puppet Bsico

    http://instruct.com.br/apostila-puppet

    http://instruct.com.br/apostila-puppet
  • 5/26/2018 Apostila Puppet

    2/51

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    2

  • 5/26/2018 Apostila Puppet

    3/51

    Sumrio

    1 Licena de uso desta obra 5

    2 Sobre a Instruct 10

    3 Instalao 11

    3.1 Debian e Ubuntu 11

    3.2 Red Hat / CentOS 12

    4 Resource Abstraction Layer (RAL) 13

    4.1 Manipulando resources via RAL 13

    4.2 Prtica: Modificando recursos interativamente 18

    5 Manifests 19

    5.1 Declarando resources 19

    5.2 Prtica: conhecendo os resources 22

    6 Ordenao 23

    6.1 Meta-parmetros e referncia a recursos 23

    6.2 Prtica: validando o arquivo /etc/sudoers 26

    7 Variveis, fatos e condies 28

    7.1 Variveis 28

    7.2 Fatos 28

    7.3 Condicionais 30

    7.4 Prtica: melhor uso de variveis 338 Laboratrio 34

    9 Master / Agent 35

    9.1 Resoluo de nomes 35

    9.2 Segurana e autenticao 36

    9.3 Prtica Master/Agent 36

    10 Nodes 39

    10.1 Declarando nodes 39

    10.2 Nomes 4010.3 O node default 40

    10.4 Herana 40

    10.5 Prtica 41

    11 Classes e Mdulos 42

    11.1 Classes 42

    11.2 Mdulos 44

    11.3 Prtica: criando um mdulo 44

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    3

  • 5/26/2018 Apostila Puppet

    4/51

    11.4 Prtica: arquivos de configurao em mdulos 45

    12 Templates 47

    12.1 Sintaxe ERB 48

    12.2 Prtica: usando templates 4913 Histrico de mudanas 51

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    4

  • 5/26/2018 Apostila Puppet

    5/51

    1 Licena de uso desta obra

    A OBRA (CONFORME DEFINIDA ABAIXO) DISPONIBILIZADA DE ACORDO COM OS TERMOSDESTA LICENA PBLICA CREATIVE COMMONS ("CCPL" OU "LICENA"). A OBRA PROTEGIDA

    POR DIREITO AUTORAL E/OU OUTRAS LEIS APLICVEIS. QUALQUER USO DA OBRA QUE NO OAUTORIZADO SOB ESTA LICENA OU PELA LEGISLAO AUTORAL PROIBIDO.

    AO EXERCER QUAISQUER DOS DIREITOS OBRA AQUI CONCEDIDOS, VOC ACEITA ECONCORDA FICAR OBRIGADO NOS TERMOS DESTA LICENA. O LICENCIANTE CONCEDE AVOC OS DIREITOS AQUI CONTIDOS EM CONTRAPARTIDA A SUA ACEITAO DESTES TERMOSE CONDIES.

    1. Definies

    a. "Obra Derivada" significa uma Obra baseada na Obra ou na Obra e outras Obraspr-existentes, tal qual uma traduo, adaptao, arranjo musical ou outras alteraes de umaObra literria, artstica ou cientfica, ou fonograma ou performance, incluindo adaptaescinematogrficas ou qualquer outra forma na qual a Obra possa ser refeita, transformada ouadaptada, abrangendo qualquer forma reconhecvel como derivada da original, com exceo daObra que constitua uma Obra Coletiva, a qual no ser considerada uma Obra Derivada paraos propsitos desta Licena. Para evitar dvidas, quando a Obra for uma Obra musical,performance ou fonograma, a sincronizao da Obra em relao cronometrada com umaimagem em movimento (synching) ser considerada uma Obra Derivada para os propsitosdesta Licena.

    b. "Obra Coletiva" significa uma coleo de Obras literrias, artsticas ou cientficas, tais quaisenciclopdias e antologias, ou performances, fonogramas ou transmisses, ou outras Obras oumateriais no indicados na Seo 1(i) abaixo, que em razo da seleo e arranjo do seucontedo, constituam criaes intelectuais nas quais a Obra includa na sua integridade emforma no-modificada, juntamente com uma ou mais contribuies, cada qual constituindoseparada e independentemente uma Obra em si prpria, que juntas so reunidas em um todo

    coletivo. A Obra que constituir uma Obra Coletiva no ser considerada uma Obra Derivada(como definido acima) para os propsitos desta Licena.

    c. "Licena Compatvel Creative Commons" significa uma licena que se encontre listada nosite http://creativecommons.org/compatiblelicenses, aprovada pela Creative Commons comosendo essencialmente equivalente a esta Licena, incluindo ao menos: (i) termos que possuama mesma finalidade, significado e efeito dos Elementos da Licena desta Licena e; (ii)permisso explcita para o relicenciamento de Obras Derivadas das Obras tornadas disponveissob aquela licena, sob esta Licena, uma licena Creative Commons Unported ou uma licenaCreative Commons de outra jurisdio com os mesmos Elementos da Licena desta Licena.

    d. "Distribuir" significa colocar disposio do pblico o original e cpias da Obra ou ObraDerivada, o que for apropriado, por meio de venda ou qualquer outra forma de transferncia depropriedade ou posse.

    e. "Elementos da Licena" significam os principais atributos da licena correspondente,conforme escolhidos pelo Licenciante e indicados no ttulo desta licena: Atribuio,Compartilhamento pela mesma licena.

    f. "Licenciante" significa a pessoa fsica ou jurdica que oferece a Obra sob os termos destaLicena.

    g. "Autor Original" significa, no caso de uma Obra literria, artstica ou cientfica, o indivduo ouindivduos que criaram a Obra ou, se nenhum indivduo puder ser identificado, a editora.

    h. "Titular de Direitos Conexos" significa (i) no caso de uma performance os atores, cantores,msicos, danarinos, e outras pessoas que atuem, cantem, recitem, declamem, participem

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    5

    http://creativecommons.org/compatiblelicenses
  • 5/26/2018 Apostila Puppet

    6/51

    em, interpretem ou faam performances de Obras literrias ou artsticas ou expresses defolclore (ii) no caso de um fonograma, o produtor, sendo este a pessoa ou entidade legal queprimeiramente fixar os sons de uma performance ou outros sons; e (iii) no caso de radiodifuso,a empresa de radiodifuso.

    i. "Obra" significa a Obra literria, artstica e/ou cientfica oferecida sob os termos desta Licena,incluindo, sem limitao, qualquer produo nos domnios literrio, artstico e cientfico,qualquer que seja o modo ou a forma de sua expresso, incluindo a forma digital, tal qual umlivro, brochuras e outros escritos; uma conferncia, alocuo, sermo e outras Obras da mesmanatureza; uma Obra dramtica ou dramtico-musical; uma Obra coreogrfica ou pantomima;uma composio musical com ou sem palavras; uma Obra cinematogrfica e as expressas porum processo anlogo ao da cinematografia; uma Obra de desenho, pintura, arquitetura,escultura, gravura ou litografia; uma Obra fotogrfica e as Obras expressas por um processoanlogo ao da fotografia; uma Obra de arte aplicada; uma ilustrao, mapa, plano, esboo ouObra tridimensional relativa a geografia, topografia, arquitetura ou cincia; uma performance,transmisso ou fonograma, na medida em que tais Obras/direitos sejam reconhecidos eprotegidos pela legislao aplicvel; uma compilao de dados, na extenso em que ela seja

    protegida como uma Obra sujeita ao regime dos direitos autorais; ou uma Obra executada porartistas circenses ou de shows de variedade, conforme ela no for considerada uma Obraliterria, artstica ou cientfica.

    j. "Voc" significa a pessoa fsica ou jurdica exercendo direitos sob esta Licena, que no tenhapreviamente violado os termos desta Licena com relao Obra, ou que tenha recebidopermisso expressa do Licenciante para exercer direitos sob esta Licena apesar de umaviolao prvia.

    k. "Executar Publicamente" significa fazer a utilizao pblica da Obra e comunicar ao pblico aObra, por qualquer meio ou processo, inclusive por meios com ou sem fio ou performancespblicas digitais; disponibilizar ao pblico Obras de tal forma que membros do pblico possamacessar essas Obras de um local e em um local escolhido individualmente por eles; Executar aObra para o pblico por qualquer meio ou processo e comunicar ao pblico performances daObra, inclusive por performance pblica digital; transmitir e retransmitir a Obra por quaisquermeios, inclusive sinais, sons ou imagens.

    l. "Reproduzir" significa fazer cpias da Obra por qualquer meio, inclusive, sem qualquerlimitao, por gravao sonora ou visual, e o direito de fixar e Reproduzir fixaes da Obra,inclusive o armazenamento de uma performance protegida ou fonograma, em forma digital ouqualquer outro meio eletrnico.

    2. Limitaes e excees ao direito autoral e outros usos livres. Nada nesta licena deve serinterpretado de modo a reduzir, limitar ou restringir qualquer uso permitido de direitos autorais oudireitos decorrentes de limitaes e excees estabelecidas em conexo com a proteo autoral,sob a legislao autoral ou outras leis aplicveis.

    3. Concesso da Licena. O Licenciante concede a Voc uma licena de abrangncia mundial, semroyalties, no-exclusiva, perptua (pela durao do direito autoral aplicvel), sujeita aos termos econdies desta Licena, para exercer os direitos sobre a Obra definidos abaixo:

    a. Reproduzir a Obra, incorporar a Obra em uma ou mais Obras Coletivas e Reproduzir a Obraquando incorporada em Obras Coletivas;

    b. Criar e Reproduzir Obras Derivadas, desde que qualquer Obra Derivada, inclusive qualquertraduo, em qualquer meio, adote razoveis medidas para claramente indicar, demarcar ou dequalquer maneira identificar que mudanas foram feitas Obra original. Uma traduo, porexemplo, poderia assinalar que A Obra original foi traduzida do Ingls para o Portugus, ouuma modificao poderia indicar que A Obra original foi modificada;

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    6

  • 5/26/2018 Apostila Puppet

    7/51

    c. Distribuir e Executar Publicamente a Obra, incluindo as Obras incorporadas em ObrasColetivas; e,

    d. Distribuir e Executar Publicamente Obras Derivadas.

    e. O Licenciante renuncia ao direito de recolher royalties, seja individualmente ou, na hiptese deo Licenciante ser membro de uma sociedade de gesto coletiva de direitos (por exemplo,ECAD, ASCAP, BMI, SESAC), via essa sociedade, por qualquer exerccio Seu sobre os direitosconcedidos sob esta Licena.

    Os direitos acima podem ser exercidos em todas as mdias e formatos, independente de seremconhecidos agora ou concebidos posteriormente. Os direitos acima incluem o direito de fazer asmodificaes que forem tecnicamente necessrias para exercer os direitos em outras mdias, meios eformatos. Todos os direitos no concedidos expressamente pelo Licenciante ficam ora reservados.

    4. Restries. A licena concedida na Seo 3 acima est expressamente sujeita e limitada pelasseguintes restries:

    a. Voc pode Distribuir ou Executar Publicamente a Obra apenas sob os termos desta Licena, e

    Voc deve incluir uma cpia desta Licena ou o Identificador Uniformizado de Recursos(Uniform Resource Identifier) para esta Licena em cada cpia da Obra que Voc Distribuir ouExecutar Publicamente. Voc no poder oferecer ou impor quaisquer termos sobre a Obra querestrinjam os termos desta Licena ou a habilidade do destinatrio exercer os direitos a ele aquiconcedidos sob os termos desta Licena. Voc no pode sublicenciar a Obra. Voc devermanter intactas todas as informaes que se referem a esta Licena e excluso de garantiasem toda cpia da Obra que Voc Distribuir ou Executar Publicamente. Quando Voc Distribuirou Executar Publicamente a Obra, Voc no poder impor qualquer medida tecnolgica eficaz Obra que restrinja a possibilidade do destinatrio exercer os direitos concedidos a ele sob ostermos desta Licena. Esta Seo 4(a) se aplica Obra enquanto quando incorporada em umaObra Coletiva, mas isto no requer que a Obra Coletiva, parte da Obra em si, esteja sujeitaaos termos desta Licena. Se Voc criar uma Obra Coletiva, em havendo notificao dequalquer Licenciante, Voc deve, na medida do razovel, remover da Obra Coletiva qualquercrdito, conforme estipulado na Seo 4(c), quando solicitado. Se Voc criar uma ObraDerivada, em havendo aviso de qualquer Licenciante, Voc deve, na medida do possvel, retirarda Obra Derivada qualquer crdito conforme estipulado na Seo 4(c), de acordo com osolicitado.

    b. Voc pode Distribuir ou Executar Publicamente uma Obra Derivada somente sob: (i) os termosdesta Licena; (ii) uma verso posterior desta Licena que contenha os mesmos Elementos daLicena; (iii) uma Licena Creative Commons Unported ou uma Licena Creative Commons deoutra jurisdio (seja a verso atual ou uma verso posterior), desde que elas contenham osmesmos Elementos da Licena da presente Licena (p. ex., Atribuio-Compartilhamento pelamesma licena 3.0 Unported); (iv) uma Licena Compatvel Creative Commons. Se Voclicenciar a Obra Derivada sob os termos de uma das licenas a que se refere o item 4(iv), Voc

    deve respeitar os termos daquela licena. Se Voc licenciar a Obra Derivada sob os termos dequalquer das licenas mencionadas em 4(i) a 4(iii) (a Licena Aplicvel), Voc deve respeitaros termos da Licena Aplicvel e o seguinte: (I) Voc deve incluir uma cpia da LicenaAplicvel ou o Identificador Uniformizado de Recursos (Uniform Resource Identifier) para aquelaLicena em toda cpia de qualquer Obra Derivada que Voc Distribuir ou ExecutarPublicamente; (II) Voc no pode oferecer ou impor quaisquer termos sobre a Obra Derivadaque restrinjam os termos da Licena Aplicvel, ou a habilidade dos destinatrios da ObraDerivada exercerem os direitos que lhes so garantidos sob os termos da Licena Aplicvel;(III) Voc dever manter intactas todas as informaes que se referirem Licena Aplicvel e excluso de garantia em toda cpia da Obra tal como includa na Obra Derivada que VocDistribuir ou Executar Publicamente; (IV) Quando Voc Distribuir ou Executar Publicamenteuma Obra Derivada, Voc no poder impor

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    7

  • 5/26/2018 Apostila Puppet

    8/51

    quaisquer medidas tecnolgicas eficazes sobre a Obra Derivada que restrinjam a habilidade deuma pessoa que receba a Obra Derivada de Voc em exercer os direitos a ela garantidos sobos termos da Licena Aplicvel. Esta Seo 4(b) se aplica Obra Derivada enquantoincorporada a uma Obra Coletiva, mas no exige que a Obra Coletiva, parte da prpria Obra

    Derivada, esteja sujeita aos termos da Licena Aplicvel.c. Se Voc Distribuir ou Executar Publicamente a Obra ou qualquer Obra Derivada ou Obra

    Coletiva, Voc deve, a menos que um pedido relacionado Seo 4(a) tenha sido feito, manterintactas todas as informaes relativas a direitos autorais sobre a Obra e exibir, de formarazovel em relao ao meio ou mdia por Voc utilizado: (i) o nome do Autor Original (ou seupseudnimo, se for o caso), se fornecido, do Titular de Direitos Conexos, se fornecido e quandoaplicvel, e/ou, ainda, se o Autor Original/Titular de Direitos Conexos e/ou o Licenciantedesignar outra parte ou partes (p. ex.: um instituto patrocinador, editora, peridico) paraatribuio (Partes de Atribuio) nas informaes relativas aos direitos autorais doLicenciante, termos de servio ou por outros meios razoveis, o nome dessa parte ou partes; (ii)o ttulo da Obra, se fornecido; (iii) na medida do razovel, o Identificador Uniformizado deRecursos (URI) que o Licenciante especificar para estar associado Obra, se houver, exceto

    se o URI no se referir ao aviso de direitos autorais ou informao sobre o regime delicenciamento da Obra; e, (iv) em conformidade com a Seo 3(b), no caso de Obra Derivada,crdito identificando o uso da Obra na Obra Derivada (p. ex.: "Traduo Francesa da Obra doAutor Original/Titular de Direitos Conexos", ou "Roteiro baseado na Obra original do AutorOriginal/Titular de Direitos Conexos"). O crdito exigido por esta Seo 4(c), pode serimplementado de qualquer forma razovel; desde que, entretanto, no caso de uma ObraDerivada ou Obra Coletiva, na indicao de crdito feita aos autores participantes da ObraDerivada ou Obra Coletiva, o crdito aparea como parte dessa indicao, e de modo aomenos to proeminente quanto os crditos para os outros autores participantes. De modo aevitar dvidas, Voc apenas poder fazer uso do crdito exigido por esta Seo para opropsito de atribuio na forma estabelecida acima e, ao exercer Seus direitos sob estaLicena, Voc no poder implcita ou explicitamente afirmar ou sugerir qualquer vnculo,patrocnio ou apoio do Autor Original, Titular de Direitos Conexos, Licenciante e/ou Partes deAtribuio, o que for cabvel, por Voc ou Seu uso da Obra, sem a prvia e expressaautorizao do Autor Original, Titular de Direitos Conexos, Licenciante e/ou Partes deAtribuio.

    d. Na extenso em que reconhecidos e considerados indisponveis pela legislao aplicvel,direitos morais no so afetados por esta Licena.

    5. Declaraes, garantias e exonerao

    EXCETO QUANDO FOR DE OUTRA FORMA MUTUAMENTE ACORDADO PELAS PARTES PORESCRITO, O LICENCIANTE OFERECE A OBRA NO ESTADO EM QUE SE ENCONTRA (AS IS) ENO PRESTA QUAISQUER GARANTIAS OU DECLARAES DE QUALQUER ESPCIE RELATIVAS OBRA, SEJAM ELAS EXPRESSAS OU IMPLCITAS, DECORRENTES DA LEI OU QUAISQUEROUTRAS, INCLUINDO, SEM LIMITAO, QUAISQUER GARANTIAS SOBRE A TITULARIDADE DAOBRA, ADEQUAO PARA QUAISQUER PROPSITOS, NO-VIOLAO DE DIREITOS, OUINEXISTNCIA DE QUAISQUER DEFEITOS LATENTES, ACURACIDADE, PRESENA OU AUSNCIADE ERROS, SEJAM ELES APARENTES OU OCULTOS. EM JURISDIES QUE NO ACEITEM AEXCLUSO DE GARANTIAS IMPLCITAS, ESTAS EXCLUSES PODEM NO SE APLICAR A VOC.

    6. Limitao de responsabilidade.

    EXCETO NA EXTENSO EXIGIDA PELA LEI APLICVEL, EM NENHUMA CIRCUNSTNCIA OLICENCIANTE SER RESPONSVEL PARA COM VOC POR QUAISQUER DANOS, ESPECIAIS,INCIDENTAIS, CONSEQENCIAIS, PUNITIVOS OU EXEMPLARES, ORIUNDOS DESTA LICENA OUDO USO DA OBRA, MESMO QUE O LICENCIANTE TENHA SIDO AVISADO SOBRE APOSSIBILIDADE DE TAIS DANOS.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    8

  • 5/26/2018 Apostila Puppet

    9/51

    7. Terminao

    a. Esta Licena e os direitos aqui concedidos terminaro automaticamente no caso de qualquerviolao dos termos desta Licena por Voc. Pessoas fsicas ou jurdicas que tenham recebido

    Obras Derivadas ou Obras Coletivas de Voc sob esta Licena, entretanto, no tero suaslicenas terminadas desde que tais pessoas fsicas ou jurdicas permaneam em totalcumprimento com essas licenas. As Sees 1, 2, 5, 6, 7 e 8 subsistiro a qualquer terminaodesta Licena.

    b. Sujeito aos termos e condies dispostos acima, a licena aqui concedida perptua (peladurao do direito autoral aplicvel Obra). No obstante o disposto acima, o Licenciantereserva-se o direito de difundir a Obra sob termos diferentes de licena ou de cessar adistribuio da Obra a qualquer momento; desde que, no entanto, quaisquer destas aes nosirvam como meio de retratao desta Licena (ou de qualquer outra licena que tenha sidoconcedida sob os termos desta Licena, ou que deva ser concedida sob os termos destaLicena) e esta Licena continuar vlida e eficaz a no ser que seja terminada de acordo como disposto acima.

    8. Outras disposies

    a. Cada vez que Voc Distribuir ou Executar Publicamente a Obra ou uma Obra Coletiva, oLicenciante oferece ao destinatrio uma licena da Obra nos mesmos termos e condies que alicena concedida a Voc sob esta Licena.

    b. Cada vez que Voc Distribuir ou Executar Publicamente uma Obra Derivada, o Licencianteoferece ao destinatrio uma licena Obra original nos mesmos termos e condies que foramconcedidos a Voc sob esta Licena.

    c. Se qualquer disposio desta Licena for tida como invlida ou no-executvel sob a leiaplicvel, isto no afetar a validade ou a possibilidade de execuo do restante dos termosdesta Licena e, sem a necessidade de qualquer ao adicional das partes deste acordo, tal

    disposio ser reformada na mnima extenso necessria para tal disposio tornar-se vlidae executvel.

    d. Nenhum termo ou disposio desta Licena ser considerado renunciado e nenhuma violaoser considerada consentida, a no ser que tal renncia ou consentimento seja feito por escritoe assinado pela parte que ser afetada por tal renncia ou consentimento.

    e. Esta Licena representa o acordo integral entre as partes com respeito Obra aqui licenciada.No h entendimentos, acordos ou declaraes relativas Obra que no estejam especificadosaqui. O Licenciante no ser obrigado por nenhuma disposio adicional que possa aparecerem quaisquer comunicaes provenientes de Voc. Esta Licena no pode ser modificada semo mtuo acordo, por escrito, entre o Licenciante e Voc.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    9

  • 5/26/2018 Apostila Puppet

    10/51

    2 Sobre a Instruct

    A Instruct tem como especialidade solues na rea de automao e monitoramento de infraestrutura derede, administrao de sistemas e redes e capacitao para certificaes. Temos grande experincia na

    implementao de automao de infraestrutura usando Puppet e possumos os profissionais maisexperientes do mercado, como Miguel Di Ciurcio Filho e Jos Augusto (Guto) Carvalho, primeiroscertificados Puppet Professional (PCP) pela PuppetLabs da Amrica Latina, alm de ambos possuremas certificaes RHCE, LPIC-3, dentre outras.

    Somos parceiros oficiais da PuppetLabs no Brasil, ministramos os treinamentos oficiais da PuppetLabs efornecemos suporte e consultoria. J possumos clientes que usufruem da automao fornecida peloPuppet em conjunto com os nossos servios.

    Combinada com a experincia dos profissionais da empresa, alm dos servios e solues, a Instructtambm fornece treinamentos voltados para certificaes reconhecidas no mercado, como LPI eCompTIA.

    Os exerccios e materiais de estudo so desenvolvidos pela prpria empresa, o que demonstra o

    compromisso com a qualidade e a entrega de uma experincia diferenciada.Verses mais novas e outras informaes sobre essa apostila podem ser encontradas emhttp://instruct.com.br/apostila-puppet.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    10

    http://instruct.com.br/apostila-puppethttp://www.comptia.org/http://www.lpi.org/http://instruct.com.br/treinamentos.htmlhttp://puppetlabs.com/http://instruct.com.br/
  • 5/26/2018 Apostila Puppet

    11/51

    3 Instalao

    Diversas distribuies empacotam o Puppet, mas as verses empacotadas e a qualidade desses pacotesvariam muito, portanto a melhor maneira de instal-lo utilizando os pacotes oficiais da PuppetLabs. Os

    pacotes oficiais so extensivamente testatos e extremamente confiveis.Existem duas verses do Puppet distribudas pela PuppetLabs: Puppet Open Source e o PuppetEnterprise. O Puppet Enterprise distribudo gratuitamente para o gerenciamento de at 10 nodes,possui suporte oficial e vem acompanhado de uma verstil interface web para administrao.

    Para uma comparao mais detalhada sobre as diferenas entre a verso Open Source e a Enterprise,visite a pgina http://puppetlabs.com/puppet/enterprise-vs-open-source/.

    Aviso

    Instalao a partir do cdigo fonte

    O Puppet um projeto grande e complexo que possui muitas dependncias, e instal-lo a partirdo cdigo fonte no recomendado. A prpria PuppetLabs no recomenda a instalao a partirdo cdigo fonte. muito mais confivel e conveniente utilizar pacotes j homologados e testados.

    3.1 Debian e Ubuntu

    Debian 7 Wheezy

    Ubuntu LTS 10.04 e 12.04

    1. Baixe e instale o pacote puppetlabs-release-*.deb para a verso da sua distro emhttp://apt.puppetlabs.com/, por exemplo Debian Wheezy.

    # wget http://apt.puppetlabs.com/puppetlabs-release-wheezy.deb

    # dpkg -i puppetlabs-release-wheezy.deb

    # apt-get update

    2. Instale o pacote puppet.

    # apt-get install puppet

    Dica

    Turbinando o vim

    Para facilitar a edio de cdigo, caso voc utilize o editor vim, ative o plugin que adiciona osuporte a linguagem do Puppet executando vim-addons install puppet e no deixe decolocar syntax on no seu .vimrc.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    11

    http://apt.puppetlabs.com/http://puppetlabs.com/puppet/enterprise-vs-open-source/
  • 5/26/2018 Apostila Puppet

    12/51

    3.2 Red Hat / CentOS

    Red Hat 5 e 6

    CentOS 5 e 6 Fedora 19 e 20

    1. Baixe e instale o pacote puppetlabs-release-*.rpm para a verso da sua distro emhttp://yum.puppetlabs.com/, por exemplo para RHEL/CentOS 6:

    # yum install http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

    # yum update

    2. Instale o pacote puppet.

    # yum install puppet

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    12

    http://yum.puppetlabs.com/
  • 5/26/2018 Apostila Puppet

    13/51

    4 Resource Abstraction Layer (RAL)

    O que existe em um sistema operacional? Arquivos, pacotes, processos e servios em execuo,programas, contas de usurios, grupos, etc. Para o Puppet, isso so resources (recursos).

    Os resources tm certas similaridades entre si. Por exemplo, um arquivo tem um caminho e um dono,todo usurio possui um grupo e um nmero identificador. Essas caractersticas chamamos de atributos, eunindo os atributos que sempre esto presentes possibilita a criao de resource types (tipos derecursos).

    Os atributos mais importantes de um resource type geralmente so conceitualmente idnticos em todosos sistemas operacionais, independentemente de como as implementaes venham a diferir. A descriode um resource pode ser separada de como ela implementada.

    Essa combinao de resources, resource types e atributos formam o Resource Abstraction Layer (RAL)do Puppet. O RAL divide resources em tipos (alto nvel) e providers (provedores, implementaesespecficas de cada plataforma), e isso nos permite manipular resources (pacotes, usurios, arquivos,etc) de maneira independente de sistema operacional.

    Dica

    Ordens ao invs de passos

    Atravs do RAL dizemos somente o que queremos e no precisamos nos preocupar no comoser feito. Portanto, temos que pensar em ordens como "o pacote X deve estar instalado", ouainda, "o servio Z deve estar parado e desativado".

    4.1 Manipulando resources via RALO comando puppet resource permite consultar e manipular o sistema operacional via RAL,visualizando a configurao na linguagem do Puppet.

    Vamos manipular um pouco o RAL antes de escrevermos cdigo.

    4.1.1 Gerenciando usurios

    O primeiro argumento que deve ser passado o resource type que ser consultado.

    # puppet resource user

    user { 'avahi':

    ensure => 'present',

    comment => 'Avahi mDNS daemon,,,',

    gid => '108',

    home => '/var/run/avahi-daemon',

    password => '*',

    password_max_age => '99999',

    password_min_age => '0',

    shell => '/bin/false',

    uid => '105',

    }

    user { 'backup':

    ensure => 'present',

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    13

  • 5/26/2018 Apostila Puppet

    14/51

    comment => 'backup',

    gid => '34',

    home => '/var/backups',

    password => '*',

    password_max_age => '99999', password_min_age => '0',

    shell => '/bin/sh',

    uid => '34',

    }

    ...

    A sada mostra todos os usurios, com atributos como UID, GID e shell j formatados na linguagem doPuppet que estejam presentes no sistema operacional.

    Ns podemos ser mais especficos e consultar apenas um resource:

    # puppet resource user root

    user { 'root':

    ensure => 'present',

    comment => 'root',

    gid => '0',

    home => '/root',

    password => '$6$.MuEgeA1$mL6sF0FnGUaTQWYBdqzwX3tGT2fgoCYYU...',

    password_max_age => '99999',

    password_min_age => '0',

    shell => '/bin/bash',

    uid => '0',

    }

    Esse cdigo gerado pode ser utilizado depois, e funcional.

    possvel passarmos alguns atributos para o puppet resource, fazendo com que ele altere o estadode um recurso no sistema.

    Tradicionalmente, para criarmos um usurio usamos comandos como useradd ou o interativoadduser. Ao invs de usar um desses comandos, vamos usar o Puppet:

    # puppet resource user joe ensure=present home="/home/joe" managehome=true

    notice: /User[joe]/ensure: created

    user { 'joe':

    ensure => 'present',

    home => '/home/joe',

    }

    # id joe

    uid=500(joe) gid=500(joe) groups=500(joe)

    Repare que a linha de comando no necessariamente l cdigo Puppet. Podemos usar somenteargumentos.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    14

  • 5/26/2018 Apostila Puppet

    15/51

    4.1.2 Gerenciando servios

    Vamos continuar explorando mais resources. Outro resource type muito til o service.

    # puppet resource service

    service { 'acpid':

    ensure => 'running',

    enable => 'true',

    }

    service { 'auditd':

    ensure => 'running',

    enable => 'true',

    }

    service { 'crond':

    ensure => 'running',

    enable => 'true',

    }

    ...

    O comando acima listou todos os servios da mquina e seus estados. Podemos manipular os serviosvia Puppet, ao invs de utilizarmos os tradicionais comandos update-rc.d no Debian ou chkconfigno Red Hat. Alm disso, tambm podemos parar e iniciar servios.

    Parando um servio que est em execuo:

    # puppet resource service iptables ensure=stopped

    notice: /Service[iptables]/ensure: ensure changed 'running' to 'stopped'

    service { 'iptables':

    ensure => 'stopped',

    }

    # service iptables status

    iptables is stopped

    Inciando um servio 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',

    }

    # service saslauthd status

    iptables (pid 2731) is running...

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    15

  • 5/26/2018 Apostila Puppet

    16/51

    4.1.3 Gerenciando pacotes

    Alm de usurios e servios, podemos tambm manipular a instalao de software via RAL do Puppet.

    Com um mesmo comando, podemos fazer a instalao, por exemplo, do aide, tanto no Debian quanto

    no CentOS. Vamos executar puppet resource package aide ensure=installed em ambos ossistemas.

    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.14-3.el6_2.2',

    }

    # rpm -qi aide

    No Debian:

    # dpkg -s aide

    Package `aide' is not installed and no info is available.

    Use dpkg --info (= dpkg-deb --info) to examine archive files,

    and dpkg --contents (= dpkg-deb --contents) to list their contents.

    # puppet resource package aide ensure=installed

    notice: /Package[aide]/ensure: ensure changed 'purged' to 'present'

    package { 'aide':

    ensure => '0.15.1-2+squeeze1',

    }

    # dpkg -s aide

    4.1.4 Principais Resource Types

    O Puppet possui uma srie de resource types prontos para uso, tambm chamados de core resourcetypes, pois todos so distribudos por padro com o Puppet e esto disponveis em qualquer instalao.Mais resource types podem ser adicionados usando mdulos.

    Os principais so:

    file

    package

    service

    user

    group

    cron

    exec

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    16

  • 5/26/2018 Apostila Puppet

    17/51

    Podemos dizer tambm que esses tipos nos fornecem primitivas, com as quais podemos criar soluesde configurao completas e robustas.

    4.1.5 Atributos de Resource Types

    At agora vimos atributos bsicos dos tipos user, service e package. Porm, esses recursospossuem muito mais atributos do que vimos at agora.

    Para sabermos os atributos de um tipo, o prprio comando puppet nos fornece documentaocompleta.

    # puppet describe -s user

    user

    ====

    Manage users. This type is mostly built to manage system

    users, so it is lacking some features useful for managing normal

    users.

    This resource type uses the prescribed native tools for creating

    groups and generally uses POSIX APIs for retrieving information

    about them. It does not directly modify `/etc/passwd` or anything.

    **Autorequires:** If Puppet is managing the user's primary group (as

    provided in the `gid` attribute), the user resource will autorequire

    that group. If Puppet is managing any role accounts corresponding to the

    user's roles, the user resource will autorequire those role accounts.

    Parameters

    ---------- allowdupe, attribute_membership, attributes, auth_membership, auths,

    comment, ensure, expiry, gid, groups, home, ia_load_module,

    key_membership, keys, managehome, membership, name, password,

    password_max_age, password_min_age, profile_membership, profiles,

    project, role_membership, roles, shell, system, uid

    Providers

    ---------

    aix, directoryservice, hpuxuseradd, ldap, pw, user_role_add, useradd,

    windows_adsi

    Pronto, agora temos uma lista de parmetros sobre o tipo user.

    Dica

    Documentao completa

    O argumento -s mostra uma verso resumida da documentao. Use o comandopuppet describe sem o -s para ter acesso documentao completa do resource type.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    17

  • 5/26/2018 Apostila Puppet

    18/51

    4.2 Prtica: Modificando recursos interativamente

    Alm de podermos manipular recursos em nosso sistema pelo comando puppet resource, ele fornece umparmetro interessante: --edit. Com ele, podemos ter um contato direto com a linguagem do Puppetpara manipular recursos, ao invs de usarmos apenas a linha de comando.

    Vamos colocar o usurio joe aos grupos adm e bin. Normalmente faramos isso usando o comandousermod ou editando manualmente o arquivo /etc/group. Vamos fazer isso no estilo Puppet!

    1. Execute o seguinte comando:

    # puppet resource user joe --edit

    2. O Puppet abrir o vim com o seguinte cdigo:

    user { 'joe':

    ensure => 'present',

    gid => '1004', home => '/home/joe',

    password => '!',

    password_max_age => '99999',

    password_min_age => '0',

    shell => '/bin/bash',

    uid => '1004',

    }

    3. Vamos acrescentar o seguinte cdigo:

    user { 'joe': ensure => 'present',

    gid => '1004',

    groups => ['bin', 'adm'], # '/home/joe',

    password => '!',

    password_max_age => '99999',

    password_min_age => '0',

    shell => '/bin/bash',

    uid => '1004',

    }

    4. Basta sair do vim, salvando o arquivo, para que o Puppet aplique a nova configurao. Teremosuma sada parecida com essa:

    info: Applying configuration version '1348039985'

    notice: /Stage[main]//User[joe]/groups: groups changed to 'adm,bin'

    notice: Finished catalog run in 0.30 seconds

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    18

  • 5/26/2018 Apostila Puppet

    19/51

    5 Manifests

    As declaraes de configurao so chamadas de manifests (manifestos) e so salvas em arquivos coma extenso .pp.

    A principal utilidade da linguagem do Puppet a declarao de resources, representando um estadodesejado.

    Nos manifests tambm podemos ter condies, agrupar resources, gerar texto com funes, utilizar ereferenciar cdigo em outros manifests e muitas outras coisas. Mas o principal garantir que resourcessejam declarados e gerenciados de maneira correta.

    5.1 Declarando resources

    Para manipular diversos aspectos de nosso sistema, devemos estar logados como root. Para melhororganizao, vamos colocar nosso cdigo em /root/manifests.

    1. Vamos criar nosso primeiro resource, nesse caso, um arquivo:

    # vim /root/manifests/arquivo-1.pp

    file {'teste':

    path => '/tmp/teste.txt',

    ensure => present,

    mode => 0640,

    content => "Conteudo de teste!\n",

    }

    2. Com o manifest criado, hora de aplic-lo ao sistema:

    # puppet apply arquivo-1.pp

    notice: /Stage[main]//File[teste]/ensure: created

    notice: Finished catalog run in 0.08 seconds

    # cat /tmp/teste.txt

    Conteudo de teste!

    # ls -l /tmp/teste.txt

    -rw-r----- 1 root root 19 Sep 19 09:20 /tmp/teste.txt

    Temos um resource type, nesse caso, file, seguido por um par de colchetes que englobam todo orestante das informaes sobre o resource.

    Dentro dos colchetes, temos:

    O ttulo do recurso seguido de dois pontos.

    E uma sequncia de atributo => valor que serve para descrever como deve ser orecurso. Vrios valores devem ser separados por vrgula.

    Alm disso, algumas regras so fundamentais sobre a sintaxe:

    Esquecer de separar atributos usando a vrgula um erro muito comum, tenha cuidado. O ltimopar atributo => valor pode ser seguido de vrgula tambm.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    19

  • 5/26/2018 Apostila Puppet

    20/51

    Letras maisculas e minsculas fazem diferena! Na declarao de recursos,File {'teste':... significa outra coisa que veremos mais adiante.

    Colocar aspas nos valores faz diferena! Valores e palavras reservadas da linguagem, comopresent, no precisam estar entre aspas, apenas strings. Para o Puppet, tudo string, mesmo

    nmeros. Aspas simples so para valores literais e o nico escape para a prpria aspa (') e a barra

    invertida (\).

    Aspas duplas servem para interpolar variveis e podem incluir um \n (nova linha).

    Dica

    Teste antes de executar

    O Puppet fornece algumas funcionalidades que nos permitem testar o cdigo antes de execut-lo.

    Primeiramente podemos validar se existe algum erro de sintaxe, usando o comandopuppet parser validade arquivo.pp.

    O comando puppet parser apenas verifica se o manifest est correto.

    Para simularmos as alteraes que sero ou no feitas, usamos puppet apply --noop.

    Mais exemplos:

    # vim /root/manifests/arquivo-2.pp

    file {'/tmp/teste1.txt':

    ensure =>present,

    content =>"Ola!\n",

    }

    file {'/tmp/teste2':

    ensure=>directory,

    mode =>0644,

    }

    file {'/tmp/teste3.txt':

    ensure=>link,

    target =>'/tmp/teste1.txt',

    }

    notify {"Gerando uma notificao!":}

    notify {"Outra notificao":}

    E, finalmente, vamos aplicar:

    # puppet apply arquivo-2.pp

    notice: /Stage[main]//File[/tmp/teste1.txt]/ensure: created

    notice: Outra notificao

    notice: /Stage[main]//Notify[Outra notificao]/message: defined 'message' as \

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    20

  • 5/26/2018 Apostila Puppet

    21/51

    'Outra notificao'

    notice: /Stage[main]//File[/tmp/teste3.txt]/ensure: created

    notice: /Stage[main]//File[/tmp/teste2]/ensure: created

    notice: Gerando uma notificao!

    notice: /Stage[main]//Notify[Gerando uma notificao!]/message: defined 'message' \

    as 'Gerando uma notificao!'

    notice: Finished catalog run in 0.03 seconds

    # ls -la /tmp/teste*

    -rw-r--r-- 1 root root 5 Sep 21 12:08 /tmp/teste1.txt

    lrwxrwxrwx 1 root root 15 Sep 21 12:08 /tmp/teste3.txt -> /tmp/teste1.txt

    /tmp/teste2:

    total 8

    drwxr-xr-x 2 root root 4096 Sep 21 12:08 .

    drwxrwxrwt 24 root root 4096 Sep 21 12:08 ..

    # cat /tmp/teste3.txt

    Ola!

    Repare que deixamos de fora alguns atributos, como path, e ainda assim tudo funcionou. Quase todosos resourse types possuem algum atributo que assume como valor padro o ttulo de resource. Para oresourcefile, o atributo path. Para o recurso notify, message. Em muitos outros casos, comouser, group, package e outros, simplesmente o atributo name.

    No jargo do Puppet, o atributo que recebe como valor padro o ttulo de um recurso chamado denamevar. Esse valor sempre utilizado em um atributo que deve ser capaz de dar uma identidade aorecurso, que deve sempre ser nico.

    Utilizar o valor do ttulo do resource conveniente, mas algumas vezes pode ser desajeitado. Em certasocasies melhor dar um ttulo curto que simbolize e identifique o resource e atribuir um valor

    diretamente ao namevar como um atributo. Isso prtico principalmente se o nome de um recurso longo.

    notify {'grandenotificacao':

    message =>"Essa uma grande notificao! Ela to grande que

    melhor utilizar um nome pequeno como ttulo do resource.",

    }

    No possvel declarar o mesmo resource mais de uma vez. O Puppet no permite que resources com omesmo ttulo sejam criados e, em vrios casos, tambm no vai permitir que recursos diferentes tenhamo mesmo valor de namevar.

    # cat conflito.ppfile {'arquivo':

    path => '/tmp/arquivo.txt',

    ensure => present,

    }

    file {'outroarquivo':

    path => '/tmp/arquivo.txt',

    ensure => present,

    }

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    21

  • 5/26/2018 Apostila Puppet

    22/51

    # puppet apply conflito.pp

    Cannot alias File[outroarquivo] to ["/tmp/arquivo.txt"] at \

    /root/manifests/conflito.pp:9; resource ["File", "/tmp/arquivo.txt"] \

    already declared at /root/manifests/conflito.pp:4

    5.1.1 Observaes sobre o resource file

    Ns declaramos que /tmp/teste2/ teria permisses 0644, porm, o ls -lah mostrou o comum0755. Isso acontece porque o Puppet ativa o bit de leitura e acesso de diretrios, pois isso geralmenteo que queremos. A ideia que se possa gerenciar recursivamente arquivos em diretrios com permisso0644 sem tornar os arquivos executveis.

    O tipo file tem diversos valores para o atributo ensure: present, absent, file, directory elink. Para saber mais, leia a referncia do tipo file.

    5.2 Prtica: conhecendo os resources

    Dica

    Para essa atividade, salve o contedo de cada exerccio em um arquivo .pp e aplique-ousando o comando puppet apply.

    1. Crie uma entrada no arquivo /etc/hosts:

    host { 'teste.puppet':

    ensure =>'present', host_aliases =>['teste'],

    ip =>'192.168.56.99',

    }

    2. Crie um usurio chamado elvis com shell padro /bin/false e grupo adm.

    user {'elvis':

    shell =>'/bin/false',

    gid =>'adm',

    home =>'/home/elvis',

    managehome =>true,}

    3. Crie um grupo chamado super:

    group {'super':

    gid =>777,

    }

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    22

  • 5/26/2018 Apostila Puppet

    23/51

    6 Ordenao

    Agora que entendemos manifests e declarao de recursos, vamos aprender sobre meta-parmetros eordenao de recursos.

    Voltemos ao manifest anterior que criou um arquivo, um diretrio e um link simblico:

    file {'/tmp/teste1.txt':

    ensure =>present,

    content =>"Ola!\n",

    }

    file {'/tmp/teste2':

    ensure=>directory,

    mode =>0644,

    }

    file {'/tmp/teste3.txt': ensure=>link,

    target =>'/tmp/teste1.txt',

    }

    notify {"Gerando uma notificao!":}

    notify {"Outra notificao":}

    Embora as declaraes estejam escritas uma aps a outra, o Puppet pode aplic-las em qualquer ordem.

    Ao contrrio de uma linguagem procedural, a ordem da escrita de recursos em um manifest no implicana mesma ordem lgica para a aplicao.

    Alguns recursos dependem de outros recursos. Ento, como dizer ao Puppet qual deve vir primeiro?

    6.1 Meta-parmetros e referncia a recursos

    file {'/tmp/teste1.txt':

    ensure =>present,

    content =>"Ola!\n",

    }

    notify {'/tmp/teste1.txt foi sincronizado.':

    require=>File['/tmp/teste1.txt'],

    }

    Cada resource type tem o seu prprio conjunto de atributos, mas existe outro conjunto de atributos,chamado meta-parmetros, que pode ser utilizado em qualquer resource.

    Meta-parmetros no influenciem no estado final de um resource, apenas descrevem como o Puppetdeve agir.

    Ns temos quatro meta-parmetros que nos permitem impor ordem aos resources: before, require,notify e subscribe. Todos eles aceitam um resource reference (referncia a um recurso), ficandoassim: Tipo['titulo'] .

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    23

  • 5/26/2018 Apostila Puppet

    24/51

    Nota

    Maisculo ou minsculo?

    Lembre-se: usamos caixa baixa quando estamos declarando novos resources. Quando queremosreferenciar um resource que j existe, usamos letra maiscula na primeira letra do seu tipo,seguido do ttulo do resource entre colchetes.

    file{'arquivo': } uma declarao e File['arquivo'] uma referncia ao resourcedeclarado.

    6.1.1 Meta-parmetros before e require

    before e require criam um simples relacionamento entre resources, onde um resource deve sersincronizado antes que outro.

    before utilizado no resource anterior, listando quais resources dependem dele.

    require usado no resource posterior, listando de quais resources ele depende.

    Esses dois meta-parmetros so apenas duas maneiras diferentes de escrever a mesma relao,dependendo apenas da sua preferncia por um ou outro.

    file {'/tmp/teste1.txt':

    ensure =>present,

    content =>"Olah!\n",

    before =>Notify['mensagem'],

    }

    notify {'mensagem':

    message =>'O arquivo teste1.txt foi criado!',

    }

    No exemplo acima, aps /tmp/teste1.txt ser criado acontece a notificao. O mesmocomportamento pode ser obtido usando o meta-parmetro require:

    file {'/tmp/teste1.txt':

    ensure =>present,

    content =>"Olah!\n",

    }

    notify {'mensagem':

    require=>File['/tmp/teste1.txt'],

    message =>'O arquivo teste1.txt foi criado!',

    }

    6.1.2 Meta-parmetros notify e subscribe

    Alguns tipos de resources podem ser refreshed (refrescados, recarregados), ou seja, devem reagirquando houver mudanas.

    Por resource service, significa reiniciar ou recarregar aps um arquivo de configurao modificado.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    24

  • 5/26/2018 Apostila Puppet

    25/51

    Para um resource exec significa ser executado toda vez que o resource seja modificado.

    Aviso

    Quando acontece um refresh?

    Refreshes acontecem somente durante a aplicao da configurao pelo Puppet e nunca foradele.

    O agente do Puppet no monitora alteraes nos arquivos.

    Os meta-parmetros notify e subscribe estabelecem relaes de dependncia da mesma maneira quebefore e require, mas para relaes de refresh.

    No s o resource anterior ser sincronizado, como aps a sincronizao um evento refresh sergerado, e o resource dever reagir de acordo.

    Nota

    Resources que suportam refresh

    Somente os tipos built-in exec, service e mount podem ser refreshed.

    No exemplo abaixo, toda vez que o arquivo /etc/ssh/sshd_config divergir de/root/manifests/sshd_config , ele ser sincronizado. Caso isso ocorra, Service['sshd']receber um refresh e far com que o servio sshd seja recarregado.

    file { '/etc/ssh/sshd_config':

    ensure=>file,

    mode =>600,

    source =>'/root/manifests/sshd_config',

    notify =>Service['sshd'],

    }

    service { 'sshd':

    ensure =>running,

    enable =>true,

    hasrestart =>true,

    hasstatus =>true,

    }

    6.1.3 Encadeando relacionamentos

    Existe um outro jeito de declarar relacionamentos entre os resources: usando setas de ordenao -> enotificao ~>. O Puppet chama isso de channing.

    Essas setas podem apontar para qualquer direo (

  • 5/26/2018 Apostila Puppet

    26/51

    O exemplo abaixo demonstra o mesmo efeito de ordenao, mas de maneira diferente. Para exemplospequenos as vantagens de se usar setas podem no ser bvias, mas com muitos resources envolvidoselas podem ser bem mais prticas.

    file {'/tmp/teste1.txt':

    ensure =>present,

    content =>"Hi.",

    }

    notify {'depois':

    message =>'/tmp/teste1.txt foi sincronizado.',

    }

    File['/tmp/teste1.txt']->Notify['depois']

    6.2 Prtica: validando o arquivo /etc/sudoers

    Para essa atividade, salve o contedo de cada exerccio em um arquivo .pp e aplique-o usando ocomando puppet apply.

    1. Certifique-se de que o pacote sudo est instalado.

    package {'sudo':

    ensure=>'installed'

    }

    2. Agora vamos declarar o controle do arquivo /etc/sudoers e usar como origem/root/manifests/sudoers . O arquivo depende do pacote, pois sem o pacote ele no deve

    existir.

    package {'sudo':

    ensure=>'installed'

    }

    file {'/etc/sudoers':

    ensure=>'file',

    mode =>0440,

    owner =>'root',

    group =>'root',

    source =>'/root/manifests/sudoers',

    require=>Package['sudo']}

    3. Temos uma limitao, pois, caso exista algum erro no arquivo de origem, o arquivo, sempre sercopiado para /etc/sudoers. Faamos uma verificao antes de o arquivo ser copiado.

    Edite o arquivo /root/manifests/sudoers de forma a deix-lo invlido antes de aplicar omanifest abaixo.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    26

  • 5/26/2018 Apostila Puppet

    27/51

    package {'sudo':

    ensure=>'installed'

    }

    file {'/etc/sudoers': ensure=>'file',

    mode =>0440,

    owner =>'root',

    group =>'root',

    source =>'/root/manifests/sudoers',

    require=>[Package['sudo'], Exec['parse_sudoers']],

    }

    exec{'parse_sudoers':

    command =>'/usr/sbin/visudo -c -f /root/manifests/sudoers',

    require=>Package['sudo'],

    }

    4. Ainda temos uma limitao. Toda vez que o manifest aplicado, o resourceExec['parse_sudoers'] executado. Precisamos de uma condio para que ele s sejaexecutado se necessrio.

    package {'sudo':

    ensure=>'installed'

    }

    file {'/etc/sudoers':

    ensure=>'file',

    mode =>0440, owner =>'root',

    group =>'root',

    source =>'/root/manifests/sudoers',

    require=>[Package['sudo'], Exec['parse_sudoers']],

    }

    exec{'parse_sudoers':

    command =>'/usr/sbin/visudo -c -f /root/manifests/sudoers',

    unless=>'/usr/bin/diff /root/manifests/sudoers /etc/sudoers',

    require=>Package['sudo'],

    }

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    27

  • 5/26/2018 Apostila Puppet

    28/51

    7 Variveis, fatos e condies

    7.1 Variveis

    A linguagem declarativa do Puppet pode usar variveis, como no exemplo abaixo:

    $dns1='8.8.8.8'

    $dns2='8.8.4.4'

    $arquivo='/etc/resolv.conf'

    $conteudo="nameserver ${dns1}\nnameserver ${dns2}"

    file {$arquivo:

    ensure=>'present',

    content =>$conteudo,

    }

    Mais alguns detalhes sobre variveis:

    Variveis comeam com o smbolo de cifro ($)

    Variveis podem ser usadas para dar nomes em resources e em atributos

    Para interpolar variveis, a string deve estar entre aspas duplas e a varivel deve estar entrechaves: ${var}

    Variveis do topo do escopo (algo como global) podem ser acessadas assim:$::variavel_global

    Uma varivel s pode ter seu valor atribudo uma vez

    7.2 FatosAntes de gerar a configurao, o Puppet executa o facter.

    O facter uma ferramenta fundamental do ecossistema do Puppet, que gera uma lista de variveischamadas de fatos, que contm diversas informaes sobre o sistema operacional.

    Exemplo de sada da execuo do comando facter:

    # facter

    architecture => amd64

    augeasversion => 0.10.0

    boardmanufacturer => Dell Inc.

    boardserialnumber => .C75L6M1.

    facterversion => 1.6.14hardwareisa => unknown

    hardwaremodel => x86_64

    hostname => inspiron

    id => root

    interfaces => eth0,lo,vboxnet0

    ipaddress => 192.168.56.1

    ipaddress_lo => 127.0.0.1

    ipaddress_vboxnet0 => 192.168.56.1

    is_virtual => false

    kernel => Linux

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    28

  • 5/26/2018 Apostila Puppet

    29/51

    kernelmajversion => 3.2

    kernelrelease => 3.2.0-0.bpo.3-amd64

    kernelversion => 3.2.0

    lsbdistcodename => squeeze

    lsbdistdescription => Debian GNU/Linux 6.0.6 (squeeze)lsbdistid => Debian

    lsbdistrelease => 6.0.6

    lsbmajdistrelease => 6

    macaddress => 00:26:b9:25:76:ef

    macaddress_eth0 => 00:26:b9:25:76:ef

    macaddress_vboxnet0 => 0a:00:27:00:00:00

    manufacturer => Dell Inc.

    memoryfree => 1.70 GB

    memorysize => 3.68 GB

    memorytotal => 3.68 GB

    netmask => 255.255.255.0

    netmask_lo => 255.0.0.0

    netmask_vboxnet0 => 255.255.255.0

    network_lo => 127.0.0.0

    network_vboxnet0 => 192.168.56.0

    operatingsystem => Debian

    operatingsystemrelease => 6.0.6

    osfamily => Debian

    path => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

    physicalprocessorcount => 1

    processor0 => Intel(R) Core(TM) i3 CPU M 330 @ 2.13GHz

    processor1 => Intel(R) Core(TM) i3 CPU M 330 @ 2.13GHz

    processor2 => Intel(R) Core(TM) i3 CPU M 330 @ 2.13GHz

    processor3 => Intel(R) Core(TM) i3 CPU M 330 @ 2.13GHz

    processorcount => 4productname => Inspiron 1564

    ps => ps -ef

    puppetversion => 3.0.1

    rubysitedir => /usr/local/lib/site_ruby/1.8

    rubyversion => 1.8.7

    selinux => false

    serialnumber => C75L6M1

    sshdsakey => AAAAB3NzaC1kc3MAAACBAJ6Lw5zcJfTkBm6Yp00a8X5XBkYLJtaf ...

    sshrsakey => AAAAB3NzaC1yc2EAAAADAQABAAABAQDAErKQ92ShklNso4oBUNH6 ...

    swapfree => 0.00 kB

    swapsize => 0.00 kB

    timezone => BRSTtype => Portable

    uniqueid => 007f0101

    uptime => 34 days

    uptime_days => 34

    uptime_hours => 826

    uptime_seconds => 2973926

    virtual => physical

    Todas essas variveis esto disponveis para uso dentro de qualquer manifest e dizemos que esto noescopo de topo (top scope).

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    29

  • 5/26/2018 Apostila Puppet

    30/51

    O exemplo abaixo usa algumas das variveis geradas pelo facter:

    notify {'kernel':

    message =>"O sistema operacional ${kernel} e verso ${kernelversion}"

    }

    notify {'distro':

    message =>"A distribuio ${operatingsystem} e verso ${operatingsystemrelease}"

    }

    E teremos a seguinte sada:

    # puppet apply a.pp

    O sistema operacional Linux e verso 2.6.18

    /Stage[main]//Notify[kernel]/message: defined 'message' as 'Nosso sistema operacional \

    Linux e verso 2.6.18'

    A distribuio CentOS e verso 5.8

    /Stage[main]//Notify[distro]/message: defined 'message' as 'A distribuio CentOS e \

    verso 5.8'Finished catalog run in 0.05 seconds

    Nota

    Sistemas operacionais diferentes

    Alguns fatos podem variar de um sistema operacional para outro. Alm disso, possvel estenderas variveis do facter.

    7.3 Condicionais

    A linguagem declarativa do Puppet possui mecanismos de condio que funcionam de maneira parecidaem relao s linguagens de programao. Mas existem algumas diferenas.

    7.3.1 if

    Exemplo de um bloco de condio if:

    ifexpressao {

    bloco de codigo

    }elsifexpressao {

    bloco de codigo

    }

    else{

    bloco de codigo

    }

    O else e o elsif so opcionais.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    30

  • 5/26/2018 Apostila Puppet

    31/51

    Outro exemplo, usando uma varivel do facter:

    if$is_virtual=='true'{

    notify {'Estamos em uma maquina virtual': }

    }

    else{

    notify {'Estamos em uma maquina real': }

    }

    Os blocos podem conter qualquer qualquer tipo de definio de configurao, mais alguns exemplos:

    if$osfamily=='RedHat'{

    service {'sshd':

    ensure=>'running',

    enable =>'true',

    }

    }elsif$osfamily=='Debian'{

    service {'ssh':

    ensure=>'running',

    enable =>'true',

    }

    }

    Aviso

    True e False para o Puppet.

    Quando usamos variveis que vm do facter, sempre so strings.

    Mesmo que seja retornado false, por exemplo, no fato $is_virtual, diferente do tipo booleanofalse.

    Portanto, um cdigo como o abaixo sempre cair no primeiro bloco, pois a varivel uma string.

    if $is_virtual { ... } else { ... }

    7.3.2 Expresses

    7.3.2.1 Comparao

    == (igualdade, sendo que comparao de strings case-insensitive)

    != (diferente)

    < (menor que)

    > (maior que)

    = (maior ou igual)

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    31

  • 5/26/2018 Apostila Puppet

    32/51

    =~ (casamento de regex)

    !~ (no casamento de regex)

    in (contm, sendo que comparao de strings case-sensitive)

    Exemplo do operador in:

    'bat'in'batata'# TRUE

    'Bat'in'batata'# FALSE

    'bat'in['bat', 'ate', 'logo']# TRUE

    'bat'in{ 'bat'=>'feira', 'ate'=>'fruta'} # TRUE

    'bat'in{ 'feira'=>'bat', 'fruta'=>'ate'} # FALSE

    7.3.2.2 Operadores booleanos

    and

    or

    ! (negao)

    7.3.3 Case

    Alm do if, o Puppet fornece a diretiva case.

    case$operatingsystem{

    centos: { $apache="httpd"}

    redhat: { $apache="httpd"}

    debian: { $apache="apache2"}

    ubuntu: { $apache="apache2"}

    # fail uma funo default: { fail("sistema operacional desconhecido") }

    }

    package {'apache':

    name =>$apache,

    ensure=>'latest',

    }

    Ao invs de testar uma nica condio, o case testa a varivel em diversos valores. O valor default especial, e auto-explicativo.

    O case pode tentar casar com strings, expresses regulares ou uma lista de ambos.

    O casamento de strings case-insensitive como o operador de comparao ==.Expresses regulares devem ser escritas entre barras e so case sensitive.

    O exemplo anterior, reescrito:

    case$operatingsystem{

    centos, redhat: { $apache="httpd"}

    debian, ubuntu: { $apache="apache2"}

    default: { fail("sistema operacional desconhecido") }

    }

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    32

  • 5/26/2018 Apostila Puppet

    33/51

    Exemplo usando uma expresso regular:

    case$ipaddress_eth0{

    /^127[\d.]+$/: {

    notify {'erro':

    message =>"Configurao estranha!",

    }

    }

    }

    7.3.4 Selectors

    Ao invs de escolher a partir de um bloco, um selector escolhe seu valor a partir de um grupo devalores. Selectors so usados para atribuir valor a variveis.

    $apache=$operatingsystem? {

    centos =>'httpd', redhat =>'httpd',

    /Ubuntu|Debian/=>'apache2',

    default =>undef,

    }

    O ponto de interrogao assinala $operatingsystem como o piv do selector, e o valor final que atribudo a $apache determinado pelo valor corresponde de $operatingsystem .

    Pode parecer um pouco estranho, mas h muitas situaes em que a forma mais concisa de se obterum valor.

    7.4 Prtica: melhor uso de variveis

    Reescreva o cdigo do exemplo usando uma varivel para armazenar o nome do servio e usandosomente um resource service no seu cdigo.

    package {'ntp':

    ensure=>'installed',

    }

    if$osfamily=='RedHat'{

    service {'ntpd':

    ensure=>'running',

    enable =>'true',

    }}

    elsif$osfamily=='Debian'{

    service {'ntp':

    ensure=>'running',

    enable =>'true',

    }

    }

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    33

  • 5/26/2018 Apostila Puppet

    34/51

    8 Laboratrio

    O padro mais comum na utilizao do Puppet a trade pacote, arquivo de configurao e servio.

    Codifique um manifest que declare o seguinte:

    1. O pacote openssh-server deve estar instalado.

    2. O arquivo de configurao /etc/ssh/sshd_config depende do pacote openssh-server etem como fonte o caminho /root/manifests/sshd_config .

    Dica: faa uma cpia do arquivo para /root/manifests.

    3. O servio sshd deve ser recarregado quando o arquivo de configurao sshd_config formodificado.

    4. Seu manifest deve tratar qual o sistema operacional em relao ao servio. Se for RedHat/CentOSo servio ser sshd, se for Debian/Ubuntu ser apenas ssh.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    34

  • 5/26/2018 Apostila Puppet

    35/51

    9 Master / Agent

    O Puppet geralmente (mas nem sempre) usado como master/agent. O ciclo de operao nesses casos o seguinte:

    1. Os clientes (chamados de node) possuem um agente instalado que permanece em execuo e seconecta ao servidor central (chamado tipicamente de master) periodicamente (a cada 30 minutos,por padro).

    2. O node solicita a sua configurao, que compilada e enviada pelo master.

    3. Essa configurao chamada de catlogo.

    4. O agente aplica o catlogo no node.

    5. O resultado da aplicao do catlogo reportado ao master opcionalmente, havendo divergnciasou no.

    Outra maneira comum de implantao do Puppet a ausncia de um agente em execuo nos nodes. Aaquisio e aplicao do catlogo agendada na crontab.

    9.1 Resoluo de nomes

    A configurao de nome e domnio do sistema operacional, alm da resoluo de nomes, fundamentalpara o correto funcionamento do Puppet, devido ao uso de certificados SSL para a autenticao deagentes e o servidor master.

    Para verificar a configurao de seu sistema, utilize o comando hostname. A sada desse comando nosmostra se o sistema est configurado corretamente.

    # hostname

    node1

    # hostname --domain

    puppet

    # hostname --fqdn

    node1.puppet

    Dica

    Configurao de hostname no Red Hat/Cent e Debian/Ubuntu

    Para resoluo de nomes, configurar corretamente o arquivo /etc/resolv.conf com osparmetros domain e search com o domnio de sua rede.

    O arquivo /etc/hosts deve possuir pelo menos o nome da prpria mquina, com seu IP, FQDNe depois o hostname: 192.168.1.10 node1.puppet node1.

    No Debian, colocar apenas o hostname no arquivo /etc/hostname.

    No CentOS, em /etc/sysconfig/network , ajuste o valor da varivel HOSTNAME.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    35

  • 5/26/2018 Apostila Puppet

    36/51

    Para um bom funcionamento do Puppet fundamental que sua rede possua resoluo de nomes viaDNS configurada. Hostname e domnio de cada sistema operacional devem resolver corretamente paraseu respectivo IP, e o IP deve possuir o respectivo reverso.

    9.2 Segurana e autenticaoAs conexes entre agente e servidor master so realizadas usando o protocolo SSL e, atravs decertificados, ambos se validam. Assim, o agente sabe que est falando com o servidor correto e oservidor master sabe que est falando com um agente conhecido.

    Um servidor master do Puppet um CA (Certificate Authority) e implementa diversas funcionalidadescomo gerar, assinar, revogar e remover certificados para os agentes.

    Os agentes precisam de um certificado assinado pelo master para receber o catlogo com asconfiguraes.

    Quando um agente e master so executados pela primeira vez, um certificado gerado automaticamentepelo Puppet, usando o FQDN do sistema no certificado.

    9.3 Prtica Master/Agent

    9.3.1 Instalao do master

    1. O pacote puppet-server dever estar instalado e certifique-se de que o hostname est correto.

    # hostname --fqdn

    master.puppet

    # yum install puppet-server

    Teremos a seguinte estrutura em /etc/puppet:

    # tree -F --dirsfirst /etc/puppet/

    /etc/puppet/

    |-- manifests/

    |-- modules/

    |-- auth.conf

    |-- fileserver.conf

    `-- puppet.conf

    Sendo:

    auth.conf: regras de acesso a API REST do Puppet.

    fileserver.conf: Utilizado para servir arquivos que no estejam em mdulos.

    manifests/: Armazena a configurao que ser compilada e servida para os agentes.

    modules/: Armazena mdulos com classes, arquivos, plugins e mais configuraes paraserem usadas nos manifests.

    puppet.conf: Principal arquivo de configurao, tanto do master como do agente.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    36

  • 5/26/2018 Apostila Puppet

    37/51

    2. Iniciando o servio:

    # service puppetmaster start

    Os logs, por padro, so enviados para o syslog e esto disponveis no arquivo /var/log/messages:

    tail /var/log/messages

    Nov 13 11:50:57 master puppet-master[2211]: Signed certificate request for ca

    Nov 13 11:50:57 master puppet-master[2211]: Rebuilding inventory file

    Nov 13 11:50:58 master puppet-master[2211]: master.puppet has a waiting certificate request

    Nov 13 11:50:58 master puppet-master[2211]: Signed certificate request for master.puppet

    Nov 13 11:50:58 master puppet-master[2211]: Removing file Puppet::SSL::CertificateRequest \

    master.puppet at '/var/lib/puppet/ssl/ca/requests/master.puppet.pem'

    Nov 13 11:50:58 master puppet-master[2211]: Removing file Puppet::SSL::CertificateRequest \

    master.puppet at '/var/lib/puppet/ssl/certificate_requests/master.puppet.pem'

    Nov 13 11:50:58 master puppet-master[2239]: Starting Puppet master version 3.0.1

    Nov 13 11:50:58 master puppet-master[2239]: Reopening log files

    9.3.2 Instalao do agente em node1

    1. Certifique-se de que o nome e domnio do sistema estejam corretos e instale o pacote puppet namquina node1:

    # hostname --fqdn

    node1.puppet

    # yum install puppet

    A estrutura do diretrio /etc/puppet a mesma do master, e os logs tambm so enviados via syslog

    e esto em /var/log/messages.

    2. Em uma mquina em que o agente est instalado, precisamos configur-la para que ele saiba quem o master.

    No arquivo /etc/puppet/puppet.conf , adicionar o parmetro server na seo [main].

    # vim /etc/puppet/puppet.conf

    [main]

    logdir = /var/log/puppet

    rundir = /var/run/puppet

    ssldir = $vardir/ssl

    # parmetro server

    server = master.puppet

    Nota

    Conectividade

    Certifique-se de que o servidor master na porta 8140 TCP est acessvel para os nodes.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    37

  • 5/26/2018 Apostila Puppet

    38/51

    3. Conecte-se ao master e solicite assinatura de certificado:

    # puppet agent -t

    Info: Creating a new SSL key for node1.puppet

    Info: Caching certificate for ca

    Info: Creating a new SSL certificate request for node1.puppet

    Info: Certificate Request fingerprint (SHA256): 6C:7E:E6:3E:EC:A4:15:56: ...

    4. No servidor master aparecer a solicitao de assinatura para a mquina node1.puppet. Assine-a

    O comando abaixo deve ser executado em master.puppet.

    master # puppet cert list

    "node1.puppet" (SHA256) 6C:7E:E6:3E:EC:A4:15:56:49:C3:1E:A5:E4:7F:58:B8: ...

    master # puppet cert sign node1.puppet

    Signed certificate request for node1.puppetRemoving file Puppet::SSL::CertificateRequest node1.puppet at \

    '/var/lib/puppet/ssl/ca/requests/node1.puppet.pem'

    5. Execute o agente novamente e estaremos prontos para distribuir a configurao.

    O comando abaixo deve ser executado em node1.puppet.

    # puppet agent -t

    Info: Caching certificate for node1.puppet

    Info: Caching certificate_revocation_list for ca

    Info: Retrieving plugin

    Info: Caching catalog for node1.puppet

    Info: Applying configuration version '1352824182'

    Info: Creating state file /var/lib/puppet/state/state.yaml

    Finished catalog run in 0.05 seconds

    Dica

    Possveis problemas com certificados SSL

    importante que os horrios do master e dos nodes no tenham grandes diferenas e estejam,de preferncia, sincronizados. Conexes SSL confiam no relgio e, se estiverem incorretos, entosua conexo pode falhar com um erro indicando que os certificados no so confiveis. Procuremanter os relgios corretamente configurados utilizando NTP.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    38

  • 5/26/2018 Apostila Puppet

    39/51

    10 Nodes

    O Puppet comea a compilao da configurao de um catlogo pelo arquivo/etc/puppet/manifests/site.pp . O site.pp o ponto de entrada do master para identificar a

    configurao que ser enviada a um agente.Para saber qual configurao deve ser enviada a um agente, precisamos declarar o hostname do agente,utilizando a diretiva node. Diretivas node casam sempre com o nome do agente. Por padro, o nome doagente o valor de certname presente no certificado de um agente (por padro, o FQDN).

    10.1 Declarando nodes

    Sintaxe para se declarar um node:

    # /etc/puppet/manifests/site.pp

    node 'node1.puppet'{

    package {'nano': ensure=>'present',

    }

    }

    node 'node2.puppet'{

    package {'vim':

    ensure=>'present',

    }

    }

    No exemplo acima, o agente que se identificar como node1.puppet receber a ordem de instalar o

    pacote nano, enquanto node2.puppet dever instalar o pacote vim. possvel modularizar o arquivo site.pp usando a diretiva import.

    # /etc/puppet/manifests/site.pp

    # Importar os arquivos de /etc/puppet/manifests/nodes/

    # Normalmente cada arquivo tem um node

    import 'nodes/*.pp'

    # Importar vrios nodes somente de um arquivo

    import 'nodes.pp'

    Nota

    Classificao de nodes

    O Puppet fornece um recurso chamado External Node Classifier (ENC), que tem a finalidade dedelegar o registro de nodes para uma entidade externa, evitando a configurao de longosmanifests. Esse recurso ser visto mais adiante.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    39

  • 5/26/2018 Apostila Puppet

    40/51

    10.2 Nomes

    A diretiva node casa com agentes por nome. O nome de um node um identificador nico que porpadro valor de certname, ou seja o FQDN.

    possvel casar nomes de nodes usando expresses regulares:

    # www1, www13, www999

    node/^www\d+$/{

    }

    # foo.dominio.com.br ou bar.dominio.com.br

    node /^(foo|bar)\.dominio\.com\.br$/{

    }

    Tambm podemos aproveitar uma configurao em comum usando uma lista de nomes na declarao deum node.

    node 'www1.dominio.com.br', 'www2.dominio.com.br', 'www3.dominio.com.br'{

    }

    10.3 O node default

    Caso o Puppet Master no encontre nenhuma declarao de node explcita para um agente, em ltimainstncia pode-se criar um node simplesmente chamado default, que casar apenas para os agentesque no encontraram uma definio de node.

    node default {

    }

    10.4 Herana

    possvel utilizar um mecanismo de herana para a declarao de nodes usando a diretiva inheritsda seguinte maneira:

    node 'base'{

    package {'nano': ensure=>'present',

    }

    }

    node 'www1.dominio.com.br'inherits 'base'{

    package {'vim':

    ensure=>'present',

    }

    }

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    40

  • 5/26/2018 Apostila Puppet

    41/51

    Aviso

    Cuidados quanto ao uso de herana de nodes

    Apesar de aparentemente atrativo, recomenda-se evitar usar herana em nodes. Em caso denecessidade de refatorar seu cdigo ou criar excees para mquinas que iro divergir de umnode pai, seu cdigo ficar complicado e de difcil entendimento.

    10.5 Prtica

    1. Declare a mquina node1.puppet no site.pp do master.

    2. Declare o pacote nano como instalado para node1.puppet.

    3. Execute puppet agent -t no node1, certifique-se de que o nano foi instalado.

    Dica

    Simulando a configurao

    Para simularmos as alteraes que sero ou no feitas, usamos puppet agent -t --noop.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    41

  • 5/26/2018 Apostila Puppet

    42/51

    11 Classes e Mdulos

    Ao criar diversos resources para vrios nodes, em algum momento passa a fazer sentido que certosresources que so relacionados estejam juntos, ou resources que sejam utilizados muitas vezes possam

    ser resumidos.Muitas vezes, configuraes especficas de um node precisam ser aproveitadas em outro e torna-senecessrio copiar tudo para o outro node. Quando alteraes so necessrias, preciso realizar diversasmodificaes.

    O Puppet fornece alguns mecanismos chamados resource collections, que so a aglutinao de vriosresources para que possam ser utilizados em conjunto.

    11.1 Classes

    Deixe seu conhecimento sobre programao orientada a objetos de lado a partir de agora.

    Para o Puppet, uma classe a juno de vrios resources sob um nome, uma unidade. um bloco de

    cdigo que pode ser ativado ou desativado.Definindo uma classe:

    classnomedaclasse {

    ...

    }

    Dentro do bloco de cdigo da classe podemos colocar qualquer cdigo Puppet, por exemplo:

    # arquivo ntp.pp

    classntp {

    package { 'ntp':

    ensure=>installed,

    }

    service { 'ntpd':

    ensure =>running,

    enable =>true,

    require=>Package['ntp'],

    }

    }

    Vejamos o resultado ao aplicar esse cdigo:

    # puppet apply ntp.pp

    Finished catalog run in 0.03 seconds

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    42

  • 5/26/2018 Apostila Puppet

    43/51

    Simplesmente nada aconteceu, pois ns apenas definimos a classe. Para utiliz-la, precisamosdeclar-la.

    # arquivo ntp.pp

    classntp {

    package { 'ntp':

    ensure=>installed,

    }

    service { 'ntpd':

    ensure =>running,

    enable =>true,

    require=>Package['ntp'],

    }

    }

    # declarando a classe

    class{'ntp': }

    Aplicando-a novamente:

    # puppet apply --verbose ntp.pp

    Info: Applying configuration version '1352909337'

    /Stage[main]/Ntp/Package[ntp]/ensure: created

    /Stage[main]/Ntp/Service[ntpd]/ensure: ensure changed 'stopped' to 'running'

    Finished catalog run in 5.29 seconds

    Portanto, primeiro definimos uma classe e depois a declaramos.

    11.1.1 Diretiva include

    Existe um outro mtodo de usar uma classe, nesse caso usando a diretiva include.

    # arquivo ntp.pp

    classntp {

    ...

    }

    # declarando a classe ntp usando include

    includentp

    O resultado ser o mesmo.

    Nota

    Declarao de classes sem usar include

    A sintaxe class {'ntp': } utilizada quando usamos classes que recebem parmetros.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    43

  • 5/26/2018 Apostila Puppet

    44/51

    11.2 Mdulos

    Usando classes puramente no resolve nosso problema de repetio de cdigo. O cdigo da classeainda est presente nos manifests.

    Para solucionar esse problema, o Puppet possui o recurso de carregamento automtico de mdulos(module autoloader).

    Primeiramente, devemos conhecer de nosso ambiente onde os mdulos devem estar localizados. Paraisso, verificamos o valor da opo de configurao modulepath.

    # puppet config print modulepath

    /etc/puppet/modules:/usr/share/puppet/modules

    No Puppet, mdulos so a unio de um ou vrios manifests que podem ser reutilizados. O Puppetcarrega automaticamente os manifests dos mdulos presentes em modulepath e os torna disponveis.

    11.2.1 Estrutura de um mduloComo j podemos perceber, mdulos so nada mais que arquivos e diretrios. Porm, eles precisamestar nos lugares corretos para que o Puppet os encontre.

    Vamos olhar mais de perto o que h em cada diretrio.

    meu_modulo/: diretrio onde comea o mdulo e d nome ao mesmo

    manifests/: contm todos os manifests do mdulo

    init.pp: contm definio de uma classe que deve ter o mesmo nome do mdulo

    outra_classe.pp : contm uma classe chamada meu_modulo::outra_classe

    um_diretorio/: o nome do diretrio afeta o nome das classes abaixo

    foo.pp: contm uma classe chamada meu_modulo::um_diretorio::foo

    bar.pp: contm uma classe chamada meu_modulo::um_diretorio::bar

    files/: arquivos estticos que podem ser baixados pelos agentes

    lib/: plugins e fatos customizados implementados em Ruby

    templates/: contm templates usadas no mdulo

    tests/: exemplos de como classes e tipos do mdulo podem ser chamados

    11.3 Prtica: criando um mdulo

    1. Primeiramente, crie a estrutura bsica de um mdulo:

    # cd /etc/puppet/modules

    # mkdir -p ntp/manifests

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    44

  • 5/26/2018 Apostila Puppet

    45/51

    2. O nome de nosso mdulo ntp. Todo mdulo deve possuir um arquivo init.pp, e nele devehaver uma classe com o nome do mdulo.

    # vim /etc/puppet/modules/ntp/manifests/init.pp

    classntp { package { 'ntp':

    ensure=>installed,

    }

    service { 'ntpd':

    ensure =>running,

    enable =>true,

    require=>Package['ntp'],

    }

    }

    3. Deixe o cdigo de site.pp dessa maneira:

    # vim /etc/puppet/manifests/site.pp

    node 'node1.puppet'{

    includentp

    }

    4. Em node1 aplique a configurao:

    # puppet agent -t

    5. Aplique a configurao no master tambm, dessa maneira:

    # puppet apply -e 'include ntp'

    Agora temos um mdulo para configurao de NTP sempre a disposio!

    11.4 Prtica: arquivos de configurao em mdulos

    Alm de conter manifests, mdulos tambm podem servir arquivos. Para isso, faa os seguintes passos:

    1. Crie um diretrio files dentro do mdulo ntp:

    # pwd

    /etc/puppet/modules

    # mkdir -p ntp/files

    2. Como aplicamos o mdulo ntp no master, ele ter o arquivo /etc/ntp.conf disponvel. Copie-o:

    # cp /etc/ntp.conf /etc/puppet/modules/ntp/files/

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    45

  • 5/26/2018 Apostila Puppet

    46/51

    3. Acrescente ao cdigo da classe ntp em /etc/puppet/modules/ntp/manifests/init.pp umresource typefile:

    classntp {

    ...

    file { 'ntp.conf':

    path =>'/etc/ntp.conf',

    require =>Package['ntp'],

    source =>"puppet:///modules/ntp/ntp.conf",

    notify =>Service['ntpd'],

    }

    }

    4. Faa qualquer alterao no arquivo ntp.conf do mdulo (em/etc/puppet/modules/ntp/files/ntp.conf ), por exemplo, acrescentando ou removendo umcomentrio.

    5. Aplique a nova configurao no node1.

    # puppet agent -t

    Dica

    Servidor de arquivos do Puppet

    O Puppet pode servir arquivos dos mdulos, e funciona da mesma maneira se voc estoperando de maneira serverless ou master/agente. Todos os arquivos no diretrio files domdulo ntp esto disponveis na URL puppet:///modules/ntp/ .

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    46

  • 5/26/2018 Apostila Puppet

    47/51

    12 Templates

    Muitas vezes temos um mesmo servio ativado em diversas mquinas, mas em um conjunto demquinas esse servio precisa ser configurado de uma maneira e, no restante das mquinas, de outra.

    Assim, cada conjunto de mquinas precisaria de um arquivo de configurao especfico, mesmo queesse arquivo tivesse uma ou duas linhas de diferena.

    Ento, quando fosse necessrio atualizar uma opo de configurao que comum aos dois conjuntosde mquinas, seria necessrio atualizar dois arquivos de configurao. Alm do cuidado extra de garantirque ambos estivesses corretos.

    O Puppet tem um recurso de templates, em que podemos usar somente um arquivo de dentro dele.Colocamos uma lgica e valores de variveis que venham do seu cdigo, tornando a nossa configuraomais robusta.

    Vamos usar como exemplo um mdulo chamado foo:

    # pwd

    /etc/puppet/modules

    # tree foo

    foo

    |-- manifests

    | `-- init.pp

    `-- templates

    `-- foo.conf.erb

    Agora o contedo do arquivo init.pp:

    # /etc/puppet/modules/foo/manifests/init.pp

    classfoo { $var1='123456'

    $var2='bar'

    file {'/tmp/foo.conf':

    ensure=>'file',

    content =>template('foo/foo.conf.erb')

    }

    }

    At aqui ns usvamos o atributo content com uma string contendo o que queramos dentro do arquivo,mas agora estamos usando a funo template(), que processa o arquivo foo.conf.erb.

    # /etc/puppet/modules/foo/templates/foo.conf.erbvar1=

    var2=

    var3=RedHat

    var3=Outro

    Repare que as variveis do manifest esto disponveis dentro da template, inclusive as variveis dofacter.

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    47

  • 5/26/2018 Apostila Puppet

    48/51

    Nota

    Localizao de uma template no sistema de arquivos

    Note que o caminho que deve ser passado para a funo template() deve conter o nome domdulo, seguido do nome do arquivo de template que usaremos. Portanto,template('foo/foo.conf.erb') significa abrir o arquivo/etc/puppet/modules/foo/templates/foo.conf.erb .

    Usando o mdulo foo em uma mquina CentOS:

    # puppet apply -e 'include foo'

    /Stage[main]/Foo/File[/tmp/foo.conf]/ensure: defined content as \

    '{md5}8612fd8d198746b72f6ac0b46d631a2c'

    Finished catalog run in 0.05 seconds

    # cat /tmp/foo.conf

    var1=123456

    var2=bar

    var3=RedHat

    Dica

    Concatenando templates

    A funo template() pode concatenar vrias templates de uma vez s, possibilitandoconfiguraes sofisticadas.

    template("foo/foo.conf-1.erb", "foo/foo.conf-2.erb")

    12.1 Sintaxe ERB

    Um arquivo de template no Puppet usa a sintaxe ERB, que a linguagem padro de templates do Ruby.Ela simples e poderosa.

    Comentrio:

    Extrai o valor de uma varivel:

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    48

  • 5/26/2018 Apostila Puppet

    49/51

    Condies:

    is not foo!

    Verificar se uma varivel existe:

    Essa maquina do fabricante type:

    Iterao em um array chamado bar:

    Valor:

    Dica

    Evitando linhas em branco

    Repare que no exemplo do arquivo /tmp/foo.conf as linhas em que estavam as tags com oif e end acabaram saindo em branco no arquivo final.

    Caso isso seja um problema, existem dois jeitos de resolvermos.

    1. Colocar todo o cdigo em apenas uma linha, assim o arquivo final no conter linhas embranco:

    var3=RedHatvar3=Outro,

    2. A outra opo colocar um hfen no final de cada tag, assim o ERB no retornar uma linhaem branco:

    12.2 Prtica: usando templates

    1. Crie a estrutura bsica de um mdulo chamado motd:

    # pwd

    /etc/puppet/modules

    # mkdir -p motd/{manifests,templates}

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    49

  • 5/26/2018 Apostila Puppet

    50/51

    2. Defina a classe motd em motd/manifests/init.pp , conforme o cdigo abaixo:

    classmotd {

    $admins=['Joao [email protected]', 'Edu [email protected]', 'Bia [email protected]']

    file {'/etc/motd': ensure =>'file',

    mode =>644,

    content =>template("motd/motd.erb"),

    }

    }

    3. Crie a template em motd/templates/motd.erb com o contedo abaixo:

    Bem vindo a -

    Kernel:

    Em caso de problemas, falar com:

    4. Use o mdulo no node1, execute o agente e confira o resultado:

    Bem vindo a node1.puppet - CentOS 6.4

    Kernel: Linux 2.6.32

    Em caso de problemas, falar com:

    Joao [email protected]

    Edu [email protected]

    Bia [email protected]

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    50

  • 5/26/2018 Apostila Puppet

    51/51

    13 Histrico de mudanas

    Verso 1.0 lanada dia 20/03/2014

    Apostila Puppet Bsico verso 1.0

    Copyright Instruct Treinamento e Desenvolvimento - Licena CC BY-SA 3.0 BR

    51