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 lembrese 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: 24 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 clienteservidor. 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/puppetlabsreleasepc1xenial.deb # sudo dpkg i puppetlabsreleasepc1xenial.deb Copyright Logicus 2016 3 # sudo aptget update # sudo aptget install puppetagent Para instalar em sistemas baseados em Red Hat como é o caso do CentOS 7: # rpm Uvh https://yum.puppetlabs.com/puppetlabsreleasepc1el7.noarch.rpm # yum install puppetagent Perceba os pacotes disponíveis: # yum search puppet | grep E ^puppet puppetagent.x86_64 : The Puppet Agent package contains all of the elements puppetclienttools.x86_64 : PuppetDB CLI for querying Puppet data puppetdb.noarch : Puppet Labs puppetdb puppetdbtermini.noarch : Termini for puppetdb puppetdbterminus.noarch : Metapackage to allow easy upgrades from PuppetDB 2 puppetlabsreleasepc1.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/puppetlabsreleasepc1jessie.deb # dpkg i puppetlabsreleasepc1jessie.deb # aptget update # aptget install puppetagent Veja os pacotes disponíveis no Debian: # aptcache search puppet namesonly etherpuppet create a virtual interface from a remote Ethernet interface fusiondirectorypluginpuppet Puppet plugin for FusionDirectory fusiondirectorypluginpuppetschema LDAP schema for FusionDirectory puppet Plugin librarianpuppet bundler for your puppet modules puppet configuration management system, agent puppetcommon configuration management system puppetel syntax highlighting for puppet manifests in emacs puppettestsuite configuration management system, development test suite puppetmaster configuration management system, master service puppetmastercommon configuration management system, master common files puppetmasterpassenger configuration management system, scalable master service vimpuppet syntax highlighting for puppet manifests in vim puppetlint check puppet manifests for style guide conformity puppetmodulepuppetlabsapache Puppet module for apache Copyright Logicus 2016 5 puppetmodulepuppetlabsapt Puppet module for apt puppetmodulepuppetlabsconcat Puppet module for concat puppetmodulepuppetlabsfirewall Puppet module for Firewall management puppetmodulepuppetlabsinifile Puppet module for ini files puppetmodulepuppetlabsmysql Puppet module for mysql puppetmodulepuppetlabsntp Puppet module for ntp puppetmodulepuppetlabspostgresql Puppet module for PostgreSQL database puppetmodulepuppetlabsstdlib Puppet module standard library puppetmodulepuppetlabsxinetd Puppet module for xinetd puppetmodulesazmemcached Puppet module for memcached rubypuppetlabsspechelper rake tasks and spec helper for spec tests on puppet modules rubyrspecpuppet RSpec tests for your Puppet manifests puppetdbtermini Termini for puppetdb puppetdb Puppet Labs puppetdb puppetlabsreleasepc1 Release packages for the Puppet Labs PC1 repository puppetserver Puppet Labs puppetserver puppetagent The Puppet Agent package contains all of the elements needed to run puppet, including ruby, facter, hiera and mcollective. puppetlabsrelease "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 tratase 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. customdir arg A directory to use for custom facts. d [ debug ] Enable debug output. externaldir arg A directory to use for external facts. h [ help ] Print this help message. j [ json ] Output in JSON format. showlegacy Show legacy facts when querying all facts. l [ loglevel ] arg (=warn) Set logging level. Supported levels are: none, trace, debug, info, warn, error, and fatal. nocolor Disables color output. nocustomfacts Disables custom facts. noexternalfacts Disables external facts. noruby 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 Puppetspecific 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 => "CDROM", 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 => "A6F6E8B29D9248EBE44BE6068A414386" } } 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.04amd64 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=remountro", "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 => "96522ed201", size => "7.62 GiB", size_bytes => 8185184256, uuid => "58d6492c8aa12297af916e1c24dd68ab" }, /dev/sda2 => { size => "1.00 KiB", size_bytes => 1024 }, /dev/sda5 => { filesystem => "swap", partuuid => "96522ed205", size => "383.00 MiB", size_bytes => 401604608, uuid => "74c47bda458235489b4af7215d3ee65a" } } 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) i75500U CPU @ 2.40GHz" ], physicalcount => 1 } ruby => { platform => "x86_64linux", 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_64linux", 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 puppetresource(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 BugReporting 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 { 'systemdbusproxy': 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 { 'systemdnetwork': 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 { 'systemdresolve': 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 { 'systemdtimesync': 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 { 'wwwdata': ensure => 'present', comment => 'wwwdata', 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 => '20160604 15:28:00 0300', group => '0', mode => '0644', mtime => '20160604 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 => '20160604 16:28:10 0300', group => '0', mode => '0755', mtime => '20160604 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.31build1', } 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: # updatealternatives 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 { "updatealternatives 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[updatealternatives 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 puppetdescribe(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 clientside 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 systemspecific 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 => ['24'], 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 puppetapply(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] [detailedexitcodes] [L|loadclasses] [l|logdest syslog|eventlog|<FILE>|console] [noop] [catalog <catalog>] [writecatalogsummary] <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 sitewide 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. * detailedexitcodes: 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 noop or dryrun 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', 'detailedexitcodes' 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. * writecatalogsummary 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) DropIn: /run/systemd/generator/postfix.service.d └─50postfix$mailtransportagent.conf Active: active (running) since Sáb 20160604 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. Tratase 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. Lembrese 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', } Lembrase 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 vimpuppet: # aptitude install vimpuppet Em seguida faça: # vimaddons 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/diretorioteste': path => '/tmp/diretorioteste', ensure => directory, } Copyright Logicus 2016 66 file { 'arquivoteste': path => '/tmp/diretorioteste/arquivoteste', ensure => 'present', owner => angela, mode => '0640', content => "Eu sou um arquivo teste :)", require => File['/tmp/diretorioteste'], } file { '/tmp/diretorioteste/linkdoarquivoteste': ensure => link, owner => gustavo, target => '/tmp/diretorioteste/arquivoteste', require => File['arquivoteste'], } Vejamos uma tabela para entender o que aconteceu: diretório teste dissemos para o puppet que queríamos um diretório chamado “diretorioteste” presente no diretório /tmp arquivo teste dissemos para o puppet que queriamos um arquivo chamado “arquivoteste” no “diretorioteste”, 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/diretorioteste]/ensure: created Notice: /Stage[main]/Main/File[arquivoteste]/ensure: defined content as '{md5}c7e3ada978865414be69897879bd57ea' Notice: /Stage[main]/Main/File[/tmp/diretorioteste/linkdoarquivoteste]/ensure: created Notice: Applied catalog in 0.05 seconds Confira: # ls l /tmp/diretorioteste/ total 4 rwr 1 angela root 26 Jun 4 21:17 arquivoteste lrwxrwxrwx 1 gustavo root 34 Jun 4 21:19 linkdoarquivoteste > /tmp/diretorioteste/arquivoteste Para apagar estes arquivos: # puppet resource file '/tmp/diretorioteste' recurse=true purge=true Notice: /File[/tmp/diretorioteste/arquivoteste]/ensure: removed Notice: /File[/tmp/diretorioteste/linkdoarquivoteste]/ensure: removed Copyright Logicus 2016 68 file { '/tmp/diretorioteste': ensure => 'directory', } Confira: # ls l /tmp/diretorioteste/ 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 { 'cronupdatedb': 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: cronupdatedb 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[cronupdatedb]/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 20160605 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: cronupdatedb 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 usercontributed Puppet code. It can also generate empty modules, and prepare locally developed modules for release on the Forge. OPTIONS: renderas 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 puppetmodule' for full help. Para listar os seus módulos digite “ puppet module list ”. Exemplo: # puppet module list /etc/puppet/modules ├── fsalumdashboard (v0.0.5) ├── puppetlabsapache (v0.10.0) ├── puppetlabsconcat (v1.0.0) ├── puppetlabsmysql (v2.1.0) ├── puppetlabspassenger (v0.2.0) ├── puppetlabsruby (v0.1.0) └── puppetlabsstdlib (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 garethrdocker Module for installing and managing docker @garethr lxc redhat centos docker tsurudocker Puppet module to Docker @tsuru tsurudocker tsuru paas jgreatdocker Manage docker containers natively with a 'docker' Servi... @jgreat ChrisTheSharkdocker Puppet module to install Docker on Centos or Ubuntu Lin... @ChrisTheShark ffollonierdocker A puppet module that manage the dockerengine daemon co... @ffollonier docker jmangtdocker Installs Docker @jmangt cristifalcasdocker Module for installing and managing docker @cristifalcas docker RHsysengdocker set up docker on a host @RHsyseng noppdocker Simple docker module @nopp akegatadocker Handle docker containers as services in RHEL. @akegata garystafforddocker_machine Downloads and installs Docker Machine @garystafford dockermachine machine docker garystafforddocker_compose Downloads and installs Docker Compose @garystafford dockercompose compose docker scottycdocker_swarm A module for Docker Swarm @scottyc swarm docker narasimhasvdocker Install docker @narasimhasv Copyright Logicus 2016 82 ajsmithdocker_systemd Configure systemd services to run Docker containers. @ajsmith systemd docker cristifalcasdocker_registry installs and configures docker registry @cristifalcas dockerregistry puppetlabsdocker_platform Installs, configures, and manages the Docker daemon and... @puppetlabs puppetlabsdocker_ucp Installs, configures, and manages the Docker Universal ... @puppetlabs praekeltfoundationdocker_firewall Simplifies management of iptables rules when running Do... @praekeltfoundation markbdocker_registry UNKNOWN @markb garystaffordfig Downloads and installs Fig (http://www.fig.sh) @garystafford container docker fig cristifalcasflannel flannel is a virtual network that gives a subnet to eac... @cristifalcas docker flannel cjtoolseramdrone Drone CI module @cjtoolseram continuous docker ci drone nickrancher Deploy Rancher, a container orchestration tool @nick containers docker rancher pennycodersmarathon Mesosphere Marathon installation / management module @pennycoders cloud docker apache mesos pennycodersmesos Apache mesos installation / management module @pennycoders cloud docker apache mesos tayzlorweave Module for installing and configuring Weave for Docker @tayzlor weave docker prozetaportauthority Puppet module to bootstrap Port Authority @prozeta etcd paas docker meltwatermarathon Puppet Module for Mesos Marathon @meltwater docker marathon mesos stfalconsphinxsearchdocker A module for running sphinx in docker containers @stfalcon sphinx docker cristifalcaskubernetes Configuring and installing kubernetes @cristifalcas kubectl kubelet docker tsurutsuru Puppet module to Tsuru PaaS @tsuru docker paas cethygaudi Module for installing gaudi from repository on gaudi.io... @cethy gaudi docker ajsmithgrafana Grafana instance configuration using Docker. @ajsmith systemd docker grafana ajsmithgraphite Graphite server configuration using Docker. @ajsmith systemd docker graphite Copyright Logicus 2016 83 ajsmithriemann Riemann server configuration. @ajsmith systemd docker riemann momermaestrong Module to set up a bare metal box for Docker & Maestrong @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 stahnmapuppetlabs_yum Setup the Puppet Labs Yum package repo @stahnma centos rhel puppetlabs yum ploperationspuppetlabs_apt Installs the Puppet Labs community apt repository @ploperations puppetlabs apt mmitchellpuppetlabs_ntp UNKNOWN @mmitchell mmitchellpuppetlabs_ironic Puppet module for OpenStack Ironic @mmitchell puppetlabsstdlib Standard library of resources for Puppet modules. @puppetlabs puppetlabs stdlib stages puppetlabscloud_provisioner Puppet Cloud Provisioner @puppetlabs puppetlabs cloud ec2 aws puppetlabsjava Installs the correct Java package on various platforms. @puppetlabs java puppetlabs stdlib jdk jre puppetlabspowershell Adds a new exec provider for executing PowerShell commands. @puppetlabs exec powershell windows puppetlabsacl This module provides the ability to manage ACLs on nodes @puppetlabs microsoft ace acl puppetlabswsus_client Manage WSUS (Windows Server Update Service) settings for cl... @puppetlabs puppetlabsdsc PowerShell Desired State Configuration (DSC) @puppetlabs dsc powershell puppetlabswindows Collection of Puppet modules for managing Microsoft Windows. @puppetlabs puppetlabsdocker_platform Installs, configures, and manages the Docker daemon and Doc... @puppetlabs puppetlabslogentries A module to install the logentries agent. @puppetlabs logentries logging Copyright Logicus 2016 84 puppetlabshocon Resource types for managing settings in HOCON files @puppetlabs puppetlabsazure Create and manage machines running on Microsoft Azure with ... @puppetlabs azure linux windows cloud puppetlabspolicy_engine A module for managing policy tests as structured facts @puppetlabs compliance security policy puppetlabscatalog_preview Module providing catalog preview and migration features @puppetlabs delta diff catalog preview puppetlabsmount_iso Mount ISO images and ensure the drive letter they are mount... @puppetlabs powershell iso image mount puppetlabspackage_updates A module for monitoring for package updates @puppetlabs packages updates patch puppetlabsdocker_ucp Installs, configures, and manages the Docker Universal Cont... @puppetlabs puppetlabsibm_installation_manager Manages IBM Installation Manager and IBM packages @puppetlabs iim imcl was websphere ibm puppetlabsapk Manage packages on Alpine Linux using the APK package manager @puppetlabs puppetlabschocolatey Chocolatey package provider for Puppet @puppetlabs package dotnet net microsoft puppetlabsntp Installs, configures, and manages the NTP service. @puppetlabs ntp time aix rhel centos ntpd puppetlabsregistry This module provides a native type and provider to manage k... @puppetlabs windows type registry win32 puppetlabsinifile Resource types for managing settings in INI files @puppetlabs inifile ini settings file puppetlabsrancher Installs Rancher Server and Agents @puppetlabs puppetlabsjava_ks Manage arbitrary Java keystore files @puppetlabs java ssl keystore certs puppetlabstagmail This module provides a report processor that sends events t... @puppetlabs puppetlabsnetscaler Enables Puppet configuration of Citrix NetScaler devices th... @puppetlabs loadbalancer network netscaler puppetlabslvm Provides Puppet types and providers to manage Logical Resou... @puppetlabs lvm hdd volume storage puppetlabsxinetd Configures xinetd and exposes the xinetd::service definitio... @puppetlabs xinetd centos Copyright Logicus 2016 85 rhel debian puppetlabsrkt Installs, configures, and manages the rkt container runtime. @puppetlabs puppetlabsapt Provides an interface for managing Apt source, key, and def... @puppetlabs apt debian ubuntu dpkg ppa puppetlabsconcat Construct files from multiple fragments. @puppetlabs concat files fragments puppetlabsreboot Adds a type and provider for managing system reboots. @puppetlabs windows reboot puppetlabsruby Manages Ruby and Rubygems. @puppetlabs ruby puppetlabspostgresql Offers support for basic management of PostgreSQL databases. @puppetlabs rhel ubuntu debian pgsql puppetlabsvcsrepo Puppet module providing a type to manage repositories from ... @puppetlabs cvs vcs repo svn git hg bzr puppetlabshaproxy Configures HAProxy servers and manages the configuration of... @puppetlabs proxy haproxy lb loadbalancer puppetlabsstrings Puppet documentation via YARD @puppetlabs docs dev puppet yardoc yard puppetlabsnetdev_stdlib Type definitions for Networking Device (NetDev) Standard Li... @puppetlabs puppetlabsnetapp Manages resources on NetApp Cluster Data ONTAP devices. @puppetlabs puppetlabsciscopuppet Cisco Puppet providers and types for NXOS devices @puppetlabs network nxos nxos cisco puppetlabspe_gem Adds provider for the Puppet Enterprise Ruby gem manager. @puppetlabs pe gem puppetlabscorosync This module is a set of manifests and types/providers for q... @puppetlabs debian ha heartbeat pacemaker puppetlabspe_puppetserver_gem Puppet Labs PE Puppetserver Gem Module @puppetlabs puppetlabsmysql Installs, configures, and manages the MySQL service. @puppetlabs mysql centos rhel ubuntu puppetlabsaccounts Account management module. @puppetlabs puppetlabsfirewall Manages Firewalls such as iptables @puppetlabs redhat centos debian ubuntu puppetlabsgit Module for installing Git or Gitosis. @puppetlabs puppetlabstftp Installs and manages TFTP service and configuration. @puppetlabs debian ubuntu tftp centos rhel Copyright Logicus 2016 86 puppetlabspassenger Configures and manages Passenger. @puppetlabs apache passenger rails rack puppetlabsgce_compute Native types for managing Google Cloud Platform infrastruct... @puppetlabs device compute google gce puppetlabsrabbitmq Installs, configures, and manages RabbitMQ. @puppetlabs amqp stomp queue centos rhel puppetlabspuppetdb Installs PostgreSQL and PuppetDB, sets up the connection to... @puppetlabs puppet puppetdb storeconfig puppetlabsmotd A simple module to demonstrate managing /etc/motd or Window... @puppetlabs testing puppetlabslib_puppet Puppet Labs lib_puppet module @puppetlabs puppet puppetlabsappdirector Puppet AppDirector @puppetlabs vmware puppetlabskwalify A set of kwalify related functions for puppet. @puppetlabs validation kwalify puppetlabsapache Installs, configures, and manages Apache virtual hosts, web... @puppetlabs web httpd rhel ssl wsgi proxy puppetlabsmssql Puppet Labs Microsoft SQL Server Module @puppetlabs database windows mssql sql2008 puppetlabsmongodb Installs MongoDB on RHEL/Ubuntu/Debian. @puppetlabs nosql cluster mongo mongodb puppetlabsdenyhosts Configure DenyHosts @puppetlabs security denyhosts puppetlabsnode_openstack Cloud Provisioner support for OpenStack @puppetlabs openstack nova vm puppetlabsvcli_rsyslog Puppet Enterprise module for saz/rsyslog @puppetlabs vcli rsyslog puppetlabslimits Defined resource type for managing /etc/security/limits @puppetlabs puppetlabsaws This module provides the ability to manage AWS resources @puppetlabs puppetlabstransition Transition state resource type @puppetlabs transition catalog puppetlabscloudformation Module to deploy Cloudformation Face @puppetlabs puppet ec2 amazon pe cfn puppetlabsawsdemo_profiles Puppet module to manage "profiles" and higherlevel abstrac... @puppetlabs aws demo puppetlabstomcat Installs, deploys, and configures Apache Tomcat web services. @puppetlabs tomcat Copyright Logicus 2016 87 puppetlabsdhcp Manage the ISC dhcp daemon @puppetlabs dhcp puppetlabssqlite Manage a sqlite installation and databases @puppetlabs database sqlite puppetlabspuppet_authorization Module to manage auth.conf. @puppetlabs puppetlabspe_upgrade Automated upgrades of PE @puppetlabs enterprise upgrade puppet puppetlabsdism Provides a DISM puppet resource type on Windows. @puppetlabs windows dism puppetlabsvcenter vcenter puppet module @puppetlabs windows vmware vcenter vsphere puppetlabsrsync Manages rsync clients, repositories, and servers, & providi... @puppetlabs rsync puppetlabsmount_providers Provides the mounttab and mountpoint resource types. @puppetlabs solaris linux mount mounttab puppetlabsopenstack Install, configure, and manage a full installation of OpenS... @puppetlabs icehouse cloud openstack puppetlabspuppet_agent Upgrades Puppet 3.8 and AllInOne Puppet Agents @puppetlabs puppetlabsboundary Boundary meter module @puppetlabs network boundary bprobe probe puppetlabssplunk Manage and deploy Splunk servers and forwarders @puppetlabs splunk puppetlabsmrepo Configures and manages mrepo mirrors @puppetlabs rpm yum mrepo mirror puppetlabsazure_agent The Azure module installs and configures the Windows Azure ... @puppetlabs puppetlabsnodejs Install Node.js package and npm package provider. @puppetlabs debian nodejs ubuntu npm puppetlabsactivemq Installs and configures ActiveMQ. @puppetlabs java amqp stomp stdlib puppetlabsstunnel A module for creating secure tunnels @puppetlabs debian ssl security tunnel tls puppetlabsopennebula OpenNebula Module @puppetlabs cloud opennebula puppetlabspuppetserver_gem Puppet Labs Puppetserver Gem Module @puppetlabs puppetlabsgcc Module for installing gcc build utils @puppetlabs gcc compiler puppetlabsmcollective Installs, configures, and manages MCollective agents, clien... @puppetlabs client amqp stomp server puppetlabsdashboard Puppet module for the Puppet Dashboard @puppetlabs puppet dashboard Copyright Logicus 2016 88 console face puppetlabsnode_gce Puppet Google Compute Module @puppetlabs nodegce cloud google puppetlabsbacula This module manages a bacula infrastructure @puppetlabs backup bacula puppetlabsdrbd DRBD module @puppetlabs ha drbd failover puppetlabswin_desktop_shortcut Manages a shortcut on a Windows desktop for all users @puppetlabs windows desktop shortcut puppetlabsrazor Razor puppet module @puppetlabs razor ubuntu puppetlabsnginx Puppet NGINX management module @puppetlabs http web proxy nginx https puppetlabspuppet_hipchat Deply and manage the Puppet HipChat addon application @puppetlabs chatops hipchat pltrainingkickstand Module to assist in the provisioning lab for the Advanced P... @pltraining puppetlabs training advanced pltraininguserprefs 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 puppetlabsfirewall Notice: Preparing to install into /etc/puppet/modules ... Notice: Downloading from https://forgeapi.puppetlabs.com ... Notice: Installing do not interrupt ... /etc/puppet/modules └── puppetlabsfirewall (v1.8.0) Um comentário de passagem sobre a instalações de módulos é o seguinte: para ignorar as dependências use ignoredependencies . Exemplo: puppet module install asterisk ignoredependencies . 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 puppetlabsmotd 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 └─┬ puppetlabsmotd (v1.4.0) └─┬ puppetlabsregistry (v1.1.3) └── puppetlabsstdlib (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 logicusutils 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? [Apache2.0] > apache2.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": "logicusutils", "version": "0.1.0", "author": "logicus", "summary": "otimização da logicus", "license": "apache2.0", "source": "", "project_page": "logicus.com.br", "issues_url": null, Copyright Logicus 2016 92 "dependencies": [ {"name":"puppetlabsstdlib","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/logicusutils0.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 . Tratase 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 geppettolinux.gtk.x86_644.3.1R201501182354.zip Acesse a pasta descompactada. Perceba que há diversos arquivos nesta: $ ls l total 216 rwrr 1 gustavo gustavo 65151 Jan 19 2015 artifacts.xml drwxrxrx 4 gustavo gustavo 4096 Jan 19 2015 configuration rwrr 1 gustavo gustavo 15551 Jan 18 2015 eplv10.html drwxrxrx 28 gustavo gustavo 4096 Jan 19 2015 features rwxrxrx 1 gustavo gustavo 74675 Jan 19 2015 geppetto rwrr 1 gustavo gustavo 244 Jan 19 2015 geppetto.ini rwxrxrx 1 gustavo gustavo 10616 Jan 19 2015 icon.xpm rwrr 1 gustavo gustavo 2056 Jan 18 2015 notice.html drwxrxrx 4 gustavo gustavo 4096 Jan 19 2015 p2 drwxrxrx 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 “puppetlabsfirewall 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! Tratase de uma VM com CentOs disponível para download. O link para download é: http://info.puppetlabs.com/downloadlearningpuppetVM.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 /puppet2016.1.2learning5.1.ova inflating: __MACOSX/learning_puppet_vm /._puppet2016.1.2learning5.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 certifiquese 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 20160606 21:29:08 BRT; 6min ago Process: 2860 ExecStartPost=/bin/bash ${INSTALL_DIR}/ezbakefunctions.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 64Bit 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 parseopts 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 puppetagent 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: # aptget 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 20160606 14:36:00 BRT; 9s ago Process: 21260 ExecStartPost=/bin/bash ${INSTALL_DIR}/ezbakefunctions.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 64Bit 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 parseopts 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/puppetlabsreleasepc1wheezy.deb # dpkg i puppetlabsreleasepc1wheezy.deb # aptget update Não se esqueça que nas máquinas clientes o pacote correto é o “puppetagent”. Na máquina escolhida para ser o Master faremos diferente. Faremos o seguinte: Copyright Logicus 2016 116 # aptget install y puppet puppetcommon puppetel puppettestsuite puppetmaster puppetmastercommon vimpuppet 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: # aptget install puppetmasterpassenger 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, lembrese 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