education-paper-puppet

Transcrição

education-paper-puppet
 Education Paper: “Introdução ao gerenciamento de servidores com Puppet” Junho/2016 Autores: Angela Fernanda Ferreira ­ [email protected] Gustavo Soares de Lima ­ [email protected] O​
lá! Este é mais um paper que dispomos para você se aprofundar em Tecnologia. Desta vez o assunto escolhido foi o Puppet, ferramenta construída para as práticas DevOps que torna a vida de administradores de sistemas Linux mais fácil. Mas porquê você deveria entender de práticas DevOps? Da importância da relação entre virtualização e Linux, advém a importância do gerenciamento de configurações para administradores de sistemas pois cenários que antigamente possuíam poucos servidores hoje podem chegar com facilidade a casa de centenas em poucos dias. Após conhecer o Puppet, se você praticar, perceberá que ele facilitará muito a sua vida como profissional em Linux, pois ele automatizará todas aquelas rotinas desde questões básicas até a instalação e configuração destes mesmos servidores. Isto melhora Copyright Logicus 2016 1 exponencialmente a vida do sysadmin. A vida de um administrador de sistemas em épocas que faltam profissionais não é nada fácil. Você se vê cheio de tarefas repetitivas! Passa o dia realizando as mesmas coisas como configurações de rotas, configurações de hosts, configurações de usuários e permissões, pra não falar de outras coisas como configuração de repositórios, pacotes, variáveis, rotinas no Cron. Cada sysadmin faz a coisa do seu próprio jeito e com isso se aumentam as chances de erro. O que você faz então normalmente? Shell scripts, imagens pré­configuradas, SSH em loop. Ou seja, cada vez mais se aumenta a dificuldade em encontrar problemas. Padronização se torna impossível e documentar se torna um milagre. Aí não adianta rezar e entregar a infra na mão de Deus, ele já tem os seus problemas e quando você menos espera o que ocorre é a diminuição da produtividade. Não se iluda: a culpa é sempre do sysadmin, ou pior: de Deus! Mas você pode mudar essa situação! Aliás, deve! Vivemos um momento de tendências para Virtualização e Computação em nuvem onde o investimento cada vez menor é uma boa prática. Por isto que o sysadmin se tornou um canivete suíço. Isto justifica a necessidade de você se tornar um DevOps! Mas o que é isso? Pense como “Development + Operations”, em tranquilidade, experiência, controle de qualidade. Ou seja, o DevOps pensa a infraestrutura em outro nível. O resultado é produtividade e economia. As práticas DevOps a que nos referimos tem no seu centro a Gerência de Configurações que nada mais é que a distribuição centralizada da configuração, procedimentos definidos, automação, documentação em dia, maior segurança, maior disponibilidade, maior integridade e principalmente maior tempo com a família, porquê se você deixar, o mercado lhe deixará de joelhos como um verdadeiro escravo e ainda o julgará por ineficiência quando as suas energias estiverem esgotadas. Existem diversas ferramentas para gerenciamento de configuração como Ansible, Capistrano, Chef, CFEngine, Puppet e Salt Stack. Sobre o Puppet, que é o nosso alvo neste artigo, podemos dizer que seu objetivo é a Automação de servidores. Foi criado pela Puppet Labs, mais especificamente por Luke Kaines. Possui Licença Apache 2.0 e se trata na realidade de um Framework opensource. Dizemos que o Puppet é uma Ferramenta de nova geração. Trata a infraestrutura como código e possui uma linguagem declarativa. A Puppet Labs oferece ainda suporte e versão Enterprise. Possui comunicação segura SSL, é idempotente e seu código está no GitHub. Diversas empresas usam Puppet como: Nestlé, Nike, Paypal, Seagate, Sony, Nasa, ADP, AON, ARM, Atlassian, Bank of America, Barnes e Noble, BT, Cedexis, Cisco, Ciclability, Condé Nast, Constanct Contact, Costco, EMC, Wikimedia Foundation, Dell, FT.com, Rackspace, General Milis, Genworth, HBO, Hershey’s, Hotwire, ICANN, Copyright Logicus 2016 2 Intel, Intuit, John Deere, KPN, MacAfee, Motorola, Zynga, Twitter, New York Stock Exchange, Disney, Citrix, Oracle, The University of North Texas, Los Alamos National Laboratory, Stanford University, Google, Nokia, Globo e claro, a Logicus. Inclusive a Logicus já esteve presente em diversos eventos palestrando sobre boas práticas com Puppet como no Software Freedom Day, Festival Latinoamericano de Instalação de Software Livre e Fórum de Tecnologia em Software Livre. A utilidade do Puppet é a de que organizações que desejam reduzir o custo de manutenção podem fazê­lo através da redução do custo em tempo de administração de servidores. As especificações do Puppet são as seguintes: Escrito em Ruby e extensível em Ruby. Conhecer Ruby com certeza é de grande valia, pois o seu código está no Git Hub, e assim fica simples para você efetuar modificações caso seja necessário. Mas lembre­se que isto não é pré­requisito, e sim uma dica para que você amplie suas práticas DevOps. No que se refere ao hardware veja o que diz a Puppet Labs: “Recommended requirements: 2­4 processor cores, at least 4 GB RAM, and very accurate timekeeping. Performance will vary, but this configuration can generally manage approximately 1,000 agent nodes”. O Puppet trabalha com uma coisa chamada RAL, ou seja, Resources Abstraction Layer. Você não precisa se preocupar como será feito, apenas deve mandar fazer e o Puppet resolverá pois o Puppet possui seu conjunto de recursos e reconhecimento de providers. O Puppet pode trabalhar em modo autônomo, o que inclusive é fundamental para o aprendizado, pois roda na sua máquina, ou seja, localmente. Boas práticas são sugeridas para se trabalhar com Puppet como código legível já que é fundamental no trabalho em equipe. Neste sentido, lhe alertamos desde já para: as setas alinhadas, Não extrapolar 80 caracteres por linha, em variáveis privilegie letras, números e underscore, fugir do hífen e travessão e para testar o código do manifesto (arquivo que contém declarações do Puppet) usar um comando chamado “​
puppet parser validate manifesto.pp​
”. Mas isso é mais a frente quando olharmos para a sua linguagem declarativa, antes disso precisamos cuidar da instalação. Neste artigo iremos instalar o Puppet nas seguintes distros Linux: ​
Ubuntu 16.04, Debian 8.4, e CentOS 7, ​
e usaremos o CentOS como Puppet Server no momento da configuração para que uma máquina determine o que outra deverá conter, ou seja, na relação cliente­servidor. Vejamos a instalação no Ubuntu 16.04, codinome “Xenial”. Primeiramente você deverá usar o Puppet a partir dos releases disponibilizados pela própria Puppet Labs pois nem sempre encontramos os pacotes atualizados nas distros. Então faça: # wget http://apt.puppetlabs.com/puppetlabs­release­pc1­xenial.deb # sudo dpkg ­i puppetlabs­release­pc1­xenial.deb Copyright Logicus 2016 3 # sudo apt­get update # sudo apt­get install puppet­agent Para instalar em sistemas baseados em Red Hat como é o caso do CentOS 7: # rpm ­Uvh https://yum.puppetlabs.com/puppetlabs­release­pc1­el­7.noarch.rpm # yum install puppet­agent Perceba os pacotes disponíveis: # yum search puppet | grep ­E ^puppet puppet­agent.x86_64 : The Puppet Agent package contains all of the elements puppet­client­tools.x86_64 : PuppetDB CLI for querying Puppet data puppetdb.noarch : Puppet Labs ­ puppetdb puppetdb­termini.noarch : Termini for puppetdb puppetdb­terminus.noarch : Metapackage to allow easy upgrades from PuppetDB 2 puppetlabs­release­pc1.noarch : Release packages for the Puppet Labs PC1 puppetserver.noarch : Puppet Labs ­ puppetserver Agora que já está instalado pode usar o comando “puppet” para um teste. No caso de o comando puppet não estar “presente”, como por exemplo no CentOS7, você pode fazer alternativamente: # whereis puppet puppet: /opt/puppetlabs/bin/puppet # export PATH=/opt/puppetlabs/bin:$PATH Copyright Logicus 2016 4 Isto significou que você teve de indicar o caminho do binário. É possível que tenha que fazer isto em todas as instalações e quando necessário no processo de reinício durante este artigo na prática da instalação do Puppet Master e Puppet Server quando iremos fazer com que uma máquina receba a configuração de outra. Se quiser fazer de forma permanente acrescente no ​
rc.local​
. Para instalar em sistemas baseados no Debian, seguindo o modelo em um Debian Jessie: # wget http://apt.puppetlabs.com/puppetlabs­release­pc1­jessie.deb # dpkg ­i puppetlabs­release­pc1­jessie.deb # apt­get update # apt­get install puppet­agent Veja os pacotes disponíveis no Debian: # apt­cache search puppet ­­names­only etherpuppet ­ create a virtual interface from a remote Ethernet interface fusiondirectory­plugin­puppet ­ Puppet plugin for FusionDirectory fusiondirectory­plugin­puppet­schema ­ LDAP schema for FusionDirectory puppet Plugin librarian­puppet ­ bundler for your puppet modules puppet ­ configuration management system, agent puppet­common ­ configuration management system puppet­el ­ syntax highlighting for puppet manifests in emacs puppet­testsuite ­ configuration management system, development test suite puppetmaster ­ configuration management system, master service puppetmaster­common ­ configuration management system, master common files puppetmaster­passenger ­ configuration management system, scalable master service vim­puppet ­ syntax highlighting for puppet manifests in vim puppet­lint ­ check puppet manifests for style guide conformity puppet­module­puppetlabs­apache ­ Puppet module for apache Copyright Logicus 2016 5 puppet­module­puppetlabs­apt ­ Puppet module for apt puppet­module­puppetlabs­concat ­ Puppet module for concat puppet­module­puppetlabs­firewall ­ Puppet module for Firewall management puppet­module­puppetlabs­inifile ­ Puppet module for ini files puppet­module­puppetlabs­mysql ­ Puppet module for mysql puppet­module­puppetlabs­ntp ­ Puppet module for ntp puppet­module­puppetlabs­postgresql ­ Puppet module for PostgreSQL database puppet­module­puppetlabs­stdlib ­ Puppet module standard library puppet­module­puppetlabs­xinetd ­ Puppet module for xinetd puppet­module­saz­memcached ­ Puppet module for memcached ruby­puppetlabs­spec­helper ­ rake tasks and spec helper for spec tests on puppet modules ruby­rspec­puppet ­ RSpec tests for your Puppet manifests puppetdb­termini ­ Termini for puppetdb puppetdb ­ Puppet Labs puppetdb puppetlabs­release­pc1 ­ Release packages for the Puppet Labs PC1 repository puppetserver ­ Puppet Labs puppetserver puppet­agent ­ The Puppet Agent package contains all of the elements needed to run puppet, including ruby, facter, hiera and mcollective. puppetlabs­release ­ "Package to install Puppet Labs gpg key and apt repo" Para confirmar a instalação digite: “​
puppet agent ­­configprint confdir”​
. Veja um exemplo de comando que dirá onde os arquivos de configuração do Puppet foram instalados: # puppet agent ­­configprint confdir /etc/puppetlabs/puppet Para iniciar o serviço: Copyright Logicus 2016 6 # puppet resource service puppet ensure=running enable=true Notice: /Service[puppet]/ensure: ensure changed 'stopped' to 'running' service { 'puppet': ensure => 'running', enable => 'true', } Vejamos uma breve tabela explicativa do que aconteceu acima: resource a opção do puppet usada, neste caso trata­se de um recurso service é o recurso a que o puppet se refere, neste caso o próprio puppet ensure é a condição do recurso que é o puppet que neste caso é “running”, ou seja, “rodando” enable significa que o puppet deseja o recurso puppet configurado para estar presente na inicialização do sistema Se a saída acima foi igual nas três instalações: Ubuntu 16.04, CentOS 7 e Debian Jessie, então a instalação ocorreu com sucesso! Como você pode perceber usamos o próprio Puppet para dizer “Puppet, eu quero que você esteja rodando”. Que barato! Antes de concluir a instalação é fundamental que confira o FQDN das máquinas, como por exemplo: # puppet agent ­­configprint certname centos.logicus.local Copyright Logicus 2016 7 Se os hostnames não estiverem devidamente configurados você terá problemas no futuro, daí esta conferencia é fundamental, não pule esta etapa de forma alguma. Sem o FQDN devidamente configurado muita coisa não vai funcionar e você pode se frustrar. O Puppet é uma ferramenta exigente dadas as suas possibilidades de atuação, então seja exigente você também com o seu aprendizado. Agora que já possuímos o Puppet instalado vamos dar uma olhada na sua documentação. Digite “​
puppet help”​
. Não ache estranho pois a sintaxe é justamente essa ao invés de usar o “­­” na frente de help. Veja um exemplo: # puppet help Usage: puppet <subcommand> [options] <action> [options] Available subcommands: agent The puppet agent daemon apply Apply Puppet manifests locally ca Local Puppet Certificate Authority management. catalog Compile, save, view, and convert catalogs. cert Manage certificates and requests certificate Provide access to the CA for certificate management. certificate_request Manage certificate requests. certificate_revocation_list Manage the list of revoked certificates. config Interact with Puppet's settings. describe Display help about resource types device Manage remote network devices doc Generate Puppet references epp Interact directly with the EPP template parser/renderer. facts Retrieve and store facts. file Retrieve and store files in a filebucket filebucket Store and retrieve files in a filebucket help Display Puppet help. inspect Send an inspection report Copyright Logicus 2016 8 key Create, save, and remove certificate keys. lookup Data in modules lookup function man Display Puppet manual pages. master The puppet master daemon module Creates, installs and searches for modules on the Puppet Forge. node View and manage node definitions. parser Interact directly with the parser. plugin Interact with the Puppet plugin system. report Create, display, and submit reports. resource The resource abstraction layer shell resource_type View classes, defined resource types, and nodes from all manifests. status View puppet server status. See 'puppet help <subcommand> <action>' for help on a specific subcommand action. See 'puppet help <subcommand>' for help on a specific subcommand. Puppet v4.5.1 Ou seja, sempre que você for usar uma opção, terá uma ajuda rápida muito bem formulada pelo Puppet. Outra forma de ajuda é o Puppet Man, onde você pode usar por exemplo “​
puppet man argumento​
”. Existe ainda o “​
puppet doc​
”. Para ver uma lista das documentações presentes no Puppet Doc faça: # puppet doc ­­list configuration ­ A reference for all settings function ­ All functions available in the parser indirection ­ Indirection types and their terminus classes metaparameter ­ All Puppet metaparameters and all their details providers ­ Which providers are valid for this machine report ­ All available transaction reports type ­ All Puppet resource types and all their details Copyright Logicus 2016 9 Para ver todas as documentações faça: # puppet doc ­­all O resultado será mais de 10 mil linhas de informação! Outra ferramenta auxiliar no uso do Puppet são os Fatos que são informações do sistema. O Puppet possui uma biblioteca Ruby multiplataforma feita pela Puppet Labs que permite que os Fatos também se tornem variáveis. Esta ferramenta se chama Facter. É um programa leve que reúne informações sobre hardware e sistema operacional. Muito útil para recuperar informações como IP, MAC e chaves SSH. Para gerar um arquivo com Fatos você pode fazer um Manifest com este conteúdo: file { "/tmp/fatos_logicus.yaml": content => inline_template("<%= scope.to_hash.reject { |k,v| !( k.is_a?(String) && v.is_a?(String) ) }.to_yaml %>"), } Não entendeu nada né? Calma, mais a frente você verá sobre Manifestos, ou seja, arquivos que contém código do Puppet, e aí na segunda leitura deste artigo isto lhe estará totalmente claro. Vamos ver um exemplo do help do Facter: # facter ­­help Synopsis ======== Collect and display facts about the system. Usage ===== Copyright Logicus 2016 10 facter [options] [query] [query] [...] Options ======= ­­color Enables color output. ­­custom­dir arg A directory to use for custom facts. ­d [ ­­debug ] Enable debug output. ­­external­dir arg A directory to use for external facts. ­h [ ­­help ] Print this help message. ­j [ ­­json ] Output in JSON format. ­­show­legacy Show legacy facts when querying all facts. ­l [ ­­log­level ] arg (=warn) Set logging level. Supported levels are: none, trace, debug, info, warn, error, and fatal. ­­no­color Disables color output. ­­no­custom­facts Disables custom facts. ­­no­external­facts Disables external facts. ­­no­ruby Disables loading Ruby, facts requiring Ruby, and custom facts. ­p [ ­­puppet ] (Deprecated: use `puppet facts` instead) Load the Puppet libraries, thus allowing Facter to load Puppet­specific facts. ­­trace Enable backtraces for custom facts. ­­verbose Enable verbose (info) output. ­v [ ­­version ] Print the version and exit. ­y [ ­­yaml ] Output in YAML format. Description =========== Copyright Logicus 2016 11 Collect and display facts about the current system. The library behind facter is easy to extend, making facter an easy way to collect information about a system. If no queries are given, then all facts will be returned. Example Queries =============== facter kernel facter networking.ip facter processors.models.0 Veja um exemplo de uso do Facter: # facter aio_agent_version => 1.5.1 augeas => { version => "1.4.0" } disks => { sda => { model => "VBOX HARDDISK", size => "8.00 GiB", size_bytes => 8589934592, vendor => "ATA" }, sr0 => { model => "CD­ROM", size => "1.00 GiB", Copyright Logicus 2016 12 size_bytes => 1073741312, vendor => "VBOX" } } dmi => { bios => { release_date => "12/01/2006", vendor => "innotek GmbH", version => "VirtualBox" }, board => { manufacturer => "Oracle Corporation", product => "VirtualBox", serial_number => "0" }, chassis => { type => "Other" }, manufacturer => "innotek GmbH", product => { name => "VirtualBox", serial_number => "0", uuid => "A6F6E8B29D9­248E­BE44B­E6068A414386" } } facterversion => 3.2.0 filesystems => ext2,ext3,ext4 identity => { gid => 0, group => "root", uid => 0, user => "root" Copyright Logicus 2016 13 } is_virtual => true kernel => Linux kernelmajversion => 3.16 kernelrelease => 3.16.0­4­amd64 kernelversion => 3.16.0 load_averages => { 15m => 0.05, 1m => 0, 5m => 0.01 } memory => { swap => { available => "383.00 MiB", available_bytes => 401600512, capacity => "0%", total => "383.00 MiB", total_bytes => 401600512, used => "0 bytes", used_bytes => 0 }, system => { available => "616.06 MiB", available_bytes => 645984256, capacity => "17.46%", total => "746.39 MiB", total_bytes => 782643200, used => "130.33 MiB", used_bytes => 136658944 } } mountpoints => { Copyright Logicus 2016 14 / => { available => "6.36 GiB", available_bytes => 6831726592, capacity => "13.77%", device => "/dev/sda1", filesystem => "ext4", options => [ "rw", "relatime", "errors=remount­ro", "data=ordered" ], size => "7.38 GiB", size_bytes => 7922466816, used => "1.02 GiB", used_bytes => 1090740224 } } networking => { dhcp => "192.168.0.1", domain => "logicus.local", fqdn => "debian.logicus.local", hostname => "debian", interfaces => { eth0 => { bindings => [ { address => "192.168.0.104", netmask => "255.255.255.0", network => "192.168.0.0" } ], Copyright Logicus 2016 15 bindings6 => [ { address => "fe80::a00:27ff:fe24:36ac", netmask => "ffff:ffff:ffff:ffff::", network => "fe80::" } ], dhcp => "192.168.0.1", ip => "192.168.0.104", ip6 => "27ff:fe80::a00:fe24:36ac", mac => "27:24:36:08:00:ac", mtu => 1500, netmask => "255.255.255.0", netmask6 => "ffff:ffff:ffff:ffff::", network => "192.168.0.0", network6 => "fe80::" }, lo => { bindings => [ { address => "127.0.0.1", netmask => "255.0.0.0", network => "127.0.0.0" } ], bindings6 => [ { address => "::1", netmask => "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", network => "::1" } ], Copyright Logicus 2016 16 ip => "127.0.0.1", ip6 => "::1", mtu => 65536, netmask => "255.0.0.0", netmask6 => "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", network => "127.0.0.0", network6 => "::1" } }, ip => "192.168.0.104", ip6 => "fe80::a00:fe24:36ac27ff:", mac => "08:24:36:ac00:27:", mtu => 1500, netmask => "255.255.255.0", netmask6 => "ffff:ffff:ffff:ffff::", network => "192.168.0.0", network6 => "fe80::", primary => "eth0" } os => { architecture => "amd64", distro => { codename => "jessie", description => "Debian GNU/Linux 8.4 (jessie)", id => "Debian", release => { full => "8.4", major => "8", minor => "4" } }, family => "Debian", Copyright Logicus 2016 17 hardware => "x86_64", name => "Debian", release => { full => "8.4", major => "8", minor => "4" }, selinux => { enabled => false } } partitions => { /dev/sda1 => { filesystem => "ext4", mount => "/", partuuid => "96522ed2­01", size => "7.62 GiB", size_bytes => 8185184256, uuid => "58d6­492c­8aa1­2297af916e1c24dd­68ab" }, /dev/sda2 => { size => "1.00 KiB", size_bytes => 1024 }, /dev/sda5 => { filesystem => "swap", partuuid => "96522ed2­05", size => "383.00 MiB", size_bytes => 401604608, uuid => "74c4­7bda­45823548­9b4a­f7215d3ee65a" } } Copyright Logicus 2016 18 path => /opt/puppetlabs/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin processors => { count => 1, isa => "unknown", models => [ "Intel(R) Core(TM) i7­5500U CPU @ 2.40GHz" ], physicalcount => 1 } ruby => { platform => "x86_64­linux", sitedir => "/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.1.0", version => "2.1.9" } ssh => { dsa => { fingerprints => { sha1 => "SSHFP 2 1 ...", sha256 => "SSHFP 2 2 ..." }, key => "..." }, ecdsa => { fingerprints => { sha1 => "SSHFP 3 1 ...", sha256 => "SSHFP 3 2 ..." }, key => "..." }, ed25519 => { fingerprints => { sha1 => "SSHFP 4 1 ...", Copyright Logicus 2016 19 sha256 => "SSHFP 4 2 8..." }, key => "..." }, rsa => { fingerprints => { sha1 => "SSHFP 1 1 ...", sha256 => "SSHFP 1 2 ..." }, key => "..." } } system_uptime => { days => 0, hours => 4, seconds => 14519, uptime => "4:01 hours" } timezone => BRT virtual => virtualbox Você pode ainda usar o Facter de forma específica como por exemplo para ver o uptime: # facter system_uptime { days => 0, hours => 1, seconds => 6315, uptime => "1:45 hours" } Copyright Logicus 2016 20 Para ver informações do Ruby: # facter ruby { platform => "x86_64­linux", sitedir => "/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.1.0", version => "2.1.9" } Para ver informações do sistema operacional: # facter os { architecture => "x86_64", family => "RedHat", hardware => "x86_64", name => "CentOS", release => { full => "7.2.1511", major => "7", minor => "2" }, selinux => { config_mode => "enforcing", current_mode => "enforcing", enabled => true, enforced => true, Copyright Logicus 2016 21 policy_version => "28" } } Para ver informações de rede: # facter networking { dhcp => "192.168.0.1", domain => "logicus.local", fqdn => "centos.logicus.local", hostname => "centos", interfaces => { enp0s3 => { bindings => [ { address => "192.168.0.106", netmask => "255.255.255.0", network => "192.168.0.0" } ], bindings6 => [ { address => "27ff:fe88:fe80::a00:72c8", netmask => "ffff:ffff:ffff:ffff::", network => "fe80::" } ], dhcp => "192.168.0.1", ip => "192.168.0.106", Copyright Logicus 2016 22 ip6 => "8fe80:27ff:fe88:72c:a00:", mac => "72:c808:00:27:88:", mtu => 1500, netmask => "255.255.255.0", netmask6 => "ffff:ffff:ffff:ffff::", network => "192.168.0.0", network6 => "fe80::" }, lo => { bindings => [ { address => "127.0.0.1", netmask => "255.0.0.0", network => "127.0.0.0" } ], bindings6 => [ { address => "::1", netmask => "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", network => "::1" } ], ip => "127.0.0.1", ip6 => "::1", mtu => 65536, netmask => "255.0.0.0", netmask6 => "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", network => "127.0.0.0", network6 => "::1" } }, Copyright Logicus 2016 23 ip => "192.168.0.106", ip6 => "27ff:fe88:72c8fe80::a00:", mac => "27:88:72:c8:08:00:", mtu => 1500, netmask => "255.255.255.0", netmask6 => "ffff:ffff:ffff:ffff::", network => "192.168.0.0", network6 => "fe80::", primary => "enp0s3" } Agora que você conhece os “fatos” é bom que conheça os “recursos” com os quais o Puppet trabalha. Recursos para o Puppet são como blocos de lego. Podem ser combinados para modelar um estado e possui inúmeros tipos nativos. Recursos são programas em Ruby que manipulam estados. É bom que saiba que no caso dos Recursos se trata do Puppet essencialmente em linha de comando. Os Recursos podem variar em tamanho, complexidade e tempo de vida. Por exemplo: Um usuário pode ser um recurso, um serviço pode ser um recurso, um arquivo pode ser um recurso, um pacote pode ser um recurso, uma rotina do cron pode ser um recurso, a execução de um comando pode ser um recurso. Mais a frente veremos o recurso na sua forma declarativa no Puppet através dos manifestos. Por hora veja um exemplo: tipo { ‘titulo’: parametro => ‘valor’, metaparametro => ‘valor’, funcao => ‘valor’, } Para começarmos a se aprofundar nos recursos do Puppet vejamos o help do comando “resource”: Copyright Logicus 2016 24 # puppet help resource puppet­resource(8) ­­ The resource abstraction layer shell ======== SYNOPSIS ­­­­­­­­ Uses the Puppet RAL to directly interact with the system. USAGE ­­­­­ puppet resource [­h|­­help] [­d|­­debug] [­v|­­verbose] [­e|­­edit] [­p|­­param <parameter>] [­t|­­types] [­y|­­to_yaml] <type> [<name>] [<attribute>=<value> ...] DESCRIPTION ­­­­­­­­­­­ This command provides simple facilities for converting current system state into Puppet code, along with some ability to modify the current state using Puppet's RAL. By default, you must at least provide a type to list, in which case puppet resource will tell you everything it knows about all resources of that type. You can optionally specify an instance name, and puppet resource will only describe that single instance. If given a type, a name, and a series of <attribute>=<value> pairs, puppet resource will modify the state of the specified resource. Alternately, if given a type, a name, and the '­­edit' flag, puppet resource will write its output to a file, open that file in an editor, Copyright Logicus 2016 25 and then apply the saved file as a Puppet transaction. OPTIONS ­­­­­­­ Note that any setting that's valid in the configuration file is also a valid long argument. For example, 'ssldir' is a valid setting, so you can specify '­­ssldir <directory>' as an argument. See the configuration file documentation at https://docs.puppetlabs.com/puppet/latest/reference/configuration.html for the full list of acceptable parameters. A commented list of all configuration options can also be generated by running puppet with '­­genconfig'. * ­­debug: Enable full debugging. * ­­edit: Write the results of the query to a file, open the file in an editor, and read the file back in as an executable Puppet manifest. * ­­help: Print this help message. * ­­param: Add more parameters to be outputted from queries. * ­­types: List all available types. Copyright Logicus 2016 26 * ­­verbose: Print extra information. * ­­to_yaml: Output found resources in yaml format, suitable to use with Hiera and create_resources. EXAMPLE ­­­­­­­ This example uses `puppet resource` to return a Puppet configuration for the user `luke`: $ puppet resource user luke user { 'luke': home => '/home/luke', uid => '100', ensure => 'present', comment => 'Luke Kanies,,,', gid => '1000', shell => '/bin/bash', groups => ['sysadmin','audio','video','puppet'] } AUTHOR ­­­­­­ Luke Kanies COPYRIGHT ­­­­­­­­­ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License Copyright Logicus 2016 27 Bom, falamos que um usuário poderia ser um recurso não é mesmo? Para ver todos os usuários: # puppet resource user user { '_apt': ensure => 'present', gid => '65534', home => '/nonexistent', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/bin/false', uid => '105', } user { 'administrador': ensure => 'present', comment => 'administrador,,,', gid => '1000', groups => ['adm', 'cdrom', 'sudo', 'dip', 'plugdev', 'lxd', 'lpadmin', 'sambashare'], home => '/home/administrador', password => '$6$.ZWqylpH$nubx9.Ty0rK0QXKt4To9dcTFo8iW84CeC7Gs1pWXUwMH7qXITB3wBp1CeZdJRf/QYDtx7WTAivuG2.94yJe5..', password_max_age => '99999', password_min_age => '0', shell => '/bin/bash', uid => '1000', } user { 'backup': ensure => 'present', comment => 'backup', gid => '34', home => '/var/backups', password => '*', password_max_age => '99999', Copyright Logicus 2016 28 password_min_age => '0', shell => '/usr/sbin/nologin', uid => '34', } user { 'bin': ensure => 'present', comment => 'bin', gid => '2', home => '/bin', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '2', } user { 'daemon': ensure => 'present', comment => 'daemon', gid => '1', home => '/usr/sbin', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '1', } user { 'dnsmasq': ensure => 'present', comment => 'dnsmasq,,,', gid => '65534', home => '/var/lib/misc', password => '*', Copyright Logicus 2016 29 password_max_age => '99999', password_min_age => '0', shell => '/bin/false', uid => '109', } user { 'games': ensure => 'present', comment => 'games', gid => '60', home => '/usr/games', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '5', } user { 'gnats': ensure => 'present', comment => 'Gnats Bug­Reporting System (admin)', gid => '41', home => '/var/lib/gnats', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '41', } user { 'irc': ensure => 'present', comment => 'ircd', gid => '39', home => '/var/run/ircd', Copyright Logicus 2016 30 password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '39', } user { 'list': ensure => 'present', comment => 'Mailing List Manager', gid => '38', home => '/var/list', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '38', } user { 'logicus': ensure => 'present', comment => ',,,', gid => '1001', home => '/home/logicus', password => '$6$bbKy5lyy$Higgb4iG/SR/rc9voM7LAaSoV.GBwuWbLiUmPZAG12ZWT2yi6L6U1sSnOaIFlGTMB5Sse8tAEF62Yjcx5nwIb0', password_max_age => '99999', password_min_age => '0', shell => '/bin/bash', uid => '1001', } user { 'lp': ensure => 'present', comment => 'lp', gid => '7', Copyright Logicus 2016 31 home => '/var/spool/lpd', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '7', } user { 'lxd': ensure => 'present', gid => '65534', home => '/var/lib/lxd/', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/bin/false', uid => '106', } user { 'mail': ensure => 'present', comment => 'mail', gid => '8', home => '/var/mail', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '8', } user { 'man': ensure => 'present', comment => 'man', gid => '12', Copyright Logicus 2016 32 home => '/var/cache/man', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '6', } user { 'messagebus': ensure => 'present', gid => '111', home => '/var/run/dbus', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/bin/false', uid => '107', } user { 'news': ensure => 'present', comment => 'news', gid => '9', home => '/var/spool/news', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '9', } user { 'nobody': ensure => 'present', comment => 'nobody', gid => '65534', Copyright Logicus 2016 33 home => '/nonexistent', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '65534', } user { 'proxy': ensure => 'present', comment => 'proxy', gid => '13', home => '/bin', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '13', } user { 'puppet': ensure => 'present', comment => 'Puppet configuration management daemon,,,', gid => '117', home => '/var/lib/puppet', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/bin/false', uid => '111', } user { 'root': ensure => 'present', comment => 'root', Copyright Logicus 2016 34 gid => '0', home => '/root', password => '!', password_max_age => '99999', password_min_age => '0', shell => '/bin/bash', uid => '0', } user { 'sshd': ensure => 'present', gid => '65534', home => '/var/run/sshd', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '110', } user { 'sync': ensure => 'present', comment => 'sync', gid => '65534', home => '/bin', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/bin/sync', uid => '4', } user { 'sys': ensure => 'present', comment => 'sys', Copyright Logicus 2016 35 gid => '3', home => '/dev', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '3', } user { 'syslog': ensure => 'present', gid => '108', groups => ['adm'], home => '/home/syslog', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/bin/false', uid => '104', } user { 'systemd­bus­proxy': ensure => 'present', comment => 'systemd Bus Proxy,,,', gid => '105', home => '/run/systemd', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/bin/false', uid => '103', } user { 'systemd­network': ensure => 'present', Copyright Logicus 2016 36 comment => 'systemd Network Management,,,', gid => '103', home => '/run/systemd/netif', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/bin/false', uid => '101', } user { 'systemd­resolve': ensure => 'present', comment => 'systemd Resolver,,,', gid => '104', home => '/run/systemd/resolve', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/bin/false', uid => '102', } user { 'systemd­timesync': ensure => 'present', comment => 'systemd Time Synchronization,,,', gid => '102', home => '/run/systemd', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/bin/false', uid => '100', } user { 'uucp': Copyright Logicus 2016 37 ensure => 'present', comment => 'uucp', gid => '10', home => '/var/spool/uucp', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '10', } user { 'uuidd': ensure => 'present', gid => '112', home => '/run/uuidd', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/bin/false', uid => '108', } user { 'www­data': ensure => 'present', comment => 'www­data', gid => '33', home => '/var/www', password => '*', password_max_age => '99999', password_min_age => '0', shell => '/usr/sbin/nologin', uid => '33', } Copyright Logicus 2016 38 Ok! Mas ele mostrou todos os usuários. E se você quiser ver as informações de apenas um usuário do sistema, por exemplo o Root. Veja o exemplo: # puppet resource user root user { 'root': ensure => 'present', comment => 'root', gid => '0', home => '/root', password => 'Ljw$h8JJmJvIxvDLjw1$1$jrm5tn9mCZM/', password_max_age => '99999', password_min_age => '0', shell => '/bin/bash', uid => '0', } Ou seja, é como se disséssemos “​
puppet me mostre as informações do recurso usuário do root​
”. Vamos criar um usuário e ver como o Puppet o enxerga. Façamos isto em três passos: a) criamos o usuário, b) pedimos informação dele para o puppet para ver o seu estado (ensure), e senha (se há alguma), c) mudamos a senha do usuário, e d) pedimos novamente informação do usuário e verificamos o campo relativo a senha: # adduser gustavo # puppet resource user gustavo user { 'gustavo': ensure => 'present', gid => '502', home => '/home/gustavo', password => '!!', password_max_age => '99999', Copyright Logicus 2016 39 password_min_age => '0', shell => '/bin/bash', uid => '502', } # passwd gustavo Mudando senha para o usuário gustavo. Nova senha: Redigite a nova senha: passwd: todos os tokens de autenticações foram atualizados com sucesso. # puppet resource user gustavo user { 'gustavo': ensure => 'present', gid => '502', home => '/home/gustavo', password => 'O6zn$1$i1Mz9cgG$MHjc.x6sV/Hf4jh4t.', password_max_age => '99999', password_min_age => '0', shell => '/bin/bash', uid => '502', } Como mágica! Ou seja, observe que quando criamos o usuário “gustavo” o mesmo não possuía senha e quando realizamos a mudança de senha o Puppet já tratou de conhecer essa mudança. O resultado do comando Puppet Resource então nos trás as informações dos recursos que desejamos! Ok! Mas se quisermos que o próprio Puppet crie um usuário que não está presente, por exemplo, o usuário “angela”. Vejamos que este usuário não existe no sistema: # puppet resource user angela Copyright Logicus 2016 40 user { 'angela': ensure => 'absent', } Usemos então a opção “ensure=present”: # puppet resource user angela ensure=present Notice: /User[angela]/ensure: created user { 'angela': ensure => 'present', } Ou seja, primeiros vimos que o usuário “angela” estava “absent”, ou seja, não existia no sistema, este era o seu “ensure”. Depois dissemos para o Puppet criar o usuário. Vamos confirmar: # cat /etc/passwd | grep angela angela:x:1002:1002::/home/angela: Já está imaginando os superpoderes que o Puppet lhe fornecerá não é mesmo? Calma, ainda tem bem mais pra se ver… Dissemos também que arquivos e diretórios podiam ser recursos não é mesmo?! Para ver o recurso de um arquivo, neste caso o arquivo “​
/etc/hosts​
”: # puppet resource file /etc/hosts file { '/etc/hosts': ensure => 'file', content => '{md5}2a4692ead945f435ff7cc9b2e4faf82f', Copyright Logicus 2016 41 ctime => '2016­06­04 15:28:00 ­0300', group => '0', mode => '0644', mtime => '2016­06­04 15:28:00 ­0300', owner => '0', type => 'file', } Olha que bacana, além de informações como o dono, grupo, tipo ele ainda nos deu o md5 do arquivo. Ok! Mas se pedirmos para ver um diretório que não existe? Exemplo: # puppet resource file /home/logicus/backup/configuracao file { '/home/logicus/backup/configuracao': ensure => 'absent', } Vamos criar manualmente o diretório: # mkdir ­pv /home/logicus/backup/configuracao mkdir: foi criado o diretório '/home/logicus/backup' mkdir: foi criado o diretório '/home/logicus/backup/configuracao' Vejamos agora o resultado: # puppet resource file /home/logicus/backup/configuracao file { '/home/logicus/backup/configuracao': Copyright Logicus 2016 42 ensure => 'directory', ctime => '2016­06­04 16:28:10 ­0300', group => '0', mode => '0755', mtime => '2016­06­04 16:28:10 ­0300', owner => '0', type => 'directory', } Se você quiser criar um arquivo abrindo um editor para modificar algo veja o seguinte exemplo. Nele vamos usar a opção “​
­­edit​
” e alterar no editor que abrirá a permissão padrão de criação do arquivo. Vejamos: # puppet resource file /tmp/exemplo ensure=present ­­edit Acrescente a linha relacionado a permissão como no exemplo abaixo: file { '/tmp/exemplo': ensure => 'file', mode => '777', } Saia salvando o arquivo e veja o resultado: Notice: /File[/tmp/exemplo]/ensure: created Notice: Compiled catalog for ubuntu.logicus.local in environment production in 0.03 seconds Info: Applying configuration version '1465069983' Copyright Logicus 2016 43 Notice: /Stage[main]/Main/File[/tmp/exemplo]/mode: mode changed '0644' to '0777' Notice: Applied catalog in 0.03 seconds O Puppet alterou a permissão como indicamos! Dissemos também que pacotes podem ser um recurso. Vamos tentar acessar o programa glances. # glances O programa 'glances' não está instalado no momento. Vejamos: # puppet resource package glances ensure=present Notice: /Package[glances]/ensure: created package { 'glances': ensure => '2.3­1build1', } Agora tente acessar novamente o glances e perceba que ele já estará presente em seu sistema! Para remover o pacote apenas mude a opção de “ensure” de “present” para “absent”: # puppet resource package glances ensure=absent Notice: /Package[glances]/ensure: removed package { 'glances': ensure => 'absent', } Copyright Logicus 2016 44 Se quiser novamente o pacote e na última versão disponível faça: # puppet resource package glances ensure=latest Você pode até mesmo executar um comando usando o resource “​
exec​
”. Vamos fazer um teste. Primeiro mude seu editor padrão para o Nano com o seguinte comando: # update­alternatives ­­set editor /bin/nano Digite no terminal: # editor Confira se realmente entrou no Nano. Se sim, tudo certo até aqui. Agora vamos usar o resource “​
exec​
” para que seja aplicado o mesmo comando só que mudando o editor padrão para o vim. O manifesto (arquivo com extensão .pp) deve ficar assim: # cat logicus.pp exec { "update­alternatives ­­set editor /usr/bin/vim.basic": path => "/usr/bin:/usr/sbin:/bin", } E vamos aplicar o manifesto: Copyright Logicus 2016 45 # puppet apply logicus.pp Notice: Compiled catalog for ubuntu.logicus.local in environment production in 0.12 seconds Notice: /Stage[main]/Main/Exec[update­alternatives ­­set editor /usr/bin/vim.basic]/returns: executed successfully Notice: Applied catalog in 0.07 seconds E por fim tente acessar o editor: # editor Ok! Sem perceber você criou um manifesto e mandou o Puppet aplicar e neste manifesto usou um recurso. Mais a frente iremos explicar melhor sobre o que é um manifesto, por hora, só queríamos levar você a navegar por outras formas de aplicar recursos. Voltando aos recursos gostaríamos de dizer que mesmo um “host” pode ser um recurso e novamente vamos usar um manifesto, vejamos: # cat logicus.pp host { 'ubuntu.logicus.local': ensure => 'present', ip => '192.168.0.105', host_aliases => 'ubuntu', } host { 'centos.logicus.local': ensure => 'present', ip => '192.168.0.102', host_aliases => 'centos', } host { 'debian.logicus.local': Copyright Logicus 2016 46 ensure
=> 'present', ip => '192.168.0.104', host_aliases => 'debian', } Neste caso estamos considerando os ips na infra aqui da Logicus, você deve alterar os ips de acordo com os que seu DHCP deu para o seu lab aí! Vamos aplicar o manifesto: # puppet apply logicus.pp Notice: Compiled catalog for centos.logicus.local in environment production in 0.16 seconds Notice: /Stage[main]/Main/Host[ubuntu.logicus.local]/ensure: created Notice: /Stage[main]/Main/Host[centos.logicus.local]/ensure: created Notice: /Stage[main]/Main/Host[debian.logicus.local]/ensure: created Notice: Applied catalog in 0.05 seconds Confira agora seu arquivo ​
/etc/hosts​
, ele deve possuir os hosts que adicionamos através do Puppet. Imaginamos que você deve estar agora pensando em todas as possibilidades de uso dos recursos. Existe um comando chamado “describe” usado para descobrir informações sobre os recursos. O “​
puppet describe​
” é um subcomando para listar informações sobre os tipos de recursos atualmente instalados em uma determinada máquina. Vejamos seu help: # puppet help describe puppet­describe(8) ­­ Display help about resource types ======== SYNOPSIS ­­­­­­­­ Copyright Logicus 2016 47 Prints help about Puppet resource types, providers, and metaparameters. USAGE ­­­­­ puppet describe [­h|­­help] [­s|­­short] [­p|­­providers] [­l|­­list] [­m|­­meta] OPTIONS ­­­­­­­ * ­­help: Print this help text * ­­providers: Describe providers in detail for each type * ­­list: List all types * ­­meta: List all metaparameters * ­­short: List only parameters without detail EXAMPLE ­­­­­­­ $ puppet describe ­­list $ puppet describe file ­­providers $ puppet describe user ­s ­m Copyright Logicus 2016 48 AUTHOR ­­­­­­ David Lutterkort COPYRIGHT ­­­­­­­­­ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License Vejamos os tipos que estão disponíveis: # puppet describe ­­list These are the types known to puppet: augeas ­ Apply a change or an array of changes to the ... computer ­ Computer object management using DirectorySer ... cron ­ Installs and manages cron jobs exec ­ Executes external commands file ­ Manages files, including their content, owner ... filebucket ­ A repository for storing and retrieving file ... group ­ Manage groups host ­ Installs and manages host entries interface ­ This represents a router or switch interface k5login ­ Manage the `.k5login` file for a user macauthorization ­ Manage the Mac OS X authorization database mailalias ­ .. no documentation .. maillist ­ Manage email lists mcx ­ MCX object management using DirectoryService ... mount ­ Manages mounted filesystems, including puttin ... nagios_command ­ The Nagios type command Copyright Logicus 2016 49 nagios_contact ­ The Nagios type contact nagios_contactgroup ­ The Nagios type contactgroup nagios_host ­ The Nagios type host nagios_hostdependency ­ The Nagios type hostdependency nagios_hostescalation ­ The Nagios type hostescalation nagios_hostextinfo ­ The Nagios type hostextinfo nagios_hostgroup ­ The Nagios type hostgroup nagios_service ­ The Nagios type service nagios_servicedependency ­ The Nagios type servicedependency nagios_serviceescalation ­ The Nagios type serviceescalation nagios_serviceextinfo ­ The Nagios type serviceextinfo nagios_servicegroup ­ The Nagios type servicegroup nagios_timeperiod ­ The Nagios type timeperiod notify ­ .. no documentation .. package ­ Manage packages resources ­ This is a metatype that can manage other reso ... router ­ .. no documentation .. schedule ­ Define schedules for Puppet scheduled_task ­ Installs and manages Windows Scheduled Tasks selboolean ­ Manages SELinux booleans on systems with SELi ... selmodule ­ Manages loading and unloading of SELinux poli ... service ­ Manage running services ssh_authorized_key ­ Manages SSH authorized keys sshkey ­ Installs and manages ssh host keys stage ­ A resource type for creating new run stages tidy ­ Remove unwanted files based on specific crite ... user ­ Manage users vlan ­ .. no documentation .. whit ­ Whits are internal artifacts of Puppet's curr ... yumrepo ­ The client­side description of a yum reposito ... zfs ­ Manage zfs zone ­ Manages Solaris zones Copyright Logicus 2016 50 zpool ­ Manage zpools Use a opção ­s para uma lista curta. Digamos que você queira ver mais sobre o recurso user por exemplo: # 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, forcelocal, gid, groups, home, ia_load_module, iterations, key_membership, keys, loginclass, managehome, membership, name, password, password_max_age, password_min_age, profile_membership, profiles, project, purge_ssh_keys, role_membership, roles, salt, shell, system, uid Providers Copyright Logicus 2016 51 ­­­­­­­­­ aix, directoryservice, hpuxuseradd, ldap, openbsd, pw, user_role_add, useradd, windows_adsi Para lista longa faça apenas o tipo. Digamos que você queira ver mais sobre o recurso “mount” por exemplo: # puppet describe mount mount ===== Manages mounted filesystems, including putting mount information into the mount table. The actual behavior depends on the value of the 'ensure' parameter. **Refresh:** `mount` resources can respond to refresh events (via `notify`, `subscribe`, or the `~>` arrow). If a `mount` receives an event from another resource **and** its `ensure` attribute is set to `mounted`, Puppet will try to unmount then remount that filesystem. **Autorequires:** If Puppet is managing any parents of a mount resource ­­­ that is, other mount points higher up in the filesystem ­­­ the child mount will autorequire them. If Puppet is managing the file path of a mount point, the mount resource will autorequire it. **Autobefores:** If Puppet is managing any child file paths of a mount point, the mount resource will autobefore them. Parameters ­­­­­­­­­­ ­ **atboot** Whether to mount the mount at boot. Not all platforms Copyright Logicus 2016 52 support this. ­ **blockdevice** The device to fsck. This is property is only valid on Solaris, and in most cases will default to the correct value. ­ **device** The device providing the mount. This can be whatever device is supporting by the mount, including network devices or devices specified by UUID rather than device path, depending on the operating system. ­ **dump** Whether to dump the mount. Not all platform support this. Valid values are `1` or `0` (or `2` on FreeBSD). Default is `0`. Values can match `/(0|1)/`. ­ **ensure** Control what to do with this mount. Set this attribute to `unmounted` to make sure the filesystem is in the filesystem table but not mounted (if the filesystem is currently mounted, it will be unmounted). Set it to `absent` to unmount (if necessary) and remove the filesystem from the fstab. Set to `mounted` to add it to the fstab and mount it. Set to `present` to add to fstab but not change mount/unmount status. Valid values are `defined` (also called `present`), `unmounted`, `absent`, `mounted`. ­ **fstype** The mount type. Valid values depend on the operating system. This is a required option. Copyright Logicus 2016 53 ­ **name** The mount path for the mount. ­ **options** A single string containing options for the mount, as they would appear in fstab. For many platforms this is a comma delimited string. Consult the fstab(5) man page for system­specific details. ­ **pass** The pass in which the mount is checked. ­ **remounts** Whether the mount can be remounted `mount ­o remount`. If this is false, then the filesystem will be unmounted and remounted manually, which is prone to failure. Valid values are `true`, `false`. ­ **target** The file in which to store the mount table. Only used by those providers that write to disk. Providers ­­­­­­­­­ parsed Seria interessante também obter os metaparâmetros não é mesmo? Neste caso você deve usar a opção “­m”, como descrito no help. Vejamos: # puppet describe ­s ­m cron Copyright Logicus 2016 54 cron ==== Installs and manages cron jobs. Every cron resource created by Puppet requires a command and at least one periodic attribute (hour, minute, month, monthday, weekday, or special). While the name of the cron job is not part of the actual job, the name is stored in a comment beginning with `# Puppet Name: `. These comments are used to match crontab entries created by Puppet with cron resources. If an existing crontab entry happens to match the scheduling and command of a cron resource that has never been synched, Puppet will defer to the existing crontab entry and will not create a new entry tagged with the `# Puppet Name: ` comment. Example: cron { 'logrotate': command => '/usr/sbin/logrotate', user => 'root', hour => 2, minute => 0, } Note that all periodic attributes can be specified as an array of values: cron { 'logrotate': command => '/usr/sbin/logrotate', user => 'root', hour => [2, 4], } ...or using ranges or the step syntax `*/2` (although there's no guarantee that your `cron` daemon supports these): cron { 'logrotate': command => '/usr/sbin/logrotate', Copyright Logicus 2016 55 user => 'root', hour => ['2­4'], minute => '*/10', } An important note: _the Cron type will not reset parameters that are removed from a manifest_. For example, removing a `minute => 10` parameter will not reset the minute component of the associated cronjob to `*`. These changes must be expressed by setting the parameter to `minute => absent` because Puppet only manages parameters that are out of sync with manifest entries. **Autorequires:** If Puppet is managing the user account specified by the `user` property of a cron resource, then the cron resource will autorequire that user. Parameters ­­­­­­­­­­ command, ensure, environment, hour, minute, month, monthday, name, special, target, user, weekday Meta Parameters ­­­­­­­­­­­­­­­ alias, audit, before, consume, export, loglevel, noop, notify, require, schedule, stage, subscribe, tag Providers ­­­­­­­­­ crontab Copyright Logicus 2016 56 Todos estes metaparâmetros serão muito usados nos manifestos! Mas antes de ver os manifestos é preciso fixar bem a lógica da “aplicação do manifesto”, ou seja, conhecer o “​
apply​
”, ferramenta que dirá ao Puppet que desejamos uma determinada configuração de recursos. Vejamos o help: # puppet help apply puppet­apply(8) ­­ Apply Puppet manifests locally ======== SYNOPSIS ­­­­­­­­ Applies a standalone Puppet manifest to the local system. USAGE ­­­­­ puppet apply [­h|­­help] [­V|­­version] [­d|­­debug] [­v|­­verbose] [­e|­­execute] [­­detailed­exitcodes] [­L|­­loadclasses] [­l|­­logdest syslog|eventlog|<FILE>|console] [­­noop] [­­catalog <catalog>] [­­write­catalog­summary] <file> DESCRIPTION ­­­­­­­­­­­ This is the standalone puppet execution tool; use it to apply individual manifests. When provided with a modulepath, via command line or config file, puppet apply can effectively mimic the catalog that would be served by puppet master with access to the same modules, although there are some subtle differences. When combined with scheduling and an automated system for Copyright Logicus 2016 57 pushing manifests, this can be used to implement a serverless Puppet site. Most users should use 'puppet agent' and 'puppet master' for site­wide manifests. OPTIONS ­­­­­­­ Note that any setting that's valid in the configuration file is also a valid long argument. For example, 'tags' is a valid setting, so you can specify '­­tags <class>,<tag>' as an argument. See the configuration file documentation at https://docs.puppetlabs.com/puppet/latest/reference/configuration.html for the full list of acceptable parameters. A commented list of all configuration options can also be generated by running puppet with '­­genconfig'. * ­­debug: Enable full debugging. * ­­detailed­exitcodes: Provide extra information about the run via exit codes. If enabled, 'puppet apply' will use the following exit codes: 0: The run succeeded with no changes or failures; the system was already in the desired state. 1: The run failed. Copyright Logicus 2016 58 2: The run succeeded, and some resources were changed. 4: The run succeeded, and some resources failed. 6: The run succeeded, and included both changes and failures. * ­­help: Print this help message * ­­loadclasses: Load any stored classes. 'puppet agent' caches configured classes (usually at /etc/puppetlabs/puppet/classes.txt), and setting this option causes all of those classes to be set in your puppet manifest. * ­­logdest: Where to send log messages. Choose between 'syslog' (the POSIX syslog service), 'eventlog' (the Windows Event Log), 'console', or the path to a log file. Defaults to 'console'. A path ending with '.json' will receive structured output in JSON format. The log file will not have an ending ']' automatically written to it due to the appending nature of logging. It must be appended manually to make the content valid JSON. * ­­noop: Use 'noop' mode where Puppet runs in a no­op or dry­run mode. This is useful for seeing what changes Puppet will make without actually executing the changes. * ­­execute: Execute a specific piece of Puppet code Copyright Logicus 2016 59 * ­­test: Enable the most common options used for testing. These are 'verbose', 'detailed­exitcodes' and 'show_diff'. * ­­verbose: Print extra information. * ­­catalog: Apply a JSON catalog (such as one generated with 'puppet master ­­compile'). You can either specify a JSON file or pipe in JSON from standard input. * ­­write­catalog­summary After compiling the catalog saves the resource list and classes list to the node in the state directory named classes.txt and resources.txt EXAMPLE ­­­­­­­ $ puppet apply ­l /tmp/manifest.log manifest.pp $ puppet apply ­­modulepath=/root/dev/modules ­e "include ntpd::server" $ puppet apply ­­catalog catalog.json AUTHOR ­­­­­­ Luke Kanies COPYRIGHT ­­­­­­­­­ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License Vejamos um exemplo um pouco mais completo de manifesto: Copyright Logicus 2016 60 # cat logicus.pp package { "postfix": ensure => installed, } service { "postfix": ensure => running, enable => true, hasrestart => true, hasstatus => true, require => Package['postfix'], } file { 'main.cf': path => '/etc/postfix/main.cf', ensure => present, owner => 'root', group => 'root', mode => '0644', require => Package['postfix'], notify => Service['postfix'], } Neste arquivo fizemos diversos usos de recursos para criar um arquivo onde deixamos claro o que queremos com relação ao postfix na máquina em questão. Antes de continuar uma breve pausa para explicar algumas coisas novas. Veja a tabela simplificada abaixo: enable indica se o sistema deve estar ativado na inicialização, neste caso Copyright Logicus 2016 61 “true” require indica que é preciso outro recurso como requisito, neste caso o pacote do postfix path indica um caminho, neste caso onde deve estar o arquivo de configuração do postfix notify indica que deve haver uma notificação, neste caso ao serviço do postfix Para aplicar esta configuração vamos usar o “apply”: # puppet apply logicus.pp Notice: Compiled catalog for debian.logicus.local in environment production in 0.67 seconds Notice: /Stage[main]/Main/Package[postfix]/ensure: created Notice: Applied catalog in 14.72 seconds E confira: # service postfix status ● postfix.service ­ LSB: Postfix Mail Transport Agent Loaded: loaded (/etc/init.d/postfix) Drop­In: /run/systemd/generator/postfix.service.d └─50­postfix­$mail­transport­agent.conf Active: active (running) since Sáb 2016­06­04 19:46:23 BRT; 43s ago CGroup: /system.slice/postfix.service Copyright Logicus 2016 62 ├─4406 /usr/lib/postfix/master ├─4407 pickup ­l ­t unix ­u ­c └─4408 qmgr ­l ­t unix ­u Jun 04 19:46:23 debian.logicus.local postfix[4296]: Starting Postfix Mail Transport Agent: postfix. Jun 04 19:46:23 debian.logicus.local postfix/master[4406]: daemon started ­­ version 2.11.3, configuration /etc/postfix Não entendeu ainda a lógica dos manifestos? Agora é que começaremos a esmiuçar os manifestos, estes tais arquivos do “Puppet”... O manifesto atua como receita de bolo. Trata­se de um arquivo de texto plano com extensão “.pp”. É dentro dos manifestos que vão as declarações de recursos. Ou seja, é onde se descreve um estado desejado para um recurso. Para aplicar um manifesto basta o comando: ​
puppet apply meu_manifesto.pp​
. E você já fez isto antes, mesmo sem entendê­lo ainda. Bom, o manifesto usa de uma linguagem declarativa, uma DSL ­ Domain Specific Linguage. A DSL é uma linguagem projetada para ser acessível aos administradores de sistema. Os manifestos são baseados no arquivo de configuração do Nagios. Lembre­se que DSL não é linguagem de programação! Para fixar entenda que os recursos são distribuídos nos manifestos da seguinte forma: um tipo, título e atributos. Exemplo: tipo { 'título': param1 => 'valor', param2 => 'valor', param3 => 'valor', metaparam1 => 'valor', metaparam2 => 'valor', function1 => 'valor', function2 => 'valor', }
Lembra­se que bem no início do artigo falamos sobre boas práticas? Então, para conferir se a sintaxe do arquivo pp está correta pode fazer: Copyright Logicus 2016 63 # puppet parser validate manifesto.pp Você pode ainda realçar a sintaxe dos arquivos com extensão “pp” no Vim. Para insto instale o pacote vim­puppet: # aptitude install vim­puppet Em seguida faça: # vim­addons install puppet Agora os manifestos que veremos a frente ficarão coloridos no seu Vim! Lembra que temos no sistema dois usuários, Gustavo e Angela. Confira: # cat /etc/passwd | grep ­E '(angela|gustavo)' angela:x:1002:1002::/home/angela: gustavo:x:1003:1003::/home/gustavo: Pois bem! Iremos criar um manifesto para dizer que estes usuários não devem estar no sistema pois eles ganharam na loteria e foram morar no Caribe. Vejamos o manifesto: # cat logicus.pp user { 'gustavo': ensure
=>
'absent', Copyright Logicus 2016 64 home =>
shell
=>
} user { 'angela': ensure=>
home =>
shell =>
} '/home/gustavo', '/bin/bash', 'absent', '/home/angela', '/bin/bash', Vamos aplicar o manifesto: # puppet apply logicus.pp Notice: Compiled catalog for ubuntu.logicus.local in environment production in 0.03 seconds Notice: /Stage[main]/Main/User[gustavo]/ensure: removed Notice: /Stage[main]/Main/User[angela]/ensure: removed Notice: Applied catalog in 0.16 seconds Vamos alterar o manifesto agora com relação a presença do usuário e também seu shell. Vejamos: # cat logicus.pp user { 'gustavo': ensure=>
'present', home =>
'/home/gustavo', shell =>
'/bin/dash', } user { 'angela': Copyright Logicus 2016 65 ensure=>
home =>
shell =>
'present', '/home/angela', '/bin/dash', } Apliquemos o manifesto: # puppet apply logicus.pp Notice: Compiled catalog for ubuntu.logicus.local in environment production in 0.03 seconds Notice: /Stage[main]/Main/User[gustavo]/ensure: created Notice: /Stage[main]/Main/User[angela]/ensure: created Notice: Applied catalog in 0.09 seconds E vamos conferir as mudanças: # cat /etc/passwd | grep ­E '(angela|gustavo)' gustavo:x:1002:1002::/home/gustavo:/bin/dash angela:x:1003:1003::/home/angela:/bin/dash Interessante… Mas nós vimos que era possível ter arquivos e diretórios como recursos. Vamos criar arquivos! Vejamos o manifesto: # cat logicus.pp file { '/tmp/diretorio­teste': path => '/tmp/diretorio­teste', ensure => directory, } Copyright Logicus 2016 66 file { 'arquivo­teste': path => '/tmp/diretorio­teste/arquivo­teste', ensure => 'present', owner => angela, mode => '0640', content => "Eu sou um arquivo teste :)", require => File['/tmp/diretorio­teste'], } file { '/tmp/diretorio­teste/link­do­arquivo­teste': ensure => link, owner => gustavo, target => '/tmp/diretorio­teste/arquivo­teste', require => File['arquivo­teste'], } Vejamos uma tabela para entender o que aconteceu: diretório teste dissemos para o puppet que queríamos um diretório chamado “diretorio­teste” presente no diretório /tmp arquivo teste dissemos para o puppet que queriamos um arquivo chamado “arquivo­teste” no “diretorio­teste”, e inclusive indicamos que a criação do diretório teste presente no manifesto era requisito. Dissemos ainda que o usuário dono do arquivo deveria ser o usuário “angela”, que o conteúdo do arquivo deveria ser “Eu sou um arquivo teste :)” e que a permissão do arquivo deveria ser 640 Copyright Logicus 2016 67 link para o arquivo teste dissemos para o puppet que dentro do mesmo diretório teste deveria haver um link para o arquivo teste e que o dono do link deveria ser o usuário “gustavo” Entendido isto vamos aplicar o manifesto: # puppet apply logicus.pp Notice: Compiled catalog for ubuntu.logicus.local in environment production in 0.03 seconds Notice: /Stage[main]/Main/File[/tmp/diretorio­teste]/ensure: created Notice: /Stage[main]/Main/File[arquivo­teste]/ensure: defined content as '{md5}c7e3ada978865414be69897879bd57ea' Notice: /Stage[main]/Main/File[/tmp/diretorio­teste/link­do­arquivo­teste]/ensure: created Notice: Applied catalog in 0.05 seconds Confira: # ls ­l /tmp/diretorio­teste/ total 4 ­rw­r­­­­­ 1 angela root 26 Jun 4 21:17 arquivo­teste lrwxrwxrwx 1 gustavo root 34 Jun 4 21:19 link­do­arquivo­teste ­> /tmp/diretorio­teste/arquivo­teste Para apagar estes arquivos: # puppet resource file '/tmp/diretorio­teste' recurse=true purge=true Notice: /File[/tmp/diretorio­teste/arquivo­teste]/ensure: removed Notice: /File[/tmp/diretorio­teste/link­do­arquivo­teste]/ensure: removed Copyright Logicus 2016 68 file { '/tmp/diretorio­teste': ensure => 'directory', } Confira: # ls ­l /tmp/diretorio­teste/ total 0 Imaginemos agora que você precise de diversos pacotes relativos a rede, compressão e outros, e isto ocorrerá cada vez que você precisar configurar uma nova máquina de um laboratório de treinamento por exemplo, como já ocorreu conosco. Veja um exemplo abaixo: # cat logicus.pp package { 'tzdata': ensure => 'latest', } package { 'screen': ensure => 'present', } package { 'lynx': ensure => 'present', } package { 'elinks': ensure => 'present', } Copyright Logicus 2016 69 package { 'rsync': ensure => 'present', } package { 'telnet': ensure => 'present', } package { 'ftp': ensure => 'present', } package { 'wget': ensure => 'present', } package { 'bzip2': ensure => 'present', } package { 'unzip': ensure => 'present', } package { 'traceroute': ensure => 'present', } package { 'tcpdump': ensure => 'present', } Copyright Logicus 2016 70 package { 'iptraf': ensure => 'present', } package { 'htop': ensure => 'present', } package { 'dnsutils': ensure => 'present', } package { 'nmap': ensure => 'present', } package { 'vim': ensure => 'present', } Vamos aplicar o manifesto: # puppet apply logicus.pp Notice: Compiled catalog for ubuntu.logicus.local in environment production in 0.47 seconds Notice: /Stage[main]/Main/Package[lynx]/ensure: created Notice: /Stage[main]/Main/Package[elinks]/ensure: created Notice: /Stage[main]/Main/Package[traceroute]/ensure: created Notice: /Stage[main]/Main/Package[iptraf]/ensure: created Notice: /Stage[main]/Main/Package[htop]/ensure: created Copyright Logicus 2016 71 Notice: /Stage[main]/Main/Package[nmap]/ensure: created Notice: Applied catalog in 33.29 seconds Poucos pacotes já estavam presentes e não precisaram ser instalados, mas outros foram. Veja que o tempo total foi de 33 segundos. Ou seja, o ganho de velocidade na padronização de ambiente com o Puppet é enorme! Vale destacar que você pode usar variáveis no seguinte formato: $VARIAVEL = VALOR​
. Veja um exemplo: # cat logicus.pp $mensagem = "A Logicus tecnologia investe muito em documentação para que você aprenda mais" notify {"$mensagem": } # puppet apply logicus.pp Notice: Compiled catalog for ubuntu.logicus.local in environment production in 0.03 seconds Notice: A Logicus tecnologia investe muito em documentação para que você aprenda mais Notice: /Stage[main]/Main/Notify[A Logicus tecnologia investe muito em documentação para que você aprenda mais]/message: defined 'message' as 'A Logicus tecnologia investe muito em documentação para que você aprenda mais' Notice: Applied catalog in 0.03 seconds Você pode usar ainda variáveis do facter, comando visto anteriormente. Exemplo: # cat logicus.pp $frase = "Olá, eu sou um sistema da família ${::osfamily} e estou no ar há ${::uptime}" notify { 'info': message => $frase, } file { '/root/mensagem.txt': Copyright Logicus 2016 72 ensure => file, content => $frase, } Vamos aplicar: # puppet apply logicus.pp Notice: Compiled catalog for ubuntu.logicus.local in environment production in 0.03 seconds Notice: Olá, eu sou um sistema da família Debian e estou no ar há 5:00 hours Notice: /Stage[main]/Main/Notify[info]/message: defined 'message' as 'Olá, eu sou um sistema da família Debian e estou no ar há 5:00 hours' Notice: /Stage[main]/Main/File[/root/mensagem.txt]/ensure: defined content as '{md5}0786297b1549c91c1808600d6ec428f3' Notice: Applied catalog in 0.04 seconds Lembrando que existem diversas variáveis interessantes do facter para se usar como $fqdn, $ipaddress_eth0, $kernelversion, e outras. Muitas dessas opções são extremamente úteis. Você pode usar também condicionais como if, elsif e else no seguinte esquema lógico: if condição { bloco de código } elsif condição { bloco de código } else { bloco de código } Copyright Logicus 2016 73 Você pode usar também o case como recurso interessante para descobrir o sistema operacional por exemplo. Resultado: definição de pacotes, nome de arquivos, enfim, o que for específico de determinado sistema. Sua lógica trabalha da seguinte forma: case $variavel { valor1: { código } valor2: { código } default: { código } } Exemplo: case $operatingsystem { CentOS, Redhat: { $apache = “httpd” } Debian, Ubuntu: { $apache = “apache2”} Default: { fail (“Alerta: este sistema não foi reconhecido”) } Perceba a similaridade com a programação em Shell. Fica fácil para administradores de sistemas Linux. Vejamos um manifesto que ilustra uma situação relativa: # cat logicus.pp case $::operatingsystem { 'CentOS': { $apache_pkg = 'httpd' } 'Redhat': { $apache_pkg = 'httpd' } 'Debian': { $apache_pkg = 'apache2' } 'Ubuntu': { $apache_pkg = 'apache2' } Copyright Logicus 2016 74 default: { fail fail("sistema operacional não reconhecido para o servidor web") } } file {'/root/case.txt': ensure => present, content => "O nome do pacote do apache é: ${apache_pkg}\n" } Rode este manifesto no Debian e no CentOS e perceba que ​
o conteúdo do arquivo que ele irá gerar​
, no caso o ​
case.txt​
, será diferente nos dois casos. Você pode usar ainda múltiplos valores. Por exemplo: case $operatingsystem { /Debian|Ubuntu/: { código } } Vejamos agora um exemplo de manifesto relativo ao cron: # cat logicus.pp cron { 'cron­updatedb': ensure => 'present', user => root, command => '/usr/bin/updatedb', minute => 00, hour => 12, } cron { 'update': ensure => 'present', Copyright Logicus 2016 75 user => root, command => '/usr/bin/aptitude update', minute => 05, hour => 12, } cron { 'upgrade': ensure => 'present', user => root, command => '/usr/bin/aptitude upgrade ­y', minute => 10, hour => 12, } cron { 'backup': ensure => 'present', user => root, command => '/bin/tar ­zcf /var/backups/home.tgz /home/', minute => 15, hour => 12, } Vamos usar novamente o recurso de tabela para explicar o que aconteceu: cron­updatedb dissemos para o cron que diariamente às 12:00 queremos que ele rode o comando updatedb update dissemos para o cron que diariamente às 12:05 ele rode o comando aptitude update Copyright Logicus 2016 76 upgrade dissemos para o cron que diariamente às 12:10 ele rode o comando aptitude upgrade ­y backup dissemos para o cron que diariamente às 12:15 ele faça um backup com o comando tar do diretório /home e guarde no diretório /var/backup Aplicando o manifesto: # puppet apply logicus.pp Notice: Compiled catalog for ubuntu.logicus.local in environment production in 0.15 seconds Notice: /Stage[main]/Main/Cron[cron­updatedb]/ensure: created Notice: /Stage[main]/Main/Cron[update]/ensure: created Notice: /Stage[main]/Main/Cron[upgrade]/ensure: created Notice: /Stage[main]/Main/Cron[backup]/ensure: created Notice: Applied catalog in 0.10 seconds Vamos verificar no Cron: # crontab ­l # HEADER: This file was autogenerated at 2016­06­05 12:14:29 ­0300 by puppet. # HEADER: While it can still be managed manually, it is definitely not recommended. # HEADER: Note particularly that the comments starting with 'Puppet Name' should # HEADER: not be deleted, as doing so could cause duplicate cron jobs. # Puppet Name: cron­updatedb 0 12 * * * /usr/bin/updatedb # Puppet Name: update Copyright Logicus 2016 77 5 12 * * * /usr/bin/aptitude update # Puppet Name: upgrade 10 12 * * * /usr/bin/aptitude upgrade ­y # Puppet Name: backup 15 12 * * * /bin/tar ­zcf /var/backups/home.tgz /home/ Com relação aos manifestos ainda é bom saber que é possível trabalhar com classes. Elas permitem reaproveitamento de código. Podemos chamar ainda de coleções de recursos. ​
Não são aplicadas a não ser que sejam requisitadas​
. A classe deve ter um nome escrito em minúsculo e também um bloco de código. Exemplo: class nome { bloco de código } E para chamá­la deve estar no manifesto: class {‘nome’: } Você pode também chamar uma classe dentro de outra. Exemplo: class logicus { class treinamentos { bloco de código } } Copyright Logicus 2016 78 Para declarar esta classe citada faça como no exemplo: class {‘logicus::treinamentos’: } Na sequência vamos falar de módulos e você encontrará diversas classes nos módulos pois a sua dinâmica exige. Podemos resumir os módulos como conjuntos de códigos. Você pode escrever eles ou baixar módulos pré­construídos do repositório da Puppet Labs. A estrutura de um módulo basicamente se resume da seguinte forma: manifests neste diretório encontramos os manifests, inclusive o init.pp que é obrigatório files neste diretório encontramos os arquivos que são referenciados pelo módulo templates neste diretório encontramos os templates usados pelo módulo lib neste diretório encontramos plugins spec neste diretório encontramos testes de especificação para os plugins presentes em lib tests neste diretório encontramos um ambiente de teste Mas como escolher um módulo? Procure saber se o módulo já foi recomendado por alguém, principalmente através da lista de discussão ou pelo irc. Procure saber se o módulo está de acordo com o sistema e versão que você está utilizando. Pense também no versionamento do módulo e Copyright Logicus 2016 79 evite usar módulos que não estejam na versão 1.0.0., embora muitas vezes não seja possível. Mas como usar os módulos? Existe um comando chamado “​
puppet module​
”. Comecemos pelo seu help: # puppet help module USAGE: puppet module <action> [­­environment production ] [­­modulepath ] This subcommand can find, install, and manage modules from the Puppet Forge, a repository of user­contributed Puppet code. It can also generate empty modules, and prepare locally developed modules for release on the Forge. OPTIONS: ­­render­as FORMAT ­ The rendering format to use. ­­verbose ­ Whether to log verbosely. ­­debug ­ Whether to log debug information. ­­environment production ­ The environment Puppet is running in. For clients (e.g., `puppet agent`) this determines the environment itself, which is used to find modules and much more. For servers (i.e., `puppet master`) this provides the default environment for nodes we know nothing about. ­­modulepath ­ The search path for modules, as a list of directories separated by the system path separator character. (The POSIX path separator is ':', and the Windows path separator is ';'.) Setting a global value for `modulepath` in puppet.conf is not allowed (but it can be overridden from the commandline). Please use directory environments instead. If you need to use Copyright Logicus 2016 80 something other than the default modulepath of `<ACTIVE ENVIRONMENT'S MODULES DIR>:$basemodulepath`, you can set `modulepath` in environment.conf. For more info, see <https://docs.puppet.com/puppet/latest/reference/environments.html> ACTIONS: build Build a module release package. changes Show modified files of an installed module. generate Generate boilerplate for a new module. install Install a module from the Puppet Forge or a release archive. list List installed modules search Search the Puppet Forge for a module. uninstall Uninstall a puppet module. upgrade Upgrade a puppet module. See 'puppet man module' or 'man puppet­module' for full help. Para listar os seus módulos digite “​
puppet module list​
”. Exemplo: # puppet module list /etc/puppet/modules ├── fsalum­dashboard (v0.0.5) ├── puppetlabs­apache (v0.10.0) ├── puppetlabs­concat (v1.0.0) ├── puppetlabs­mysql (v2.1.0) ├── puppetlabs­passenger (v0.2.0) ├── puppetlabs­ruby (v0.1.0) └── puppetlabs­stdlib (v4.1.0) Copyright Logicus 2016 81 E caso você não possua módulos: # puppet module list /etc/puppet/modules (no modules installed) Para pesquisar digite: “​
puppet module search nome​
”. Veja um exemplo: # puppet module search docker Notice: Searching https://forgeapi.puppetlabs.com ... NAME DESCRIPTION AUTHOR KEYWORDS garethr­docker Module for installing and managing docker @garethr lxc redhat centos docker tsuru­docker Puppet module to Docker @tsuru tsuru­docker tsuru paas jgreat­docker Manage docker containers natively with a 'docker' Servi... @jgreat ChrisTheShark­docker Puppet module to install Docker on Centos or Ubuntu Lin... @ChrisTheShark ffollonier­docker A puppet module that manage the docker­engine daemon co... @ffollonier docker jmangt­docker Installs Docker @jmangt cristifalcas­docker Module for installing and managing docker @cristifalcas docker RHsyseng­docker set up docker on a host @RHsyseng nopp­docker Simple docker module @nopp akegata­docker Handle docker containers as services in RHEL. @akegata garystafford­docker_machine Downloads and installs Docker Machine @garystafford docker­machine machine docker garystafford­docker_compose Downloads and installs Docker Compose @garystafford docker­compose compose docker scottyc­docker_swarm A module for Docker Swarm @scottyc swarm docker narasimhasv­docker Install docker @narasimhasv Copyright Logicus 2016 82 ajsmith­docker_systemd Configure systemd services to run Docker containers. @ajsmith systemd docker cristifalcas­docker_registry installs and configures docker registry @cristifalcas docker­registry puppetlabs­docker_platform Installs, configures, and manages the Docker daemon and... @puppetlabs puppetlabs­docker_ucp Installs, configures, and manages the Docker Universal ... @puppetlabs praekeltfoundation­docker_firewall Simplifies management of iptables rules when running Do... @praekeltfoundation markb­docker_registry UNKNOWN @markb garystafford­fig Downloads and installs Fig (http://www.fig.sh) @garystafford container docker fig cristifalcas­flannel flannel is a virtual network that gives a subnet to eac... @cristifalcas docker flannel cjtoolseram­drone Drone CI module @cjtoolseram continuous docker ci drone nick­rancher Deploy Rancher, a container orchestration tool @nick containers docker rancher pennycoders­marathon Mesosphere Marathon installation / management module @pennycoders cloud docker apache mesos pennycoders­mesos Apache mesos installation / management module @pennycoders cloud docker apache mesos tayzlor­weave Module for installing and configuring Weave for Docker @tayzlor weave docker prozeta­portauthority Puppet module to bootstrap Port Authority @prozeta etcd paas docker meltwater­marathon Puppet Module for Mesos Marathon @meltwater docker marathon mesos stfalcon­sphinxsearchdocker A module for running sphinx in docker containers @stfalcon sphinx docker cristifalcas­kubernetes Configuring and installing kubernetes @cristifalcas kubectl kubelet docker tsuru­tsuru Puppet module to Tsuru PaaS @tsuru docker paas cethy­gaudi Module for installing gaudi from repository on gaudi.io... @cethy gaudi docker ajsmith­grafana Grafana instance configuration using Docker. @ajsmith systemd docker grafana ajsmith­graphite Graphite server configuration using Docker. @ajsmith systemd docker graphite Copyright Logicus 2016 83 ajsmith­riemann Riemann server configuration. @ajsmith systemd docker riemann momer­maestrong Module to set up a bare metal box for Docker & Maestro­ng @momer docker maestro É fundamental que conheça os módulos criados pela própria Puppet Labs. Veja: # puppet module search puppetlabs Notice: Searching https://forgeapi.puppetlabs.com ... NAME DESCRIPTION AUTHOR KEYWORDS stahnma­puppetlabs_yum Setup the Puppet Labs Yum package repo @stahnma centos rhel puppetlabs yum ploperations­puppetlabs_apt Installs the Puppet Labs community apt repository @ploperations puppetlabs apt mmitchell­puppetlabs_ntp UNKNOWN @mmitchell mmitchell­puppetlabs_ironic Puppet module for OpenStack Ironic @mmitchell puppetlabs­stdlib Standard library of resources for Puppet modules. @puppetlabs puppetlabs stdlib stages puppetlabs­cloud_provisioner Puppet Cloud Provisioner @puppetlabs puppetlabs cloud ec2 aws puppetlabs­java Installs the correct Java package on various platforms. @puppetlabs java puppetlabs stdlib jdk jre puppetlabs­powershell Adds a new exec provider for executing PowerShell commands. @puppetlabs exec powershell windows puppetlabs­acl This module provides the ability to manage ACLs on nodes @puppetlabs microsoft ace acl puppetlabs­wsus_client Manage WSUS (Windows Server Update Service) settings for cl... @puppetlabs puppetlabs­dsc PowerShell Desired State Configuration (DSC) @puppetlabs dsc powershell puppetlabs­windows Collection of Puppet modules for managing Microsoft Windows. @puppetlabs puppetlabs­docker_platform Installs, configures, and manages the Docker daemon and Doc... @puppetlabs puppetlabs­logentries A module to install the logentries agent. @puppetlabs logentries logging Copyright Logicus 2016 84 puppetlabs­hocon Resource types for managing settings in HOCON files @puppetlabs puppetlabs­azure Create and manage machines running on Microsoft Azure with ... @puppetlabs azure linux windows cloud puppetlabs­policy_engine A module for managing policy tests as structured facts @puppetlabs compliance security policy puppetlabs­catalog_preview Module providing catalog preview and migration features @puppetlabs delta diff catalog preview puppetlabs­mount_iso Mount ISO images and ensure the drive letter they are mount... @puppetlabs powershell iso image mount puppetlabs­package_updates A module for monitoring for package updates @puppetlabs packages updates patch puppetlabs­docker_ucp Installs, configures, and manages the Docker Universal Cont... @puppetlabs puppetlabs­ibm_installation_manager Manages IBM Installation Manager and IBM packages @puppetlabs iim imcl was websphere ibm puppetlabs­apk Manage packages on Alpine Linux using the APK package manager @puppetlabs puppetlabs­chocolatey Chocolatey package provider for Puppet @puppetlabs package dot­net net microsoft puppetlabs­ntp Installs, configures, and manages the NTP service. @puppetlabs ntp time aix rhel centos ntpd puppetlabs­registry This module provides a native type and provider to manage k... @puppetlabs windows type registry win32 puppetlabs­inifile Resource types for managing settings in INI files @puppetlabs inifile ini settings file puppetlabs­rancher Installs Rancher Server and Agents @puppetlabs puppetlabs­java_ks Manage arbitrary Java keystore files @puppetlabs java ssl keystore certs puppetlabs­tagmail This module provides a report processor that sends events t... @puppetlabs puppetlabs­netscaler Enables Puppet configuration of Citrix NetScaler devices th... @puppetlabs loadbalancer network netscaler puppetlabs­lvm Provides Puppet types and providers to manage Logical Resou... @puppetlabs lvm hdd volume storage puppetlabs­xinetd Configures xinetd and exposes the xinetd::service definitio... @puppetlabs xinetd centos Copyright Logicus 2016 85 rhel debian puppetlabs­rkt Installs, configures, and manages the rkt container runtime. @puppetlabs puppetlabs­apt Provides an interface for managing Apt source, key, and def... @puppetlabs apt debian ubuntu dpkg ppa puppetlabs­concat Construct files from multiple fragments. @puppetlabs concat files fragments puppetlabs­reboot Adds a type and provider for managing system reboots. @puppetlabs windows reboot puppetlabs­ruby Manages Ruby and Rubygems. @puppetlabs ruby puppetlabs­postgresql Offers support for basic management of PostgreSQL databases. @puppetlabs rhel ubuntu debian pgsql puppetlabs­vcsrepo Puppet module providing a type to manage repositories from ... @puppetlabs cvs vcs repo svn git hg bzr puppetlabs­haproxy Configures HAProxy servers and manages the configuration of... @puppetlabs proxy haproxy lb load­balancer puppetlabs­strings Puppet documentation via YARD @puppetlabs docs dev puppet yardoc yard puppetlabs­netdev_stdlib Type definitions for Networking Device (NetDev) Standard Li... @puppetlabs puppetlabs­netapp Manages resources on NetApp Cluster Data ONTAP devices. @puppetlabs puppetlabs­ciscopuppet Cisco Puppet providers and types for NX­OS devices @puppetlabs network nx­os nxos cisco puppetlabs­pe_gem Adds provider for the Puppet Enterprise Ruby gem manager. @puppetlabs pe gem puppetlabs­corosync This module is a set of manifests and types/providers for q... @puppetlabs debian ha heartbeat pacemaker puppetlabs­pe_puppetserver_gem Puppet Labs PE Puppetserver Gem Module @puppetlabs puppetlabs­mysql Installs, configures, and manages the MySQL service. @puppetlabs mysql centos rhel ubuntu puppetlabs­accounts Account management module. @puppetlabs puppetlabs­firewall Manages Firewalls such as iptables @puppetlabs redhat centos debian ubuntu puppetlabs­git Module for installing Git or Gitosis. @puppetlabs puppetlabs­tftp Installs and manages TFTP service and configuration. @puppetlabs debian ubuntu tftp centos rhel Copyright Logicus 2016 86 puppetlabs­passenger Configures and manages Passenger. @puppetlabs apache passenger rails rack puppetlabs­gce_compute Native types for managing Google Cloud Platform infrastruct... @puppetlabs device compute google gce puppetlabs­rabbitmq Installs, configures, and manages RabbitMQ. @puppetlabs amqp stomp queue centos rhel puppetlabs­puppetdb Installs PostgreSQL and PuppetDB, sets up the connection to... @puppetlabs puppet puppetdb storeconfig puppetlabs­motd A simple module to demonstrate managing /etc/motd or Window... @puppetlabs testing puppetlabs­lib_puppet Puppet Labs lib_puppet module @puppetlabs puppet puppetlabs­appdirector Puppet AppDirector @puppetlabs vmware puppetlabs­kwalify A set of kwalify related functions for puppet. @puppetlabs validation kwalify puppetlabs­apache Installs, configures, and manages Apache virtual hosts, web... @puppetlabs web httpd rhel ssl wsgi proxy puppetlabs­mssql Puppet Labs Microsoft SQL Server Module @puppetlabs database windows mssql sql2008 puppetlabs­mongodb Installs MongoDB on RHEL/Ubuntu/Debian. @puppetlabs nosql cluster mongo mongodb puppetlabs­denyhosts Configure DenyHosts @puppetlabs security denyhosts puppetlabs­node_openstack Cloud Provisioner support for OpenStack @puppetlabs openstack nova vm puppetlabs­vcli_rsyslog Puppet Enterprise module for saz/rsyslog @puppetlabs vcli rsyslog puppetlabs­limits Defined resource type for managing /etc/security/limits @puppetlabs puppetlabs­aws This module provides the ability to manage AWS resources @puppetlabs puppetlabs­transition Transition state resource type @puppetlabs transition catalog puppetlabs­cloudformation Module to deploy Cloudformation Face @puppetlabs puppet ec2 amazon pe cfn puppetlabs­awsdemo_profiles Puppet module to manage "profiles" and higher­level abstrac... @puppetlabs aws demo puppetlabs­tomcat Installs, deploys, and configures Apache Tomcat web services. @puppetlabs tomcat Copyright Logicus 2016 87 puppetlabs­dhcp Manage the ISC dhcp daemon @puppetlabs dhcp puppetlabs­sqlite Manage a sqlite installation and databases @puppetlabs database sqlite puppetlabs­puppet_authorization Module to manage auth.conf. @puppetlabs puppetlabs­pe_upgrade Automated upgrades of PE @puppetlabs enterprise upgrade puppet puppetlabs­dism Provides a DISM puppet resource type on Windows. @puppetlabs windows dism puppetlabs­vcenter vcenter puppet module @puppetlabs windows vmware vcenter vsphere puppetlabs­rsync Manages rsync clients, repositories, and servers, & providi... @puppetlabs rsync puppetlabs­mount_providers Provides the mounttab and mountpoint resource types. @puppetlabs solaris linux mount mounttab puppetlabs­openstack Install, configure, and manage a full installation of OpenS... @puppetlabs icehouse cloud openstack puppetlabs­puppet_agent Upgrades Puppet 3.8 and All­In­One Puppet Agents @puppetlabs puppetlabs­boundary Boundary meter module @puppetlabs network boundary bprobe probe puppetlabs­splunk Manage and deploy Splunk servers and forwarders @puppetlabs splunk puppetlabs­mrepo Configures and manages mrepo mirrors @puppetlabs rpm yum mrepo mirror puppetlabs­azure_agent The Azure module installs and configures the Windows Azure ... @puppetlabs puppetlabs­nodejs Install Node.js package and npm package provider. @puppetlabs debian nodejs ubuntu npm puppetlabs­activemq Installs and configures ActiveMQ. @puppetlabs java amqp stomp stdlib puppetlabs­stunnel A module for creating secure tunnels @puppetlabs debian ssl security tunnel tls puppetlabs­opennebula OpenNebula Module @puppetlabs cloud opennebula puppetlabs­puppetserver_gem Puppet Labs Puppetserver Gem Module @puppetlabs puppetlabs­gcc Module for installing gcc build utils @puppetlabs gcc compiler puppetlabs­mcollective Installs, configures, and manages MCollective agents, clien... @puppetlabs client amqp stomp server puppetlabs­dashboard Puppet module for the Puppet Dashboard @puppetlabs puppet dashboard Copyright Logicus 2016 88 console face puppetlabs­node_gce Puppet Google Compute Module @puppetlabs node­gce cloud google puppetlabs­bacula This module manages a bacula infrastructure @puppetlabs backup bacula puppetlabs­drbd DRBD module @puppetlabs ha drbd failover puppetlabs­win_desktop_shortcut Manages a shortcut on a Windows desktop for all users @puppetlabs windows desktop shortcut puppetlabs­razor Razor puppet module @puppetlabs razor ubuntu puppetlabs­nginx Puppet NGINX management module @puppetlabs http web proxy nginx https puppetlabs­puppet_hipchat Deply and manage the Puppet HipChat addon application @puppetlabs chatops hipchat pltraining­kickstand Module to assist in the provisioning lab for the Advanced P... @pltraining puppetlabs training advanced pltraining­userprefs Simple user userprefs management @pltraining puppetlabs training Para instalar um módulo e suas dependências digite: “​
puppet module install nome​
”. Exemplo: # puppet module install puppetlabs­firewall Notice: Preparing to install into /etc/puppet/modules ... Notice: Downloading from https://forgeapi.puppetlabs.com ... Notice: Installing ­­ do not interrupt ... /etc/puppet/modules └── puppetlabs­firewall (v1.8.0) Um comentário de passagem sobre a instalações de módulos é o seguinte: para ignorar as dependências use ​
­­ignore­dependencies​
. Exemplo: puppet module install asterisk ­­ignore­dependencies​
. Para definir uma versão: ​
­­version​
. Exemplo: ​
puppet module install asterisk ­­version​
. Vamos instalar o modulo da Puppetlabs para “​
motd​
”. Faça: Copyright Logicus 2016 89 # puppet module install puppetlabs­motd Notice: Preparing to install into /etc/puppetlabs/code/environments/production/modules ... Notice: Downloading from https://forgeapi.puppetlabs.com ... Notice: Installing ­­ do not interrupt ... /etc/puppetlabs/code/environments/production/modules └─┬ puppetlabs­motd (v1.4.0) └─┬ puppetlabs­registry (v1.1.3) └── puppetlabs­stdlib (v4.12.0) Vamos aplicar o módulo: # puppet apply ­e "include motd" Notice: Compiled catalog for centos.logicus.local in environment production in 0.36 seconds Notice: /Stage[main]/Motd/File[/etc/motd]/content: content changed '{md5}d41d8cd98f00b204e9800998ecf8427e' to '{md5}e44d7cea8fa84d927015444592b74830' Notice: Applied catalog in 0.03 seconds Agora faça um acesso via ssh de outra máquina para testar o novo motd: ~$ ssh [email protected] The authenticity of host '192.168.0.106 (192.168.0.106)' can't be established. ECDSA key fingerprint is e3:37:9c:bd:4a:2e:31:cb:f8:ae:d6:fe:40:f7:a2:b1. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.0.106' (ECDSA) to the list of known hosts. [email protected]'s password: Last login: Mon Jun 6 11:19:36 2016 from centos.logicus.local Copyright Logicus 2016 90 The operating system is CentOS The free memory is 768.45 MiB The domain is logicus.local Ou seja, as três últimas linhas que indicam o sistema operacional, a memória e o domínio foram adicionadas ao arquivo motd pelo módulo instalado. Para desinstalar digite: ​
puppet module uninstall nome​
. Exemplo: # puppet module uninstall proxy Notice: Preparing to uninstall 'proxy' ... Removed 'proxy' from /opt/puppetlabs/puppet/modules Mas você não tem o módulo proxy certo? Mas tem o Firewall. Desinstale como prática o módulo de Firewall e tente pensar no porquê nada aconteceu quando você instalou ele. Essa pegadinha é para pensar! Mas e se você quiser criar um módulo? Primeiro garanta que esteja no diretório relativo aos módulos: # pwd /opt/puppetlabs/puppet/modules Use a opção “​
generate​
” e responda as perguntas que serão feitas em relação ao módulo a ser criado: # puppet module generate logicus­utils We need to create a metadata.json file for this module. Please answer the following questions; if the question is not applicable to this module, feel free to leave it blank. Copyright Logicus 2016 91 Puppet uses Semantic Versioning (semver.org) to version modules. What version is this module? [0.1.0] ­­> 0.1.0 Who wrote this module? [logicus] ­­> logicus What license does this module code fall under? [Apache­2.0] ­­> apache­2.0 How would you describe this module in a single sentence? ­­> otimização da logicus Where is this module's source code repository? ­­> Where can others go to learn more about this module? ­­> logicus.com.br Where can others go to file issues about this module? ­­> ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ { "name": "logicus­utils", "version": "0.1.0", "author": "logicus", "summary": "otimização da logicus", "license": "apache­2.0", "source": "", "project_page": "logicus.com.br", "issues_url": null, Copyright Logicus 2016 92 "dependencies": [ {"name":"puppetlabs­stdlib","version_requirement":">= 1.0.0"} ], "data_provider": null } ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ About to generate this metadata; continue? [n/Y] ­­> y Notice: Generating module at /opt/puppetlabs/puppet/modules/utils... Notice: Populating templates... Finished; module generated in utils. utils/Gemfile utils/Rakefile utils/examples utils/examples/init.pp utils/manifests utils/manifests/init.pp utils/spec utils/spec/classes utils/spec/classes/init_spec.rb utils/spec/spec_helper.rb utils/README.md utils/metadata.json Agora é só modificar a estrutura de acordo com a sua demanda. Para criar um tarball do módulo: # puppet module build utils/ Notice: Building /opt/puppetlabs/puppet/modules/utils for release Copyright Logicus 2016 93 Module built: /opt/puppetlabs/puppet/modules/utils/pkg/logicus­utils­0.1.0.tar.gz Mas vale dizer que se o seu desejo é criar módulos ou editar módulos existentes você pode usar um editor chamado ​
Geppetto​
. Trata­se de uma IDE ­ ambiente de desenvolvimento integrado, construída sob o Eclipse. É uma ferramenta para desenvolvimento de módulos e manifestos. Nele você tem realce de sintaxe, depuração e ainda pode fazer: Criar novos projetos criar projetos de manifestos ou módulos do zero ou baseados em projetos existentes no Git ou SVN Gerenciar controle de versão criar novos projetos no Git ou SVN ou até mesmo importar projetos existentes e depois atualizá­los Importar e exportar no Forge trabalhar com projetos existentes ou novos e enviá­los diretamente para o Forge Para instalar acesse o link: ​
https://puppetlabs.github.io/geppetto/download.html​
e faça download de acordo com a máquina de onde irá realizar o desenvolvimento. Exemplo: Copyright Logicus 2016 94 Copyright Logicus 2016 95 Após o download descompacte o arquivo: $ unzip geppetto­linux.gtk.x86_64­4.3.1­R201501182354.zip Acesse a pasta descompactada. Perceba que há diversos arquivos nesta: $ ls ­l total 216 ­rw­r­­r­­ 1 gustavo gustavo 65151 Jan 19 2015 artifacts.xml drwxr­xr­x 4 gustavo gustavo 4096 Jan 19 2015 configuration ­rw­r­­r­­ 1 gustavo gustavo 15551 Jan 18 2015 epl­v10.html drwxr­xr­x 28 gustavo gustavo 4096 Jan 19 2015 features ­rwxr­xr­x 1 gustavo gustavo 74675 Jan 19 2015 geppetto ­rw­r­­r­­ 1 gustavo gustavo 244 Jan 19 2015 geppetto.ini ­rwxr­xr­x 1 gustavo gustavo 10616 Jan 19 2015 icon.xpm ­rw­r­­r­­ 1 gustavo gustavo 2056 Jan 18 2015 notice.html drwxr­xr­x 4 gustavo gustavo 4096 Jan 19 2015 p2 drwxr­xr­x 4 gustavo gustavo 28672 Jan 19 2015 plugins Execute o arquivo geppetto na pasta descompactada! Copyright Logicus 2016 96 Copyright Logicus 2016 97 Vamos abrir um módulo existente para edição. Clique em “File” e depois em “Import”. Selecione a opção “Puppet” e em seguida “From Forge Repository”, como indicado abaixo: Copyright Logicus 2016 98 Insira na seção “Keyword search” uma palavra chave para busca do módulo. Vamos usar a palavra “Firewall”: Copyright Logicus 2016 99 Irão aparecer todos os módulos relativos a palavra chave que foi buscada. Selecione a opção “puppetlabs­firewall 1.1.3” como na figura abaixo: Copyright Logicus 2016 100 Uma vez selecionada a opção uma nova caixa será aberta para confirmação: Copyright Logicus 2016 101 Clique em “Finish” e o módulo será aberto para edição: Copyright Logicus 2016 102 Ok! Agora você deve estar pensando que escrita de módulo já é algo muito avançado, e realmente é, você precisa se aprofundar um pouco mais antes. Por isto vamos lhe dar outra dica quente que é a seguinte: a Puppet Labs disponibiliza uma máquina virtual com o Puppet instalado e configurado para que você possa aprender. Iniciar o aprendizado por ela inclusive é o melhor caminho! Trata­se de uma VM com CentOs disponível para download. O link para download é: ​
http://info.puppetlabs.com/download­learning­puppet­VM.html.​
Após realizar o download descompacte o arquivo baixado: Copyright Logicus 2016 103 $ unzip learning_puppet_vm.zip Archive: learning_puppet_vm.zip creating: learning_puppet_vm / inflating: learning_puppet_vm /.DS_Store creating: __MACOSX/ creating: __MACOSX/learning_puppet_vm / inflating: __MACOSX/learning_puppet_vm /._.DS_Store inflating: learning_puppet_vm /puppet­2016.1.2­learning­5.1.ova inflating: __MACOSX/learning_puppet_vm /._puppet­2016.1.2­learning­5.1.ova inflating: learning_puppet_vm /readme.rtf inflating: __MACOSX/._learning_puppet_vm Não crie uma nova VM. Importe a que fez download! Exemplo: Copyright Logicus 2016 104 Antes de acessar a rede pela primeira vez certifique­se de que configurou a rede da máquina virtual no modo bridged. Vejamos: Copyright Logicus 2016 105 Copyright Logicus 2016 106 Perceba que nos foi indicado ip, username e senha. Faça o seu login via ssh e verifique a versão do Puppet: root@learning:~ # puppet ­V 4.4.2 Se você acessar via navegador através de HTTP o endereço da vm terá acesso a um roteiro de aprendizagem cuidadosamente elaborado pela Puppet Labs, é fenomenal! Vejamos: Copyright Logicus 2016 107 Se você acessar o painel via HTTPS terá acesso ao painel do Puppet: Copyright Logicus 2016 108 Para acessar use o login “admin” e a senha “puppetlabs”. Você verá uma tela como abaixo: Copyright Logicus 2016 109 Copyright Logicus 2016 110 Durante os seus estudos voce pode se utilizar o “quest”, que lhe auxilia no acompanhamento do aprendizado em Puppet: # quest ­­help NAME quest ­ Track the status of quests and tasks. SYNOPSIS quest [global options] command [command options] [arguments...] GLOBAL OPTIONS ­­help ­ Show this message COMMANDS begin ­ Begin a quest help ­ Shows a list of commands or help for one command list ­ List available quests status ­ Show status of the current quest Ou seja, na medida em que você for trabalhando com as quests indicadas nas páginas que você acessou via HTTP para aprender Puppet com o roteiro criado pela Puppet Labs você poderá ir controlando o que já resolveu. Por exemplo: # quest status Quest: welcome √ Task 1: Use puppet ­V to check the puppet version √ Task 2: View the options for the quest tool X Task 3: Check the quest status Copyright Logicus 2016 111 Essa é uma forma muito interessante embora o foco desta VM seja a versão Enterprise do Puppet. No entanto muita coisa que você irá ver com esta VM pode ser usada na versão para comunidade que vimos neste artigo. De qualquer forma o fato é que se você chegou até aqui já tem a sua própria infra levantada conforme o roteiro que lhe indicamos. O que veremos agora é como instalar o Puppet Server para que este “comande” o que deve haver nas demais máquinas da infra, ou seja, o cara que irá dizer o que os outros servidores deverão ter, então deixe a VM de aprendizagem do Puppet um pouco de lado (mas não deixa de estudá­la quando terminar este artigo) e retorne para a infra que montamos juntos para vermos sobre o Puppet Server. O Puppet Server roda sobre JVM. Basicamente podemos dizer que o Puppet Server veio substituir o antigo Puppet Master. Vamos mostrar as duas formas de instalação, mas vamos começar pelo Puppet Server que provavelmente é o que você irá querer usar. No caso do Puppet Server no entanto é importante que você tenha uma máquina com pelo menos uns 4 Gigas de Ram para evitar problemas que possam ocorrer na inicialização do serviço. Vamos aproveitar a máquina do CentOS 7 presente em nossa infra. Confira seu /etc/hosts: # cat /etc/hosts 127.0.0.1 localhost localhost.localdomain 192.168.0.107 centos.logicus.local centos puppet Para instalar o Puppet Server: # yum install puppetserver Aumente o timeout do systemd: # echo "START_TIMEOUT=300" >> /etc/sysconfig/puppetserver Copyright Logicus 2016 112 Antes de iniciar o serviço gere o certificado: # puppet cert generate centos.logicus.local ­­dns_alt_names=puppet Inicie o serviço: # systemctl start puppetserver Confira: # systemctl status puppetserver ● puppetserver.service ­ puppetserver Service Loaded: loaded (/usr/lib/systemd/system/puppetserver.service; disabled; vendor preset: disabled) Active: active (running) since Seg 2016­06­06 21:29:08 BRT; 6min ago Process: 2860 ExecStartPost=/bin/bash ${INSTALL_DIR}/ezbake­functions.sh wait_for_app (code=exited, status=0/SUCCESS) Process: 2856 ExecStartPre=/usr/bin/install ­­directory ­­owner=puppet ­­group=puppet ­­mode=775 /var/run/puppetlabs/puppetserver (code=exited, status=0/SUCCESS) Main PID: 2859 (java) CGroup: /system.slice/puppetserver.service └─2859 /usr/bin/java ­Xms2g ­Xmx2g ­XX:MaxPermSize=256m ­XX:OnOutOfMemoryError=kill ­9 %p ­Djava.security.egd=/dev/urandom ­cp /opt/... Jun 06 21:28:29 centos.logicus.local systemd[1]: Starting puppetserver Service... Jun 06 21:28:29 centos.logicus.local java[2859]: OpenJDK 64­Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0 Jun 06 21:28:37 centos.logicus.local java[2859]: Warning: The following options to parse­opts are unrecognized: :flag Jun 06 21:29:08 centos.logicus.local systemd[1]: Started puppetserver Service. Copyright Logicus 2016 113 Jun 06 21:36:03 centos.logicus.local systemd[1]: Started puppetserver Service. Garanta que o arquivo de configuração do puppet, o ​
puppet.conf​
, esteja com o agent devidamente indicado para evitar problema com o certificado: # cat /etc/puppetlabs/puppet/puppet.conf | grep ­vE '^#' [master] vardir = /opt/puppetlabs/server/data/puppetserver logdir = /var/log/puppetlabs/puppetserver rundir = /var/run/puppetlabs/puppetserver pidfile = /var/run/puppetlabs/puppetserver/puppetserver.pid codedir = /etc/puppetlabs/code [agent] certname = centos.logicus.local Vamos elaborar uma configuração de teste: # cat /etc/puppetlabs/code/environments/production/manifests/site.pp node "centos.logicus.local" { package { 'lynx': ensure => present, } } Empurre a configuração: Copyright Logicus 2016 114 # puppet agent ­t Info: Using configured environment 'production' Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for centos.logicus.local Info: Applying configuration version '1465261549' Notice: /Stage[main]/Main/Node[centos.logicus.local]/Package[lynx]/ensure: created Info: Creating state file /opt/puppetlabs/puppet/cache/state/state.yaml Notice: Applied catalog in 8.50 seconds Agora verifique que em seu CentOS que está atuando como cliente e servidor ao mesmo tempo já está instalado o Lynx. Ou seja, empurramos a configuração usando a mesma máquina como puppet­agent e puppetserver ao mesmo tempo. Se ao invés do CentOS você preferir o Ubuntu 16.04 como servidor de configurações faça no Ubuntu: # apt­get install puppetserver Para iniciar o serviço: # service puppetserver start Confira: # service puppetserver status ● puppetserver.service ­ puppetserver Service Copyright Logicus 2016 115 Loaded: loaded (/lib/systemd/system/puppetserver.service; disabled; vendor preset: enabled) Active: active (running) since Seg 2016­06­06 14:36:00 BRT; 9s ago Process: 21260 ExecStartPost=/bin/bash ${INSTALL_DIR}/ezbake­functions.sh wait_for_app (code=exited, status=0/SUCCESS) Process: 21254 ExecStartPre=/usr/bin/install ­­directory ­­owner=puppet ­­group=puppet ­­mode=775 /var/run/puppetlabs/puppetserver (code=exited, Main PID: 21259 (java) Tasks: 26 Memory: 1.0G CPU: 57.389s CGroup: /system.slice/puppetserver.service └─21259 /usr/bin/java ­Xms2g ­Xmx2g ­XX:MaxPermSize=256m ­XX:OnOutOfMemoryError=kill ­9 %p ­Djava.security.egd=/dev/urandom ­cp /opt/pu Jun 06 14:35:20 ubuntu systemd[1]: Starting puppetserver Service... Jun 06 14:35:20 ubuntu java[21259]: OpenJDK 64­Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0 Jun 06 14:35:28 ubuntu java[21259]: Warning: The following options to parse­opts are unrecognized: :flag Jun 06 14:36:00 ubuntu systemd[1]: Started puppetserver Service. E acerte o arquivo de configuração como feito anteriormente no CentOS. Se você tiver dificuldade com o Puppet Server e preferir usar o Puppet Master por usar o Debian Wheezy ao invés do Jessie, siga o roteiro abaixo. Para instalar o Puppet Master no Debian Wheezy baixe e instale o release: # wget http://apt.puppetlabs.com/puppetlabs­release­pc1­wheezy.deb # dpkg ­i puppetlabs­release­pc1­wheezy.deb # apt­get update Não se esqueça que nas máquinas clientes o pacote correto é o “puppet­agent”. Na máquina escolhida para ser o Master faremos diferente. Faremos o seguinte: Copyright Logicus 2016 116 # apt­get install ­y puppet puppet­common puppet­el puppet­testsuite puppetmaster puppetmaster­common vim­puppet Pare o serviço: # kill ­9 $(ps aux | grep puppet | grep ­v grep | awk '{print $2}') Para desabilitar o início automático: # sed ­i "s/START=yes/START=no/g" /etc/default/puppetmaster Instale o passenger: # apt­get install puppetmaster­passenger Verifique se o serviço foi levantado na porta correta: # netstat ­a | grep 8140 tcp6 0 0 [::]:8140 [::]:* LISTEN Ao acessar o ip do master via https na porta 8140 deve aparecer no seu navegador a frase “The environment must be purely alphanumeric, not ''”. Isto significará que o master está levantado! Ou seja, para encerrar, lembre­se de que para fazer as comunicações entre as máquinas agentes e o Copyright Logicus 2016 117 servidor é preciso inserir no arquivo ​
puppet.conf​
(exatamente como fez no exemplo do CentOS) a configuração que aponta para o server. Ao realizar o comando “​
puppet agent ­test​
” (nas máquinas clientes) por exemplo você deverá receber no servidor que vai gerenciar os nós as seguintes requisições de certificado: # puppet cert list ­a "ubuntu.logicus.local" (SHA256) A1:54:6E:80:EB:F8:9C:93:A3:26:6A:3E:83:09:76:52:90:27:C1:CC:5C:08:5B:0B:F5:13:3C:B7:3B:32:B1:A1 "debian.logicus.local" (SHA256) 70:63:48:79:56:15:17:6C:E6:DF:E6:03:04:75:E7:A6:3E:03:CF:5D:93:90:7C:64:77:9C:34:88:F7:87:FC:9D + "centos.logicus.local" (SHA256) 10:B0:53:45:2C:E6:1C:BE:57:4F:12:A3:1C:A4:87:6C:04:96:50:32:7D:9D:DB:7D:61:45:B8:FB:94:7D:A1:2B (alt names: "DNS:centos.logicus.local", "DNS:puppet") Para liberar faça por exemplo na máquina em que está instalado o puppetserver: # puppet cert sign ubuntu.logicus.local Ou para todas as requisições: # puppet cert sign ­­all Agora com as máquinas se comunicando com o Puppet Server repita o passo realizado no CentOS com relação a instalação do “lynx” só que indicando como “node” as máquinas clientes. Isto é bom para praticar! Por fim gostariamos de falar que existe uma ferramenta chamada Mcollective para o caso de querer enviar comandos mais rapidamente para todos os membros da sua infra. O Mcollective é um Framework que visa servir para orquestração. Sua ideia é de que executa ações em servidores simultaneamente. Vejamos uma pequena tabela do que é possível fazer com MCollective: Copyright Logicus 2016 118 Pode? O quê? Sim Interagir com um número pequeno ou grande de clusters Sim Ferramentas simples em linha de comando para chamar agentes remotos Sim Plugável e adaptável as necessidades locais Sim Reutilizar capacidade de Middleware para clustering, roteamento e isolamento de rede. Com isto é possível configurações seguras e escaláveis Nosso objetivo com este artigo é que você fosse capaz de compreender a lógica do Puppet, criar manifestos localmente, instalar e desinstalar módulos, instalar o Puppet Server e ser capaz de empurrar uma configuração na rede. Esperamos ter despertado o seu interesse para o mundo DevOps com esta ferramenta maravilhosa que é o Puppet! Não deixe de estudar mais ainda sobre outras ferramentas como por exemplo o Ansible! ​
Have a nice hacking day! Copyright Logicus 2016 119 

Documentos relacionados