Beruflich Dokumente
Kultur Dokumente
Introduoaogerenciamentode
servidorescomPuppet
Junho/2016
Autores:
AngelaFernandaFerreiraangela@logicus.com.br
GustavoSoaresdeLimagustavo@logicus.com.br
O
l!EstemaisumpaperquedispomosparavocseaprofundaremTecnologia.DestavezoassuntoescolhidofoioPuppet,ferramenta
construdaparaasprticasDevOpsquetornaavidadeadministradoresdesistemasLinuxmaisfcil.Masporquvocdeveriaentenderde
prticasDevOps?DaimportnciadarelaoentrevirtualizaoeLinux,advmaimportnciadogerenciamentodeconfiguraespara
administradoresdesistemaspoiscenriosqueantigamentepossuampoucosservidoreshojepodemchegarcomfacilidadeacasadecentenas
empoucosdias.ApsconheceroPuppet,sevocpraticar,perceberqueelefacilitarmuitoasuavidacomoprofissionalemLinux,poisele
automatizartodasaquelasrotinasdesdequestesbsicasatainstalaoeconfiguraodestesmesmosservidores.Istomelhora
CopyrightLogicus2016
1
exponencialmenteavidadosysadmin.Avidadeumadministradordesistemasempocasquefaltamprofissionaisnonadafcil.Vocsev
cheiodetarefasrepetitivas!Passaodiarealizandoasmesmascoisascomoconfiguraesderotas,configuraesdehosts,configuraesde
usuriosepermisses,pranofalardeoutrascoisascomoconfiguraoderepositrios,pacotes,variveis,rotinasnoCron.Cadasysadminfaza
coisadoseuprpriojeitoecomissoseaumentamaschancesdeerro.Oquevocfazentonormalmente?Shellscripts,imagens
prconfiguradas,SSHemloop.Ouseja,cadavezmaisseaumentaadificuldadeemencontrarproblemas.Padronizaosetornaimpossvele
documentarsetornaummilagre.AnoadiantarezareentregarainfranamodeDeus,elejtemosseusproblemasequandovocmenos
esperaoqueocorreadiminuiodaprodutividade.Noseiluda:aculpasempredosysadmin,oupior:deDeus!Masvocpodemudaressa
situao!Alis,deve!
VivemosummomentodetendnciasparaVirtualizaoeComputaoemnuvemondeoinvestimentocadavezmenorumaboaprtica.Poristo
queosysadminsetornouumcanivetesuo.IstojustificaanecessidadedevocsetornarumDevOps!Masoqueisso?Pensecomo
Development+Operations,emtranquilidade,experincia,controledequalidade.Ouseja,oDevOpspensaainfraestruturaemoutronvel.O
resultadoprodutividadeeeconomia.AsprticasDevOpsaquenosreferimostemnoseucentroaGernciadeConfiguraesquenadamais
queadistribuiocentralizadadaconfigurao,procedimentosdefinidos,automao,documentaoemdia,maiorsegurana,maior
disponibilidade,maiorintegridadeeprincipalmentemaiortempocomafamlia,porqusevocdeixar,omercadolhedeixardejoelhoscomoum
verdadeiroescravoeaindaojulgarporineficinciaquandoassuasenergiasestiveremesgotadas.
ExistemdiversasferramentasparagerenciamentodeconfiguraocomoAnsible,Capistrano,Chef,CFEngine,PuppeteSaltStack.Sobreo
Puppet,queonossoalvonesteartigo,podemosdizerqueseuobjetivoaAutomaodeservidores.FoicriadopelaPuppetLabs,mais
especificamenteporLukeKaines.PossuiLicenaApache2.0esetratanarealidadedeumFrameworkopensource.DizemosqueoPuppetuma
Ferramentadenovagerao.Trataainfraestruturacomocdigoepossuiumalinguagemdeclarativa.APuppetLabsofereceaindasuportee
versoEnterprise.PossuicomunicaoseguraSSL,idempotenteeseucdigoestnoGitHub.DiversasempresasusamPuppetcomo:Nestl,
Nike,Paypal,Seagate,Sony,Nasa,ADP,AON,ARM,Atlassian,BankofAmerica,BarneseNoble,BT,Cedexis,Cisco,Ciclability,CondNast,
ConstanctContact,Costco,EMC,WikimediaFoundation,Dell,FT.com,Rackspace,GeneralMilis,Genworth,HBO,Hersheys,Hotwire,ICANN,
CopyrightLogicus2016
2
Intel,Intuit,JohnDeere,KPN,MacAfee,Motorola,Zynga,Twitter,NewYorkStockExchange,Disney,Citrix,Oracle,TheUniversityofNorthTexas,
LosAlamosNationalLaboratory,StanfordUniversity,Google,Nokia,Globoeclaro,aLogicus.InclusiveaLogicusjestevepresenteemdiversos
eventospalestrandosobreboasprticascomPuppetcomonoSoftwareFreedomDay,FestivalLatinoamericanodeInstalaodeSoftwareLivree
FrumdeTecnologiaemSoftwareLivre.
AutilidadedoPuppetadequeorganizaesquedesejamreduzirocustodemanutenopodemfazloatravsdareduodocustoemtempo
deadministraodeservidores.AsespecificaesdoPuppetsoasseguintes:EscritoemRubyeextensvelemRuby.ConhecerRubycom
certezadegrandevalia,poisoseucdigoestnoGitHub,eassimficasimplesparavocefetuarmodificaescasosejanecessrio.Mas
lembresequeistonoprrequisito,esimumadicaparaquevocampliesuasprticasDevOps.Noqueserefereaohardwarevejaoquediza
PuppetLabs:Recommendedrequirements:24processorcores,atleast4GBRAM,andveryaccuratetimekeeping.Performancewillvary,but
thisconfigurationcangenerallymanageapproximately1,000agentnodes.OPuppettrabalhacomumacoisachamadaRAL,ouseja,Resources
AbstractionLayer.Vocnoprecisasepreocuparcomoserfeito,apenasdevemandarfazereoPuppetresolverpoisoPuppetpossuiseu
conjuntoderecursosereconhecimentodeproviders.OPuppetpodetrabalharemmodoautnomo,oqueinclusivefundamentalparao
aprendizado,poisrodanasuamquina,ouseja,localmente.BoasprticassosugeridasparasetrabalharcomPuppetcomocdigolegveljque
fundamentalnotrabalhoemequipe.Nestesentido,lhealertamosdesdejpara:assetasalinhadas,Noextrapolar80caracteresporlinha,em
variveisprivilegieletras,nmeroseunderscore,fugirdohfenetravessoeparatestarocdigodomanifesto(arquivoquecontmdeclaraes
doPuppet)usarumcomandochamado
puppetparservalidatemanifesto.pp
.Masissomaisafrentequandoolharmosparaasualinguagem
declarativa,antesdissoprecisamoscuidardainstalao.NesteartigoiremosinstalaroPuppetnasseguintesdistrosLinux:
Ubuntu16.04,Debian
8.4,eCentOS7,
eusaremosoCentOScomoPuppetServernomomentodaconfiguraoparaqueumamquinadetermineoqueoutradever
conter,ouseja,narelaoclienteservidor.VejamosainstalaonoUbuntu16.04,codinomeXenial.PrimeiramentevocdeverusaroPuppeta
partirdosreleasesdisponibilizadospelaprpriaPuppetLabspoisnemsempreencontramosospacotesatualizadosnasdistros.Entofaa:
#wgethttp://apt.puppetlabs.com/puppetlabsreleasepc1xenial.deb
#sudodpkgipuppetlabsreleasepc1xenial.deb
CopyrightLogicus2016
3
#sudoaptgetupdate
#sudoaptgetinstallpuppetagent
ParainstalaremsistemasbaseadosemRedHatcomoocasodoCentOS7:
#rpmUvhhttps://yum.puppetlabs.com/puppetlabsreleasepc1el7.noarch.rpm
#yuminstallpuppetagent
Percebaospacotesdisponveis:
#yumsearchpuppet|grepE^puppet
puppetagent.x86_64:ThePuppetAgentpackagecontainsalloftheelements
puppetclienttools.x86_64:PuppetDBCLIforqueryingPuppetdata
puppetdb.noarch:PuppetLabspuppetdb
puppetdbtermini.noarch:Terminiforpuppetdb
puppetdbterminus.noarch:MetapackagetoalloweasyupgradesfromPuppetDB2
puppetlabsreleasepc1.noarch:ReleasepackagesforthePuppetLabsPC1
puppetserver.noarch:PuppetLabspuppetserver
Agoraquejestinstaladopodeusarocomandopuppetparaumteste.Nocasodeocomandopuppetnoestarpresente,comoporexemplo
noCentOS7,vocpodefazeralternativamente:
#whereispuppet
puppet:/opt/puppetlabs/bin/puppet
#exportPATH=/opt/puppetlabs/bin:$PATH
CopyrightLogicus2016
4
Istosignificouquevoctevedeindicarocaminhodobinrio.possvelquetenhaquefazeristoemtodasasinstalaesequandonecessriono
processodereincioduranteesteartigonaprticadainstalaodoPuppetMasterePuppetServerquandoiremosfazercomqueumamquina
recebaaconfiguraodeoutra.Sequiserfazerdeformapermanenteacrescenteno
rc.local
.ParainstalaremsistemasbaseadosnoDebian,
seguindoomodeloemumDebianJessie:
#wgethttp://apt.puppetlabs.com/puppetlabsreleasepc1jessie.deb
#dpkgipuppetlabsreleasepc1jessie.deb
#aptgetupdate
#aptgetinstallpuppetagent
VejaospacotesdisponveisnoDebian:
#aptcachesearchpuppetnamesonly
etherpuppetcreateavirtualinterfacefromaremoteEthernetinterface
fusiondirectorypluginpuppetPuppetpluginforFusionDirectory
fusiondirectorypluginpuppetschemaLDAPschemaforFusionDirectorypuppetPlugin
librarianpuppetbundlerforyourpuppetmodules
puppetconfigurationmanagementsystem,agent
puppetcommonconfigurationmanagementsystem
puppetelsyntaxhighlightingforpuppetmanifestsinemacs
puppettestsuiteconfigurationmanagementsystem,developmenttestsuite
puppetmasterconfigurationmanagementsystem,masterservice
puppetmastercommonconfigurationmanagementsystem,mastercommonfiles
puppetmasterpassengerconfigurationmanagementsystem,scalablemasterservice
vimpuppetsyntaxhighlightingforpuppetmanifestsinvim
puppetlintcheckpuppetmanifestsforstyleguideconformity
puppetmodulepuppetlabsapachePuppetmoduleforapache
CopyrightLogicus2016
5
puppetmodulepuppetlabsaptPuppetmoduleforapt
puppetmodulepuppetlabsconcatPuppetmoduleforconcat
puppetmodulepuppetlabsfirewallPuppetmoduleforFirewallmanagement
puppetmodulepuppetlabsinifilePuppetmoduleforinifiles
puppetmodulepuppetlabsmysqlPuppetmoduleformysql
puppetmodulepuppetlabsntpPuppetmoduleforntp
puppetmodulepuppetlabspostgresqlPuppetmoduleforPostgreSQLdatabase
puppetmodulepuppetlabsstdlibPuppetmodulestandardlibrary
puppetmodulepuppetlabsxinetdPuppetmoduleforxinetd
puppetmodulesazmemcachedPuppetmoduleformemcached
rubypuppetlabsspechelperraketasksandspechelperforspectestsonpuppetmodules
rubyrspecpuppetRSpectestsforyourPuppetmanifests
puppetdbterminiTerminiforpuppetdb
puppetdbPuppetLabspuppetdb
puppetlabsreleasepc1ReleasepackagesforthePuppetLabsPC1repository
puppetserverPuppetLabspuppetserver
puppetagentThePuppetAgentpackagecontainsalloftheelementsneededtorunpuppet,includingruby,facter,hieraand
mcollective.
puppetlabsrelease"PackagetoinstallPuppetLabsgpgkeyandaptrepo"
Paraconfirmarainstalaodigite:
puppetagentconfigprintconfdir
.Vejaumexemplodecomandoquedirondeosarquivosde
configuraodoPuppetforaminstalados:
#puppetagentconfigprintconfdir
/etc/puppetlabs/puppet
Parainiciaroservio:
CopyrightLogicus2016
6
#puppetresourceservicepuppetensure=runningenable=true
Notice:/Service[puppet]/ensure:ensurechanged'stopped'to'running'
service{'puppet':
ensure=>'running',
enable=>'true',
}
Vejamosumabrevetabelaexplicativadoqueaconteceuacima:
resource
aopodopuppetusada,nestecasotratasedeumrecurso
service
orecursoaqueopuppetserefere,nestecasooprpriopuppet
ensure
acondiodorecursoqueopuppetquenestecasorunning,ou
seja,rodando
enable
significaqueopuppetdesejaorecursopuppetconfiguradoparaestar
presentenainicializaodosistema
Seasadaacimafoiigualnastrsinstalaes:Ubuntu16.04,CentOS7eDebianJessie,entoainstalaoocorreucomsucesso!Comovoc
podeperceberusamosoprprioPuppetparadizerPuppet,euqueroquevocestejarodando.Quebarato!Antesdeconcluirainstalao
fundamentalqueconfiraoFQDNdasmquinas,comoporexemplo:
#puppetagentconfigprintcertname
centos.logicus.local
CopyrightLogicus2016
7
Seoshostnamesnoestiveremdevidamenteconfiguradosvocterproblemasnofuturo,daestaconferenciafundamental,nopuleestaetapa
deformaalguma.SemoFQDNdevidamenteconfiguradomuitacoisanovaifuncionarevocpodesefrustrar.OPuppetumaferramenta
exigentedadasassuaspossibilidadesdeatuao,entosejaexigentevoctambmcomoseuaprendizado.AgoraquejpossumosoPuppet
instaladovamosdarumaolhadanasuadocumentao.Digite
puppethelp
.Noacheestranhopoisasintaxejustamenteessaaoinvsde
usaronafrentedehelp.Vejaumexemplo:
#puppethelp
Usage:puppet<subcommand>[options]<action>[options]
Availablesubcommands:
agentThepuppetagentdaemon
applyApplyPuppetmanifestslocally
caLocalPuppetCertificateAuthoritymanagement.
catalogCompile,save,view,andconvertcatalogs.
certManagecertificatesandrequests
certificateProvideaccesstotheCAforcertificatemanagement.
certificate_requestManagecertificaterequests.
certificate_revocation_listManagethelistofrevokedcertificates.
configInteractwithPuppet'ssettings.
describeDisplayhelpaboutresourcetypes
deviceManageremotenetworkdevices
docGeneratePuppetreferences
eppInteractdirectlywiththeEPPtemplateparser/renderer.
factsRetrieveandstorefacts.
fileRetrieveandstorefilesinafilebucket
filebucketStoreandretrievefilesinafilebucket
helpDisplayPuppethelp.
inspectSendaninspectionreport
CopyrightLogicus2016
8
keyCreate,save,andremovecertificatekeys.
lookupDatainmoduleslookupfunction
manDisplayPuppetmanualpages.
masterThepuppetmasterdaemon
moduleCreates,installsandsearchesformodulesonthePuppetForge.
nodeViewandmanagenodedefinitions.
parserInteractdirectlywiththeparser.
pluginInteractwiththePuppetpluginsystem.
reportCreate,display,andsubmitreports.
resourceTheresourceabstractionlayershell
resource_typeViewclasses,definedresourcetypes,andnodesfromallmanifests.
statusViewpuppetserverstatus.
See'puppethelp<subcommand><action>'forhelponaspecificsubcommandaction.
See'puppethelp<subcommand>'forhelponaspecificsubcommand.
Puppetv4.5.1
Ouseja,semprequevocforusarumaopo,terumaajudarpidamuitobemformuladapeloPuppet.OutraformadeajudaoPuppetMan,
ondevocpodeusarporexemplo
puppetmanargumento
.Existeaindao
puppetdoc
.Paraverumalistadasdocumentaespresentesno
PuppetDocfaa:
#puppetdoclist
configurationAreferenceforallsettings
functionAllfunctionsavailableintheparser
indirectionIndirectiontypesandtheirterminusclasses
metaparameterAllPuppetmetaparametersandalltheirdetails
providersWhichprovidersarevalidforthismachine
reportAllavailabletransactionreports
typeAllPuppetresourcetypesandalltheirdetails
CopyrightLogicus2016
9
Paravertodasasdocumentaesfaa:
#puppetdocall
Oresultadosermaisde10millinhasdeinformao!OutraferramentaauxiliarnousodoPuppetsoosFatosquesoinformaesdosistema.O
PuppetpossuiumabibliotecaRubymultiplataformafeitapelaPuppetLabsquepermitequeosFatostambmsetornemvariveis.Estaferramenta
sechamaFacter.umprogramalevequereneinformaessobrehardwareesistemaoperacional.Muitotilpararecuperarinformaescomo
IP,MACechavesSSH.ParagerarumarquivocomFatosvocpodefazerumManifestcomestecontedo:
file{"/tmp/fatos_logicus.yaml":
content=>inline_template("<%=scope.to_hash.reject{|k,v|!(k.is_a?(String)&&v.is_a?(String))}.to_yaml%>"),
}
Noentendeunadan?Calma,maisafrentevocversobreManifestos,ouseja,arquivosquecontmcdigodoPuppet,eanasegundaleitura
desteartigoistolheestartotalmenteclaro.VamosverumexemplodohelpdoFacter:
#facterhelp
Synopsis
========
Collectanddisplayfactsaboutthesystem.
Usage
=====
CopyrightLogicus2016
10
facter[options][query][query][...]
Options
=======
colorEnablescoloroutput.
customdirargAdirectorytouseforcustomfacts.
d[debug]Enabledebugoutput.
externaldirargAdirectorytouseforexternalfacts.
h[help]Printthishelpmessage.
j[json]OutputinJSONformat.
showlegacyShowlegacyfactswhenqueryingallfacts.
l[loglevel]arg(=warn)Setlogginglevel.
Supportedlevelsare:none,trace,debug,
info,warn,error,andfatal.
nocolorDisablescoloroutput.
nocustomfactsDisablescustomfacts.
noexternalfactsDisablesexternalfacts.
norubyDisablesloadingRuby,factsrequiringRuby,
andcustomfacts.
p[puppet](Deprecated:use`puppetfacts`instead)Load
thePuppetlibraries,thusallowingFacterto
loadPuppetspecificfacts.
traceEnablebacktracesforcustomfacts.
verboseEnableverbose(info)output.
v[version]Printtheversionandexit.
y[yaml]OutputinYAMLformat.
Description
===========
CopyrightLogicus2016
11
Collectanddisplayfactsaboutthecurrentsystem.Thelibrarybehind
facteriseasytoextend,makingfacteraneasywaytocollectinformation
aboutasystem.
Ifnoqueriesaregiven,thenallfactswillbereturned.
ExampleQueries
===============
facterkernel
facternetworking.ip
facterprocessors.models.0
VejaumexemplodeusodoFacter:
#facter
aio_agent_version=>1.5.1
augeas=>{
version=>"1.4.0"
}
disks=>{
sda=>{
model=>"VBOXHARDDISK",
size=>"8.00GiB",
size_bytes=>8589934592,
vendor=>"ATA"
},
sr0=>{
model=>"CDROM",
size=>"1.00GiB",
CopyrightLogicus2016
12
size_bytes=>1073741312,
vendor=>"VBOX"
}
}
dmi=>{
bios=>{
release_date=>"12/01/2006",
vendor=>"innotekGmbH",
version=>"VirtualBox"
},
board=>{
manufacturer=>"OracleCorporation",
product=>"VirtualBox",
serial_number=>"0"
},
chassis=>{
type=>"Other"
},
manufacturer=>"innotekGmbH",
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"
CopyrightLogicus2016
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.00MiB",
available_bytes=>401600512,
capacity=>"0%",
total=>"383.00MiB",
total_bytes=>401600512,
used=>"0bytes",
used_bytes=>0
},
system=>{
available=>"616.06MiB",
available_bytes=>645984256,
capacity=>"17.46%",
total=>"746.39MiB",
total_bytes=>782643200,
used=>"130.33MiB",
used_bytes=>136658944
}
}
mountpoints=>{
CopyrightLogicus2016
14
/=>{
available=>"6.36GiB",
available_bytes=>6831726592,
capacity=>"13.77%",
device=>"/dev/sda1",
filesystem=>"ext4",
options=>[
"rw",
"relatime",
"errors=remountro",
"data=ordered"
],
size=>"7.38GiB",
size_bytes=>7922466816,
used=>"1.02GiB",
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"
}
],
CopyrightLogicus2016
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"
}
],
CopyrightLogicus2016
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=>"DebianGNU/Linux8.4(jessie)",
id=>"Debian",
release=>{
full=>"8.4",
major=>"8",
minor=>"4"
}
},
family=>"Debian",
CopyrightLogicus2016
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.62GiB",
size_bytes=>8185184256,
uuid=>"58d6492c8aa12297af916e1c24dd68ab"
},
/dev/sda2=>{
size=>"1.00KiB",
size_bytes=>1024
},
/dev/sda5=>{
filesystem=>"swap",
partuuid=>"96522ed205",
size=>"383.00MiB",
size_bytes=>401604608,
uuid=>"74c47bda458235489b4af7215d3ee65a"
}
}
CopyrightLogicus2016
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)i75500UCPU@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=>"SSHFP21...",
sha256=>"SSHFP22..."
},
key=>"..."
},
ecdsa=>{
fingerprints=>{
sha1=>"SSHFP31...",
sha256=>"SSHFP32..."
},
key=>"..."
},
ed25519=>{
fingerprints=>{
sha1=>"SSHFP41...",
CopyrightLogicus2016
19
sha256=>"SSHFP428..."
},
key=>"..."
},
rsa=>{
fingerprints=>{
sha1=>"SSHFP11...",
sha256=>"SSHFP12..."
},
key=>"..."
}
}
system_uptime=>{
days=>0,
hours=>4,
seconds=>14519,
uptime=>"4:01hours"
}
timezone=>BRT
virtual=>virtualbox
VocpodeaindausaroFacterdeformaespecficacomoporexemploparaverouptime:
#factersystem_uptime
{
days=>0,
hours=>1,
seconds=>6315,
uptime=>"1:45hours"
}
CopyrightLogicus2016
20
ParaverinformaesdoRuby:
#facterruby
{
platform=>"x86_64linux",
sitedir=>"/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.1.0",
version=>"2.1.9"
}
Paraverinformaesdosistemaoperacional:
#facteros
{
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,
CopyrightLogicus2016
21
policy_version=>"28"
}
}
Paraverinformaesderede:
#facternetworking
{
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",
CopyrightLogicus2016
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"
}
},
CopyrightLogicus2016
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"
}
AgoraquevocconheceosfatosbomqueconheaosrecursoscomosquaisoPuppettrabalha.RecursosparaoPuppetsocomoblocos
delego.Podemsercombinadosparamodelarumestadoepossuiinmerostiposnativos.RecursossoprogramasemRubyquemanipulam
estados.bomquesaibaquenocasodosRecursossetratadoPuppetessencialmenteemlinhadecomando.OsRecursospodemvariarem
tamanho,complexidadeetempodevida.Porexemplo:Umusuriopodeserumrecurso,umserviopodeserumrecurso,umarquivopodeser
umrecurso,umpacotepodeserumrecurso,umarotinadocronpodeserumrecurso,aexecuodeumcomandopodeserumrecurso.Maisa
frenteveremosorecursonasuaformadeclarativanoPuppetatravsdosmanifestos.Porhoravejaumexemplo:
tipo{titulo:
parametro=>valor,
metaparametro=>valor,
funcao=>valor,
}
ParacomearmosaseaprofundarnosrecursosdoPuppetvejamosohelpdocomandoresource:
CopyrightLogicus2016
24
#puppethelpresource
puppetresource(8)Theresourceabstractionlayershell
========
SYNOPSIS
UsesthePuppetRALtodirectlyinteractwiththesystem.
USAGE
puppetresource[h|help][d|debug][v|verbose][e|edit]
[p|param<parameter>][t|types][y|to_yaml]<type>
[<name>][<attribute>=<value>...]
DESCRIPTION
Thiscommandprovidessimplefacilitiesforconvertingcurrentsystem
stateintoPuppetcode,alongwithsomeabilitytomodifythecurrent
stateusingPuppet'sRAL.
Bydefault,youmustatleastprovideatypetolist,inwhichcase
puppetresourcewilltellyoueverythingitknowsaboutallresourcesof
thattype.Youcanoptionallyspecifyaninstancename,andpuppet
resourcewillonlydescribethatsingleinstance.
Ifgivenatype,aname,andaseriesof<attribute>=<value>pairs,
puppetresourcewillmodifythestateofthespecifiedresource.
Alternately,ifgivenatype,aname,andthe'edit'flag,puppet
resourcewillwriteitsoutputtoafile,openthatfileinaneditor,
CopyrightLogicus2016
25
andthenapplythesavedfileasaPuppettransaction.
OPTIONS
Notethatanysettingthat'svalidintheconfiguration
fileisalsoavalidlongargument.Forexample,'ssldir'isavalid
setting,soyoucanspecify'ssldir<directory>'asan
argument.
Seetheconfigurationfiledocumentationat
https://docs.puppetlabs.com/puppet/latest/reference/configuration.htmlforthe
fulllistofacceptableparameters.Acommentedlistofall
configurationoptionscanalsobegeneratedbyrunningpuppetwith
'genconfig'.
*debug:
Enablefulldebugging.
*edit:
Writetheresultsofthequerytoafile,openthefileinaneditor,
andreadthefilebackinasanexecutablePuppetmanifest.
*help:
Printthishelpmessage.
*param:
Addmoreparameterstobeoutputtedfromqueries.
*types:
Listallavailabletypes.
CopyrightLogicus2016
26
*verbose:
Printextrainformation.
*to_yaml:
Outputfoundresourcesinyamlformat,suitabletousewithHieraandcreate_resources.
EXAMPLE
Thisexampleuses`puppetresource`toreturnaPuppetconfigurationfor
theuser`luke`:
$puppetresourceuserluke
user{'luke':
home=>'/home/luke',
uid=>'100',
ensure=>'present',
comment=>'LukeKanies,,,',
gid=>'1000',
shell=>'/bin/bash',
groups=>['sysadmin','audio','video','puppet']
}
AUTHOR
LukeKanies
COPYRIGHT
Copyright(c)2011PuppetLabs,LLCLicensedundertheApache2.0License
CopyrightLogicus2016
27
Bom,falamosqueumusuriopoderiaserumrecursonomesmo?Paravertodososusurios:
#puppetresourceuser
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',
CopyrightLogicus2016
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=>'*',
CopyrightLogicus2016
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=>'GnatsBugReportingSystem(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',
CopyrightLogicus2016
30
password=>'*',
password_max_age=>'99999',
password_min_age=>'0',
shell=>'/usr/sbin/nologin',
uid=>'39',
}
user{'list':
ensure=>'present',
comment=>'MailingListManager',
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',
CopyrightLogicus2016
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',
CopyrightLogicus2016
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',
CopyrightLogicus2016
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=>'Puppetconfigurationmanagementdaemon,,,',
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',
CopyrightLogicus2016
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',
CopyrightLogicus2016
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=>'systemdBusProxy,,,',
gid=>'105',
home=>'/run/systemd',
password=>'*',
password_max_age=>'99999',
password_min_age=>'0',
shell=>'/bin/false',
uid=>'103',
}
user{'systemdnetwork':
ensure=>'present',
CopyrightLogicus2016
36
comment=>'systemdNetworkManagement,,,',
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=>'systemdResolver,,,',
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=>'systemdTimeSynchronization,,,',
gid=>'102',
home=>'/run/systemd',
password=>'*',
password_max_age=>'99999',
password_min_age=>'0',
shell=>'/bin/false',
uid=>'100',
}
user{'uucp':
CopyrightLogicus2016
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',
}
CopyrightLogicus2016
38
Ok!Maselemostroutodososusurios.Esevocquiserverasinformaesdeapenasumusuriodosistema,porexemplooRoot.Vejao
exemplo:
#puppetresourceuserroot
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',
}
Ouseja,comosedissssemos
puppetmemostreasinformaesdorecursousuriodoroot
.Vamoscriarumusurioevercomoo
Puppetoenxerga.Faamosistoemtrspassos:a)criamosousurio,b)pedimosinformaodeleparaopuppetparaveroseuestado(ensure),
esenha(sehalguma),c)mudamosasenhadousurio,ed)pedimosnovamenteinformaodousurioeverificamosocamporelativoasenha:
#addusergustavo
#puppetresourceusergustavo
user{'gustavo':
ensure
=>'present',
gid
=>'502',
home
=>'/home/gustavo',
password
=>'!!',
password_max_age=>'99999',
CopyrightLogicus2016
39
password_min_age=>'0',
shell
=>'/bin/bash',
uid
=>'502',
}
#passwdgustavo
Mudandosenhaparaousuriogustavo.
Novasenha:
Redigiteanovasenha:
passwd:todosostokensdeautenticaesforamatualizadoscomsucesso.
#puppetresourceusergustavo
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',
}
Comomgica!Ouseja,observequequandocriamosousuriogustavoomesmonopossuasenhaequandorealizamosamudanadesenha
oPuppetjtratoudeconheceressamudana.OresultadodocomandoPuppetResourceentonostrsasinformaesdosrecursosque
desejamos!Ok!MassequisermosqueoprprioPuppetcrieumusurioquenoestpresente,porexemplo,ousurioangela.Vejamosque
esteusurionoexistenosistema:
#puppetresourceuserangela
CopyrightLogicus2016
40
user{'angela':
ensure=>'absent',
}
Usemosentoaopoensure=present:
#puppetresourceuserangelaensure=present
Notice:/User[angela]/ensure:created
user{'angela':
ensure=>'present',
}
Ouseja,primeirosvimosqueousurioangelaestavaabsent,ouseja,noexistianosistema,esteeraoseuensure.Depoisdissemosparao
Puppetcriarousurio.Vamosconfirmar:
#cat/etc/passwd|grepangela
angela:x:1002:1002::/home/angela:
JestimaginandoossuperpoderesqueoPuppetlhefornecernomesmo?Calma,aindatembemmaispraseverDissemostambmque
arquivosediretriospodiamserrecursosnomesmo?!Paraverorecursodeumarquivo,nestecasooarquivo
/etc/hosts
:
#puppetresourcefile/etc/hosts
file{'/etc/hosts':
ensure=>'file',
content=>'{md5}2a4692ead945f435ff7cc9b2e4faf82f',
CopyrightLogicus2016
41
ctime=>'2016060415:28:000300',
group=>'0',
mode=>'0644',
mtime=>'2016060415:28:000300',
owner=>'0',
type=>'file',
}
Olhaquebacana,almdeinformaescomoodono,grupo,tipoeleaindanosdeuomd5doarquivo.Ok!Massepedirmosparaverumdiretrio
quenoexiste?Exemplo:
#puppetresourcefile/home/logicus/backup/configuracao
file{'/home/logicus/backup/configuracao':
ensure=>'absent',
}
Vamoscriarmanualmenteodiretrio:
#mkdirpv/home/logicus/backup/configuracao
mkdir:foicriadoodiretrio'/home/logicus/backup'
mkdir:foicriadoodiretrio'/home/logicus/backup/configuracao'
Vejamosagoraoresultado:
#puppetresourcefile/home/logicus/backup/configuracao
file{'/home/logicus/backup/configuracao':
CopyrightLogicus2016
42
ensure=>'directory',
ctime=>'2016060416:28:100300',
group=>'0',
mode=>'0755',
mtime=>'2016060416:28:100300',
owner=>'0',
type=>'directory',
}
Sevocquisercriarumarquivoabrindoumeditorparamodificaralgovejaoseguinteexemplo.Nelevamosusaraopo
edit
ealterarnoeditor
queabrirapermissopadrodecriaodoarquivo.Vejamos:
#puppetresourcefile/tmp/exemploensure=presentedit
Acrescentealinharelacionadoapermissocomonoexemploabaixo:
file{'/tmp/exemplo':
ensure=>'file',
mode=>'777',
}
Saiasalvandooarquivoevejaoresultado:
Notice:/File[/tmp/exemplo]/ensure:created
Notice:Compiledcatalogforubuntu.logicus.localinenvironmentproductionin0.03seconds
Info:Applyingconfigurationversion'1465069983'
CopyrightLogicus2016
43
Notice:/Stage[main]/Main/File[/tmp/exemplo]/mode:modechanged'0644'to'0777'
Notice:Appliedcatalogin0.03seconds
OPuppetalterouapermissocomoindicamos!Dissemostambmquepacotespodemserumrecurso.Vamostentaracessaroprogramaglances.
#glances
Oprograma'glances'noestinstaladonomomento.
Vejamos:
#puppetresourcepackageglancesensure=present
Notice:/Package[glances]/ensure:created
package{'glances':
ensure=>'2.31build1',
}
Agoratenteacessarnovamenteoglancesepercebaqueelejestarpresenteemseusistema!Pararemoveropacoteapenasmudeaopode
ensuredepresentparaabsent:
#puppetresourcepackageglancesensure=absent
Notice:/Package[glances]/ensure:removed
package{'glances':
ensure=>'absent',
}
CopyrightLogicus2016
44
Sequisernovamenteopacoteenaltimaversodisponvelfaa:
#puppetresourcepackageglancesensure=latest
Vocpodeatmesmoexecutarumcomandousandooresource
exec
.Vamosfazerumteste.PrimeiromudeseueditorpadroparaoNanocom
oseguintecomando:
#updatealternativesseteditor/bin/nano
Digitenoterminal:
#editor
ConfiraserealmenteentrounoNano.Sesim,tudocertoataqui.Agoravamosusaroresource
exec
paraquesejaaplicadoomesmocomando
squemudandooeditorpadroparaovim.Omanifesto(arquivocomextenso.pp)deveficarassim:
#catlogicus.pp
exec{"updatealternativesseteditor/usr/bin/vim.basic":
path=>"/usr/bin:/usr/sbin:/bin",
}
Evamosaplicaromanifesto:
CopyrightLogicus2016
45
#puppetapplylogicus.pp
Notice:Compiledcatalogforubuntu.logicus.localinenvironmentproductionin0.12seconds
Notice:/Stage[main]/Main/Exec[updatealternativesseteditor/usr/bin/vim.basic]/returns:executedsuccessfully
Notice:Appliedcatalogin0.07seconds
Eporfimtenteacessaroeditor:
#editor
Ok!SempercebervoccriouummanifestoemandouoPuppetaplicarenestemanifestousouumrecurso.Maisafrenteiremosexplicarmelhor
sobreoqueummanifesto,porhora,squeramoslevarvocanavegarporoutrasformasdeaplicarrecursos.Voltandoaosrecursos
gostaramosdedizerquemesmoumhostpodeserumrecursoenovamentevamosusarummanifesto,vejamos:
#catlogicus.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':
CopyrightLogicus2016
46
ensure
=>'present',
ip=>'192.168.0.104',
host_aliases=>'debian',
}
NestecasoestamosconsiderandoosipsnainfraaquidaLogicus,vocdevealterarosipsdeacordocomosqueseuDHCPdeuparaoseulaba!
Vamosaplicaromanifesto:
#puppetapplylogicus.pp
Notice:Compiledcatalogforcentos.logicus.localinenvironmentproductionin0.16seconds
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:Appliedcatalogin0.05seconds
Confiraagoraseuarquivo
/etc/hosts
,eledevepossuiroshostsqueadicionamosatravsdoPuppet.Imaginamosquevocdeveestaragora
pensandoemtodasaspossibilidadesdeusodosrecursos.Existeumcomandochamadodescribeusadoparadescobririnformaessobreos
recursos.O
puppetdescribe
umsubcomandoparalistarinformaessobreostiposderecursosatualmenteinstaladosemumadeterminada
mquina.Vejamosseuhelp:
#puppethelpdescribe
puppetdescribe(8)Displayhelpaboutresourcetypes
========
SYNOPSIS
CopyrightLogicus2016
47
PrintshelpaboutPuppetresourcetypes,providers,andmetaparameters.
USAGE
puppetdescribe[h|help][s|short][p|providers][l|list][m|meta]
OPTIONS
*help:
Printthishelptext
*providers:
Describeprovidersindetailforeachtype
*list:
Listalltypes
*meta:
Listallmetaparameters
*short:
Listonlyparameterswithoutdetail
EXAMPLE
$puppetdescribelist
$puppetdescribefileproviders
$puppetdescribeusersm
CopyrightLogicus2016
48
AUTHOR
DavidLutterkort
COPYRIGHT
Copyright(c)2011PuppetLabs,LLCLicensedundertheApache2.0License
Vejamosostiposqueestodisponveis:
#puppetdescribelist
Thesearethetypesknowntopuppet:
augeasApplyachangeoranarrayofchangestothe...
computerComputerobjectmanagementusingDirectorySer...
cronInstallsandmanagescronjobs
execExecutesexternalcommands
fileManagesfiles,includingtheircontent,owner...
filebucketArepositoryforstoringandretrievingfile...
groupManagegroups
hostInstallsandmanageshostentries
interfaceThisrepresentsarouterorswitchinterface
k5loginManagethe`.k5login`fileforauser
macauthorizationManagetheMacOSXauthorizationdatabase
mailalias..nodocumentation..
maillistManageemaillists
mcxMCXobjectmanagementusingDirectoryService...
mountManagesmountedfilesystems,includingputtin...
nagios_commandTheNagiostypecommand
CopyrightLogicus2016
49
nagios_contactTheNagiostypecontact
nagios_contactgroupTheNagiostypecontactgroup
nagios_hostTheNagiostypehost
nagios_hostdependencyTheNagiostypehostdependency
nagios_hostescalationTheNagiostypehostescalation
nagios_hostextinfoTheNagiostypehostextinfo
nagios_hostgroupTheNagiostypehostgroup
nagios_serviceTheNagiostypeservice
nagios_servicedependencyTheNagiostypeservicedependency
nagios_serviceescalationTheNagiostypeserviceescalation
nagios_serviceextinfoTheNagiostypeserviceextinfo
nagios_servicegroupTheNagiostypeservicegroup
nagios_timeperiodTheNagiostypetimeperiod
notify..nodocumentation..
packageManagepackages
resourcesThisisametatypethatcanmanageotherreso...
router..nodocumentation..
scheduleDefineschedulesforPuppet
scheduled_taskInstallsandmanagesWindowsScheduledTasks
selbooleanManagesSELinuxbooleansonsystemswithSELi...
selmoduleManagesloadingandunloadingofSELinuxpoli...
serviceManagerunningservices
ssh_authorized_keyManagesSSHauthorizedkeys
sshkeyInstallsandmanagessshhostkeys
stageAresourcetypeforcreatingnewrunstages
tidyRemoveunwantedfilesbasedonspecificcrite...
userManageusers
vlan..nodocumentation..
whitWhitsareinternalartifactsofPuppet'scurr...
yumrepoTheclientsidedescriptionofayumreposito...
zfsManagezfs
zoneManagesSolariszones
CopyrightLogicus2016
50
zpoolManagezpools
Useaoposparaumalistacurta.Digamosquevocqueiravermaissobreorecursouserporexemplo:
#puppetdescribesuser
user
====
Manageusers.Thistypeismostlybuilttomanagesystem
users,soitislackingsomefeaturesusefulformanagingnormal
users.
Thisresourcetypeusestheprescribednativetoolsforcreating
groupsandgenerallyusesPOSIXAPIsforretrievinginformation
aboutthem.Itdoesnotdirectlymodify`/etc/passwd`oranything.
**Autorequires:**IfPuppetismanagingtheuser'sprimarygroup(as
providedinthe`gid`attribute),theuserresourcewillautorequire
thatgroup.IfPuppetismanaginganyroleaccountscorrespondingtothe
user'sroles,theuserresourcewillautorequirethoseroleaccounts.
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
CopyrightLogicus2016
51
aix,directoryservice,hpuxuseradd,ldap,openbsd,pw,user_role_add,
useradd,windows_adsi
Paralistalongafaaapenasotipo.Digamosquevocqueiravermaissobreorecursomountporexemplo:
#puppetdescribemount
mount
=====
Managesmountedfilesystems,includingputtingmount
informationintothemounttable.Theactualbehaviordepends
onthevalueofthe'ensure'parameter.
**Refresh:**`mount`resourcescanrespondtorefreshevents(via
`notify`,`subscribe`,orthe`~>`arrow).Ifa`mount`receivesanevent
fromanotherresource**and**its`ensure`attributeissetto`mounted`,
Puppetwilltrytounmountthenremountthatfilesystem.
**Autorequires:**IfPuppetismanaginganyparentsofamountresource
thatis,othermountpointshigherupinthefilesystemthechild
mountwillautorequirethem.IfPuppetismanagingthefilepathofa
mountpoint,themountresourcewillautorequireit.
**Autobefores:**IfPuppetismanaginganychildfilepathsofamount
point,themountresourcewillautobeforethem.
Parameters
**atboot**
Whethertomountthemountatboot.Notallplatforms
CopyrightLogicus2016
52
supportthis.
**blockdevice**
Thedevicetofsck.Thisispropertyisonlyvalid
onSolaris,andinmostcaseswilldefaulttothecorrect
value.
**device**
Thedeviceprovidingthemount.Thiscanbewhatever
deviceissupportingbythemount,includingnetwork
devicesordevicesspecifiedbyUUIDratherthandevice
path,dependingontheoperatingsystem.
**dump**
Whethertodumpthemount.Notallplatformsupportthis.
Validvaluesare`1`or`0`(or`2`onFreeBSD).Defaultis`0`.
Valuescanmatch`/(0|1)/`.
**ensure**
Controlwhattodowiththismount.Setthisattributeto
`unmounted`tomakesurethefilesystemisinthefilesystemtable
butnotmounted(ifthefilesystemiscurrentlymounted,itwillbe
unmounted).Setitto`absent`tounmount(ifnecessary)andremove
thefilesystemfromthefstab.Setto`mounted`toaddittothe
fstabandmountit.Setto`present`toaddtofstabbutnotchange
mount/unmountstatus.
Validvaluesare`defined`(alsocalled`present`),`unmounted`,
`absent`,`mounted`.
**fstype**
Themounttype.Validvaluesdependonthe
operatingsystem.Thisisarequiredoption.
CopyrightLogicus2016
53
**name**
Themountpathforthemount.
**options**
Asinglestringcontainingoptionsforthemount,astheywould
appearinfstab.Formanyplatformsthisisacommadelimitedstring.
Consultthefstab(5)manpageforsystemspecificdetails.
**pass**
Thepassinwhichthemountischecked.
**remounts**
Whetherthemountcanberemounted`mountoremount`.If
thisisfalse,thenthefilesystemwillbeunmountedandremounted
manually,whichispronetofailure.
Validvaluesare`true`,`false`.
**target**
Thefileinwhichtostorethemounttable.Onlyusedby
thoseprovidersthatwritetodisk.
Providers
parsed
Seriainteressantetambmobterosmetaparmetrosnomesmo?Nestecasovocdeveusaraopom,comodescritonohelp.Vejamos:
#puppetdescribesmcron
CopyrightLogicus2016
54
cron
====
Installsandmanagescronjobs.EverycronresourcecreatedbyPuppet
requiresacommandandatleastoneperiodicattribute(hour,minute,
month,monthday,weekday,orspecial).Whilethenameofthecronjobis
notpartoftheactualjob,thenameisstoredinacommentbeginningwith
`#PuppetName:`.Thesecommentsareusedtomatchcrontabentriescreated
byPuppetwithcronresources.
Ifanexistingcrontabentryhappenstomatchtheschedulingandcommandof
a
cronresourcethathasneverbeensynched,Puppetwilldefertotheexisting
crontabentryandwillnotcreateanewentrytaggedwiththe`#Puppet
Name:`
comment.
Example:
cron{'logrotate':
command=>'/usr/sbin/logrotate',
user=>'root',
hour=>2,
minute=>0,
}
Notethatallperiodicattributescanbespecifiedasanarrayofvalues:
cron{'logrotate':
command=>'/usr/sbin/logrotate',
user=>'root',
hour=>[2,4],
}
...orusingrangesorthestepsyntax`*/2`(althoughthere'snoguarantee
thatyour`cron`daemonsupportsthese):
cron{'logrotate':
command=>'/usr/sbin/logrotate',
CopyrightLogicus2016
55
user=>'root',
hour=>['24'],
minute=>'*/10',
}
Animportantnote:_theCrontypewillnotresetparametersthatare
removedfromamanifest_.Forexample,removinga`minute=>10`parameter
willnotresettheminutecomponentoftheassociatedcronjobto`*`.
Thesechangesmustbeexpressedbysettingtheparameterto
`minute=>absent`becausePuppetonlymanagesparametersthatareoutof
syncwithmanifestentries.
**Autorequires:**IfPuppetismanagingtheuseraccountspecifiedbythe
`user`propertyofacronresource,thenthecronresourcewillautorequire
thatuser.
Parameters
command,ensure,environment,hour,minute,month,monthday,name,
special,target,user,weekday
MetaParameters
alias,audit,before,consume,export,loglevel,noop,notify,require,
schedule,stage,subscribe,tag
Providers
crontab
CopyrightLogicus2016
56
Todosestesmetaparmetrosseromuitousadosnosmanifestos!Masantesdeverosmanifestosprecisofixarbemalgicadaaplicaodo
manifesto,ouseja,conhecero
apply
,ferramentaquediraoPuppetquedesejamosumadeterminadaconfiguraoderecursos.Vejamoso
help:
#puppethelpapply
puppetapply(8)ApplyPuppetmanifestslocally
========
SYNOPSIS
AppliesastandalonePuppetmanifesttothelocalsystem.
USAGE
puppetapply[h|help][V|version][d|debug][v|verbose]
[e|execute][detailedexitcodes][L|loadclasses]
[l|logdestsyslog|eventlog|<FILE>|console][noop]
[catalog<catalog>][writecatalogsummary]<file>
DESCRIPTION
Thisisthestandalonepuppetexecutiontooluseittoapply
individualmanifests.
Whenprovidedwithamodulepath,viacommandlineorconfigfile,puppet
applycaneffectivelymimicthecatalogthatwouldbeservedbypuppet
masterwithaccesstothesamemodules,althoughtherearesomesubtle
differences.Whencombinedwithschedulingandanautomatedsystemfor
CopyrightLogicus2016
57
pushingmanifests,thiscanbeusedtoimplementaserverlessPuppet
site.
Mostusersshoulduse'puppetagent'and'puppetmaster'forsitewide
manifests.
OPTIONS
Notethatanysettingthat'svalidintheconfiguration
fileisalsoavalidlongargument.Forexample,'tags'isa
validsetting,soyoucanspecify'tags<class>,<tag>'
asanargument.
Seetheconfigurationfiledocumentationat
https://docs.puppetlabs.com/puppet/latest/reference/configuration.htmlforthe
fulllistofacceptableparameters.Acommentedlistofall
configurationoptionscanalsobegeneratedbyrunningpuppetwith
'genconfig'.
*debug:
Enablefulldebugging.
*detailedexitcodes:
Provideextrainformationabouttherunviaexitcodes.Ifenabled,'puppet
apply'willusethefollowingexitcodes:
0:Therunsucceededwithnochangesorfailuresthesystemwasalreadyin
thedesiredstate.
1:Therunfailed.
CopyrightLogicus2016
58
2:Therunsucceeded,andsomeresourceswerechanged.
4:Therunsucceeded,andsomeresourcesfailed.
6:Therunsucceeded,andincludedbothchangesandfailures.
*help:
Printthishelpmessage
*loadclasses:
Loadanystoredclasses.'puppetagent'cachesconfiguredclasses
(usuallyat/etc/puppetlabs/puppet/classes.txt),andsettingthisoptioncauses
allofthoseclassestobesetinyourpuppetmanifest.
*logdest:
Wheretosendlogmessages.Choosebetween'syslog'(thePOSIXsyslog
service),'eventlog'(theWindowsEventLog),'console',orthepathtoalog
file.Defaultsto'console'.
Apathendingwith'.json'willreceivestructuredoutputinJSONformat.The
logfilewillnothaveanending']'automaticallywrittentoitduetothe
appendingnatureoflogging.Itmustbeappendedmanuallytomakethecontent
validJSON.
*noop:
Use'noop'modewherePuppetrunsinanoopordryrunmode.This
isusefulforseeingwhatchangesPuppetwillmakewithoutactually
executingthechanges.
*execute:
ExecuteaspecificpieceofPuppetcode
CopyrightLogicus2016
59
*test:
Enablethemostcommonoptionsusedfortesting.Theseare'verbose',
'detailedexitcodes'and'show_diff'.
*verbose:
Printextrainformation.
*catalog:
ApplyaJSONcatalog(suchasonegeneratedwith'puppetmastercompile').Youcan
eitherspecifyaJSONfileorpipeinJSONfromstandardinput.
*writecatalogsummary
Aftercompilingthecatalogsavestheresourcelistandclasseslisttothenode
inthestatedirectorynamedclasses.txtandresources.txt
EXAMPLE
$puppetapplyl/tmp/manifest.logmanifest.pp
$puppetapplymodulepath=/root/dev/modulese"includentpd::server"
$puppetapplycatalogcatalog.json
AUTHOR
LukeKanies
COPYRIGHT
Copyright(c)2011PuppetLabs,LLCLicensedundertheApache2.0License
Vejamosumexemploumpoucomaiscompletodemanifesto:
CopyrightLogicus2016
60
#catlogicus.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'],
}
Nestearquivofizemosdiversosusosderecursosparacriarumarquivoondedeixamosclarooquequeremoscomrelaoaopostfixnamquina
emquesto.Antesdecontinuarumabrevepausaparaexplicaralgumascoisasnovas.Vejaatabelasimplificadaabaixo:
enable
indicaseosistemadeveestarativadonainicializao,nestecaso
CopyrightLogicus2016
61
true
require
indicaqueprecisooutrorecursocomorequisito,nestecasoopacote
dopostfix
path
indicaumcaminho,nestecasoondedeveestaroarquivode
configuraodopostfix
notify
indicaquedevehaverumanotificao,nestecasoaoserviodo
postfix
Paraaplicarestaconfiguraovamosusaroapply:
#puppetapplylogicus.pp
Notice:Compiledcatalogfordebian.logicus.localinenvironmentproductionin0.67seconds
Notice:/Stage[main]/Main/Package[postfix]/ensure:created
Notice:Appliedcatalogin14.72seconds
Econfira:
#servicepostfixstatus
postfix.serviceLSB:PostfixMailTransportAgent
Loaded:loaded(/etc/init.d/postfix)
DropIn:/run/systemd/generator/postfix.service.d
50postfix$mailtransportagent.conf
Active:active(running)sinceSb2016060419:46:23BRT43sago
CGroup:/system.slice/postfix.service
CopyrightLogicus2016
62
4406/usr/lib/postfix/master
4407pickupltunixuc
4408qmgrltunixu
Jun0419:46:23debian.logicus.localpostfix[4296]:StartingPostfixMailTransportAgent:postfix.
Jun0419:46:23debian.logicus.localpostfix/master[4406]:daemonstartedversion2.11.3,configuration/etc/postfix
Noentendeuaindaalgicadosmanifestos?Agoraquecomearemosaesmiuarosmanifestos,estestaisarquivosdoPuppet...Omanifesto
atuacomoreceitadebolo.Tratasedeumarquivodetextoplanocomextenso.pp.dentrodosmanifestosquevoasdeclaraesde
recursos.Ouseja,ondesedescreveumestadodesejadoparaumrecurso.Paraaplicarummanifestobastaocomando:
puppetapply
meu_manifesto.pp
.Evocjfezistoantes,mesmosementendloainda.Bom,omanifestousadeumalinguagemdeclarativa,umaDSL
DomainSpecificLinguage.ADSLumalinguagemprojetadaparaseracessvelaosadministradoresdesistema.Osmanifestossobaseadosno
arquivodeconfiguraodoNagios.LembresequeDSLnolinguagemdeprogramao!Parafixarentendaqueosrecursossodistribudos
nosmanifestosdaseguinteforma:umtipo,ttuloeatributos.Exemplo:
tipo{'ttulo':
param1=>'valor',
param2=>'valor',
param3=>'valor',
metaparam1=>'valor',
metaparam2=>'valor',
function1=>'valor',
function2=>'valor',
}
Lembrasequebemnoinciodoartigofalamossobreboasprticas?Ento,paraconferirseasintaxedoarquivoppestcorretapodefazer:
CopyrightLogicus2016
63
#puppetparservalidatemanifesto.pp
VocpodeaindarealarasintaxedosarquivoscomextensoppnoVim.Parainstoinstaleopacotevimpuppet:
#aptitudeinstallvimpuppet
Emseguidafaa:
#vimaddonsinstallpuppet
AgoraosmanifestosqueveremosafrenteficarocoloridosnoseuVim!Lembraquetemosnosistemadoisusurios,GustavoeAngela.Confira:
#cat/etc/passwd|grepE'(angela|gustavo)'
angela:x:1002:1002::/home/angela:
gustavo:x:1003:1003::/home/gustavo:
Poisbem!Iremoscriarummanifestoparadizerqueestesusuriosnodevemestarnosistemapoiselesganharamnaloteriaeforammorarno
Caribe.Vejamosomanifesto:
#catlogicus.pp
user{'gustavo':
ensure
=>
'absent',
CopyrightLogicus2016
64
home
=>
shell
=>
}
user{'angela':
ensure=>
home =>
shell =>
}
'/home/gustavo',
'/bin/bash',
'absent',
'/home/angela',
'/bin/bash',
Vamosaplicaromanifesto:
#puppetapplylogicus.pp
Notice:Compiledcatalogforubuntu.logicus.localinenvironmentproductionin0.03seconds
Notice:/Stage[main]/Main/User[gustavo]/ensure:removed
Notice:/Stage[main]/Main/User[angela]/ensure:removed
Notice:Appliedcatalogin0.16seconds
Vamosalteraromanifestoagoracomrelaoapresenadousurioetambmseushell.Vejamos:
#catlogicus.pp
user{'gustavo':
ensure=>
'present',
home =>
'/home/gustavo',
shell =>
'/bin/dash',
}
user{'angela':
CopyrightLogicus2016
65
ensure=>
home =>
shell =>
'present',
'/home/angela',
'/bin/dash',
Apliquemosomanifesto:
#puppetapplylogicus.pp
Notice:Compiledcatalogforubuntu.logicus.localinenvironmentproductionin0.03seconds
Notice:/Stage[main]/Main/User[gustavo]/ensure:created
Notice:/Stage[main]/Main/User[angela]/ensure:created
Notice:Appliedcatalogin0.09seconds
Evamosconferirasmudanas:
#cat/etc/passwd|grepE'(angela|gustavo)'
gustavo:x:1002:1002::/home/gustavo:/bin/dash
angela:x:1003:1003::/home/angela:/bin/dash
InteressanteMasnsvimosqueerapossvelterarquivosediretrioscomorecursos.Vamoscriararquivos!Vejamosomanifesto:
#catlogicus.pp
file{'/tmp/diretorioteste':
path=>'/tmp/diretorioteste',
ensure=>directory,
}
CopyrightLogicus2016
66
file{'arquivoteste':
path =>'/tmp/diretorioteste/arquivoteste',
ensure=>'present',
owner =>angela,
mode =>'0640',
content=>"Eusouumarquivoteste:)",
require=>File['/tmp/diretorioteste'],
}
file{'/tmp/diretorioteste/linkdoarquivoteste':
ensure=>link,
owner =>gustavo,
target=>'/tmp/diretorioteste/arquivoteste',
require=>File['arquivoteste'],
}
Vejamosumatabelaparaentenderoqueaconteceu:
diretrioteste
dissemosparaopuppetquequeramosumdiretriochamado
diretoriotestepresentenodiretrio/tmp
arquivoteste
dissemosparaopuppetquequeriamosumarquivochamado
arquivotestenodiretorioteste,einclusiveindicamosqueacriao
dodiretriotestepresentenomanifestoerarequisito.Dissemosainda
queousuriodonodoarquivodeveriaserousurioangela,queo
contedodoarquivodeveriaserEusouumarquivoteste:)equea
permissodoarquivodeveriaser640
CopyrightLogicus2016
67
linkparaoarquivoteste
dissemosparaopuppetquedentrodomesmodiretriotestedeveria
haverumlinkparaoarquivotesteequeodonodolinkdeveriasero
usuriogustavo
Entendidoistovamosaplicaromanifesto:
#puppetapplylogicus.pp
Notice:Compiledcatalogforubuntu.logicus.localinenvironmentproductionin0.03seconds
Notice:/Stage[main]/Main/File[/tmp/diretorioteste]/ensure:created
Notice:/Stage[main]/Main/File[arquivoteste]/ensure:definedcontentas'{md5}c7e3ada978865414be69897879bd57ea'
Notice:/Stage[main]/Main/File[/tmp/diretorioteste/linkdoarquivoteste]/ensure:created
Notice:Appliedcatalogin0.05seconds
Confira:
#lsl/tmp/diretorioteste/
total4
rwr1angelaroot26Jun421:17arquivoteste
lrwxrwxrwx1gustavoroot34Jun421:19linkdoarquivoteste>/tmp/diretorioteste/arquivoteste
Paraapagarestesarquivos:
#puppetresourcefile'/tmp/diretorioteste'recurse=truepurge=true
Notice:/File[/tmp/diretorioteste/arquivoteste]/ensure:removed
Notice:/File[/tmp/diretorioteste/linkdoarquivoteste]/ensure:removed
CopyrightLogicus2016
68
file{'/tmp/diretorioteste':
ensure=>'directory',
}
Confira:
#lsl/tmp/diretorioteste/
total0
Imaginemosagoraquevocprecisedediversospacotesrelativosarede,compressoeoutros,eistoocorrercadavezquevocprecisar
configurarumanovamquinadeumlaboratriodetreinamentoporexemplo,comojocorreuconosco.Vejaumexemploabaixo:
#catlogicus.pp
package{'tzdata':
ensure=>'latest',
}
package{'screen':
ensure=>'present',
}
package{'lynx':
ensure=>'present',
}
package{'elinks':
ensure=>'present',
}
CopyrightLogicus2016
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',
}
CopyrightLogicus2016
70
package{'iptraf':
ensure=>'present',
}
package{'htop':
ensure=>'present',
}
package{'dnsutils':
ensure=>'present',
}
package{'nmap':
ensure=>'present',
}
package{'vim':
ensure=>'present',
}
Vamosaplicaromanifesto:
#puppetapplylogicus.pp
Notice:Compiledcatalogforubuntu.logicus.localinenvironmentproductionin0.47seconds
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
CopyrightLogicus2016
71
Notice:/Stage[main]/Main/Package[nmap]/ensure:created
Notice:Appliedcatalogin33.29seconds
Poucospacotesjestavampresentesenoprecisaramserinstalados,masoutrosforam.Vejaqueotempototalfoide33segundos.Ouseja,o
ganhodevelocidadenapadronizaodeambientecomoPuppetenorme!Valedestacarquevocpodeusarvariveisnoseguinteformato:
$VARIAVEL=VALOR
.Vejaumexemplo:
#catlogicus.pp
$mensagem="ALogicustecnologiainvestemuitoemdocumentaoparaquevocaprendamais"
notify{"$mensagem":}
#puppetapplylogicus.pp
Notice:Compiledcatalogforubuntu.logicus.localinenvironmentproductionin0.03seconds
Notice:ALogicustecnologiainvestemuitoemdocumentaoparaquevocaprendamais
Notice:/Stage[main]/Main/Notify[ALogicustecnologiainvestemuitoemdocumentaoparaquevocaprendamais]/message:defined
'message'as'ALogicustecnologiainvestemuitoemdocumentaoparaquevocaprendamais'
Notice:Appliedcatalogin0.03seconds
Vocpodeusaraindavariveisdofacter,comandovistoanteriormente.Exemplo:
#catlogicus.pp
$frase="Ol,eusouumsistemadafamlia${::osfamily}eestounoarh${::uptime}"
notify{'info':
message=>$frase,
}
file{'/root/mensagem.txt':
CopyrightLogicus2016
72
ensure=>file,
content=>$frase,
}
Vamosaplicar:
#puppetapplylogicus.pp
Notice:Compiledcatalogforubuntu.logicus.localinenvironmentproductionin0.03seconds
Notice:Ol,eusouumsistemadafamliaDebianeestounoarh5:00hours
Notice:/Stage[main]/Main/Notify[info]/message:defined'message'as'Ol,eusouumsistemadafamliaDebianeestounoarh5:00
hours'
Notice:/Stage[main]/Main/File[/root/mensagem.txt]/ensure:definedcontentas'{md5}0786297b1549c91c1808600d6ec428f3'
Notice:Appliedcatalogin0.04seconds
Lembrandoqueexistemdiversasvariveisinteressantesdofacterparaseusarcomo$fqdn,$ipaddress_eth0,$kernelversion,eoutras.Muitas
dessasopessoextremamenteteis.Vocpodeusartambmcondicionaiscomoif,elsifeelsenoseguinteesquemalgico:
ifcondio{
blocodecdigo
}
elsifcondio{
blocodecdigo
}
else{
blocodecdigo
}
CopyrightLogicus2016
73
Vocpodeusartambmocasecomorecursointeressanteparadescobrirosistemaoperacionalporexemplo.Resultado:definiodepacotes,
nomedearquivos,enfim,oqueforespecficodedeterminadosistema.Sualgicatrabalhadaseguinteforma:
case$variavel{
valor1:{cdigo}
valor2:{cdigo}
default:{cdigo}
}
Exemplo:
case$operatingsystem{
CentOS,Redhat:{$apache=httpd}
Debian,Ubuntu:{$apache=apache2}
Default:{fail(Alerta:estesistemanofoireconhecido)}
PercebaasimilaridadecomaprogramaoemShell.FicafcilparaadministradoresdesistemasLinux.Vejamosummanifestoqueilustrauma
situaorelativa:
#catlogicus.pp
case$::operatingsystem{
'CentOS':{$apache_pkg='httpd'}
'Redhat':{$apache_pkg='httpd'}
'Debian':{$apache_pkg='apache2'}
'Ubuntu':{$apache_pkg='apache2'}
CopyrightLogicus2016
74
default:{fail
fail("sistemaoperacionalnoreconhecidoparaoservidorweb")}
}
file{'/root/case.txt':
ensure=>present,
content=>"Onomedopacotedoapache:${apache_pkg}\n"
}
RodeestemanifestonoDebianenoCentOSepercebaque
ocontedodoarquivoqueeleirgerar
,nocasoo
case.txt
,serdiferentenosdois
casos.Vocpodeusaraindamltiplosvalores.Porexemplo:
case$operatingsystem{
/Debian|Ubuntu/:{cdigo}
}
Vejamosagoraumexemplodemanifestorelativoaocron:
#catlogicus.pp
cron{'cronupdatedb':
ensure=>'present',
user=>root,
command=>'/usr/bin/updatedb',
minute=>00,
hour=>12,
}
cron{'update':
ensure=>'present',
CopyrightLogicus2016
75
user=>root,
command=>'/usr/bin/aptitudeupdate',
minute=>05,
hour=>12,
}
cron{'upgrade':
ensure=>'present',
user=>root,
command=>'/usr/bin/aptitudeupgradey',
minute=>10,
hour=>12,
}
cron{'backup':
ensure=>'present',
user=>root,
command=>'/bin/tarzcf/var/backups/home.tgz/home/',
minute=>15,
hour=>12,
}
Vamosusarnovamenteorecursodetabelaparaexplicaroqueaconteceu:
cronupdatedb
dissemosparaocronquediariamentes12:00queremosqueelerode
ocomandoupdatedb
update
dissemosparaocronquediariamentes12:05elerodeocomando
aptitudeupdate
CopyrightLogicus2016
76
upgrade
dissemosparaocronquediariamentes12:10elerodeocomando
aptitudeupgradey
backup
dissemosparaocronquediariamentes12:15elefaaumbackup
comocomandotardodiretrio/homeeguardenodiretrio
/var/backup
Aplicandoomanifesto:
#puppetapplylogicus.pp
Notice:Compiledcatalogforubuntu.logicus.localinenvironmentproductionin0.15seconds
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:Appliedcatalogin0.10seconds
VamosverificarnoCron:
#crontabl
#HEADER:Thisfilewasautogeneratedat2016060512:14:290300bypuppet.
#HEADER:Whileitcanstillbemanagedmanually,itisdefinitelynotrecommended.
#HEADER:Noteparticularlythatthecommentsstartingwith'PuppetName'should
#HEADER:notbedeleted,asdoingsocouldcauseduplicatecronjobs.
#PuppetName:cronupdatedb
012***/usr/bin/updatedb
#PuppetName:update
CopyrightLogicus2016
77
512***/usr/bin/aptitudeupdate
#PuppetName:upgrade
1012***/usr/bin/aptitudeupgradey
#PuppetName:backup
1512***/bin/tarzcf/var/backups/home.tgz/home/
Comrelaoaosmanifestosaindabomsaberquepossveltrabalharcomclasses.Elaspermitemreaproveitamentodecdigo.Podemos
chamaraindadecoleesderecursos.
Nosoaplicadasanoserquesejamrequisitadas
.Aclassedeveterumnomeescritoemminsculo
etambmumblocodecdigo.Exemplo:
classnome{
blocodecdigo
}
Eparachamladeveestarnomanifesto:
class{nome:}
Vocpodetambmchamarumaclassedentrodeoutra.Exemplo:
classlogicus{
classtreinamentos{
blocodecdigo
}
}
CopyrightLogicus2016
78
Paradeclararestaclassecitadafaacomonoexemplo:
class{logicus::treinamentos:}
Nasequnciavamosfalardemdulosevocencontrardiversasclassesnosmdulospoisasuadinmicaexige.Podemosresumirosmdulos
comoconjuntosdecdigos.VocpodeescreverelesoubaixarmdulosprconstrudosdorepositriodaPuppetLabs.Aestruturadeummdulo
basicamenteseresumedaseguinteforma:
manifests
nestediretrioencontramososmanifests,inclusiveoinit.ppque
obrigatrio
files
nestediretrioencontramososarquivosquesoreferenciadospelo
mdulo
templates
nestediretrioencontramosostemplatesusadospelomdulo
lib
nestediretrioencontramosplugins
spec
nestediretrioencontramostestesdeespecificaoparaosplugins
presentesemlib
tests
nestediretrioencontramosumambientedeteste
Mascomoescolherummdulo?Procuresaberseomdulojfoirecomendadoporalgum,principalmenteatravsdalistadediscussooupelo
irc.Procuresaberseomduloestdeacordocomosistemaeversoquevocestutilizando.Pensetambmnoversionamentodomduloe
CopyrightLogicus2016
79
eviteusarmdulosquenoestejamnaverso1.0.0.,emboramuitasvezesnosejapossvel.Mascomousarosmdulos?Existeumcomando
chamado
puppetmodule
.Comecemospeloseuhelp:
#puppethelpmodule
USAGE:puppetmodule<action>[environmentproduction][modulepath]
Thissubcommandcanfind,install,andmanagemodulesfromthePuppetForge,
arepositoryofusercontributedPuppetcode.Itcanalsogenerateempty
modules,andpreparelocallydevelopedmodulesforreleaseontheForge.
OPTIONS:
renderasFORMATTherenderingformattouse.
verboseWhethertologverbosely.
debugWhethertologdebuginformation.
environmentproductionTheenvironmentPuppetisrunningin.For
clients(e.g.,`puppetagent`)this
determinestheenvironmentitself,whichis
usedtofindmodulesandmuchmore.For
servers(i.e.,`puppetmaster`)thisprovides
thedefaultenvironmentfornodesweknow
nothingabout.
modulepathThesearchpathformodules,asalistof
directoriesseparatedbythesystempath
separatorcharacter.(ThePOSIXpath
separatoris':',andtheWindowspath
separatoris''.)Settingaglobalvaluefor
`modulepath`inpuppet.confisnotallowed
(butitcanbeoverriddenfromthe
commandline).Pleaseusedirectory
environmentsinstead.Ifyouneedtouse
CopyrightLogicus2016
80
somethingotherthanthedefaultmodulepath
of`<ACTIVEENVIRONMENT'SMODULES
DIR>:$basemodulepath`,youcanset
`modulepath`inenvironment.conf.Formore
info,see
<https://docs.puppet.com/puppet/latest/reference/environments.html>
ACTIONS:
buildBuildamodulereleasepackage.
changesShowmodifiedfilesofaninstalledmodule.
generateGenerateboilerplateforanewmodule.
installInstallamodulefromthePuppetForgeorareleasearchive.
listListinstalledmodules
searchSearchthePuppetForgeforamodule.
uninstallUninstallapuppetmodule.
upgradeUpgradeapuppetmodule.
See'puppetmanmodule'or'manpuppetmodule'forfullhelp.
Paralistarosseusmdulosdigite
puppetmodulelist
.Exemplo:
#puppetmodulelist
/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)
CopyrightLogicus2016
81
Ecasovocnopossuamdulos:
#puppetmodulelist
/etc/puppet/modules(nomodulesinstalled)
Parapesquisardigite:
puppetmodulesearchnome
.Vejaumexemplo:
#puppetmodulesearchdocker
Notice:Searchinghttps://forgeapi.puppetlabs.com...
NAMEDESCRIPTIONAUTHORKEYWORDS
garethrdockerModuleforinstallingandmanagingdocker@garethrlxcredhat
centosdocker
tsurudockerPuppetmoduletoDocker@tsurutsurudocker
tsurupaas
jgreatdockerManagedockercontainersnativelywitha'docker'Servi...@jgreat
ChrisTheSharkdockerPuppetmoduletoinstallDockeronCentosorUbuntuLin...@ChrisTheShark
ffollonierdockerApuppetmodulethatmanagethedockerenginedaemonco...@ffollonierdocker
jmangtdockerInstallsDocker@jmangt
cristifalcasdockerModuleforinstallingandmanagingdocker@cristifalcasdocker
RHsysengdockersetupdockeronahost@RHsyseng
noppdockerSimpledockermodule@nopp
akegatadockerHandledockercontainersasservicesinRHEL.@akegata
garystafforddocker_machineDownloadsandinstallsDockerMachine@garystafforddockermachine
machinedocker
garystafforddocker_composeDownloadsandinstallsDockerCompose@garystafforddockercompose
composedocker
scottycdocker_swarmAmoduleforDockerSwarm@scottycswarmdocker
narasimhasvdockerInstalldocker@narasimhasv
CopyrightLogicus2016
82
ajsmithdocker_systemdConfiguresystemdservicestorunDockercontainers.@ajsmithsystemddocker
cristifalcasdocker_registryinstallsandconfiguresdockerregistry@cristifalcasdockerregistry
puppetlabsdocker_platformInstalls,configures,andmanagestheDockerdaemonand...@puppetlabs
puppetlabsdocker_ucpInstalls,configures,andmanagestheDockerUniversal...@puppetlabs
praekeltfoundationdocker_firewallSimplifiesmanagementofiptablesruleswhenrunningDo...@praekeltfoundation
markbdocker_registryUNKNOWN@markb
garystaffordfigDownloadsandinstallsFig(http://www.fig.sh)@garystaffordcontainer
dockerfig
cristifalcasflannelflannelisavirtualnetworkthatgivesasubnettoeac...@cristifalcasdockerflannel
cjtoolseramdroneDroneCImodule@cjtoolseramcontinuous
dockercidrone
nickrancherDeployRancher,acontainerorchestrationtool@nickcontainers
dockerrancher
pennycodersmarathonMesosphereMarathoninstallation/managementmodule@pennycodersclouddocker
apachemesos
pennycodersmesosApachemesosinstallation/managementmodule@pennycodersclouddocker
apachemesos
tayzlorweaveModuleforinstallingandconfiguringWeaveforDocker@tayzlorweavedocker
prozetaportauthorityPuppetmoduletobootstrapPortAuthority@prozetaetcdpaas
docker
meltwatermarathonPuppetModuleforMesosMarathon@meltwaterdockermarathon
mesos
stfalconsphinxsearchdockerAmoduleforrunningsphinxindockercontainers@stfalconsphinxdocker
cristifalcaskubernetesConfiguringandinstallingkubernetes@cristifalcaskubectlkubelet
docker
tsurutsuruPuppetmoduletoTsuruPaaS@tsurudockerpaas
cethygaudiModuleforinstallinggaudifromrepositoryongaudi.io...@cethygaudidocker
ajsmithgrafanaGrafanainstanceconfigurationusingDocker.@ajsmithsystemddocker
grafana
ajsmithgraphiteGraphiteserverconfigurationusingDocker.@ajsmithsystemddocker
graphite
CopyrightLogicus2016
83
ajsmithriemannRiemannserverconfiguration.@ajsmithsystemddocker
riemann
momermaestrongModuletosetupabaremetalboxforDocker&Maestrong@momerdockermaestro
fundamentalqueconheaosmduloscriadospelaprpriaPuppetLabs.Veja:
#puppetmodulesearchpuppetlabs
Notice:Searchinghttps://forgeapi.puppetlabs.com...
NAMEDESCRIPTIONAUTHORKEYWORDS
stahnmapuppetlabs_yumSetupthePuppetLabsYumpackagerepo@stahnmacentosrhel
puppetlabsyum
ploperationspuppetlabs_aptInstallsthePuppetLabscommunityaptrepository@ploperationspuppetlabsapt
mmitchellpuppetlabs_ntpUNKNOWN@mmitchell
mmitchellpuppetlabs_ironicPuppetmoduleforOpenStackIronic@mmitchell
puppetlabsstdlibStandardlibraryofresourcesforPuppetmodules.@puppetlabspuppetlabs
stdlibstages
puppetlabscloud_provisionerPuppetCloudProvisioner@puppetlabspuppetlabscloud
ec2aws
puppetlabsjavaInstallsthecorrectJavapackageonvariousplatforms.@puppetlabsjavapuppetlabs
stdlibjdkjre
puppetlabspowershellAddsanewexecproviderforexecutingPowerShellcommands.@puppetlabsexecpowershell
windows
puppetlabsaclThismoduleprovidestheabilitytomanageACLsonnodes@puppetlabsmicrosoftace
acl
puppetlabswsus_clientManageWSUS(WindowsServerUpdateService)settingsforcl...@puppetlabs
puppetlabsdscPowerShellDesiredStateConfiguration(DSC)@puppetlabsdscpowershell
puppetlabswindowsCollectionofPuppetmodulesformanagingMicrosoftWindows.@puppetlabs
puppetlabsdocker_platformInstalls,configures,andmanagestheDockerdaemonandDoc...@puppetlabs
puppetlabslogentriesAmoduletoinstallthelogentriesagent.@puppetlabslogentries
logging
CopyrightLogicus2016
84
puppetlabshoconResourcetypesformanagingsettingsinHOCONfiles@puppetlabs
puppetlabsazureCreateandmanagemachinesrunningonMicrosoftAzurewith...@puppetlabsazurelinux
windowscloud
puppetlabspolicy_engineAmoduleformanagingpolicytestsasstructuredfacts@puppetlabscompliance
securitypolicy
puppetlabscatalog_previewModuleprovidingcatalogpreviewandmigrationfeatures@puppetlabsdeltadiff
catalogpreview
puppetlabsmount_isoMountISOimagesandensurethedrivelettertheyaremount...@puppetlabspowershelliso
imagemount
puppetlabspackage_updatesAmoduleformonitoringforpackageupdates@puppetlabspackagesupdates
patch
puppetlabsdocker_ucpInstalls,configures,andmanagestheDockerUniversalCont...@puppetlabs
puppetlabsibm_installation_managerManagesIBMInstallationManagerandIBMpackages@puppetlabsiimimclwas
websphereibm
puppetlabsapkManagepackagesonAlpineLinuxusingtheAPKpackagemanager@puppetlabs
puppetlabschocolateyChocolateypackageproviderforPuppet@puppetlabspackagedotnet
netmicrosoft
puppetlabsntpInstalls,configures,andmanagestheNTPservice.@puppetlabsntptimeaix
rhelcentosntpd
puppetlabsregistryThismoduleprovidesanativetypeandprovidertomanagek...@puppetlabswindowstype
registrywin32
puppetlabsinifileResourcetypesformanagingsettingsinINIfiles@puppetlabsinifileini
settingsfile
puppetlabsrancherInstallsRancherServerandAgents@puppetlabs
puppetlabsjava_ksManagearbitraryJavakeystorefiles@puppetlabsjavassl
keystorecerts
puppetlabstagmailThismoduleprovidesareportprocessorthatsendseventst...@puppetlabs
puppetlabsnetscalerEnablesPuppetconfigurationofCitrixNetScalerdevicesth...@puppetlabsloadbalancer
networknetscaler
puppetlabslvmProvidesPuppettypesandproviderstomanageLogicalResou...@puppetlabslvmhddvolume
storage
puppetlabsxinetdConfiguresxinetdandexposesthexinetd::servicedefinitio...@puppetlabsxinetdcentos
CopyrightLogicus2016
85
rheldebian
puppetlabsrktInstalls,configures,andmanagestherktcontainerruntime.@puppetlabs
puppetlabsaptProvidesaninterfaceformanagingAptsource,key,anddef...@puppetlabsaptdebian
ubuntudpkgppa
puppetlabsconcatConstructfilesfrommultiplefragments.@puppetlabsconcatfiles
fragments
puppetlabsrebootAddsatypeandproviderformanagingsystemreboots.@puppetlabswindowsreboot
puppetlabsrubyManagesRubyandRubygems.@puppetlabsruby
puppetlabspostgresqlOfferssupportforbasicmanagementofPostgreSQLdatabases.@puppetlabsrhelubuntu
debianpgsql
puppetlabsvcsrepoPuppetmoduleprovidingatypetomanagerepositoriesfrom...@puppetlabscvsvcsreposvn
githgbzr
puppetlabshaproxyConfiguresHAProxyserversandmanagestheconfigurationof...@puppetlabsproxyhaproxylb
loadbalancer
puppetlabsstringsPuppetdocumentationviaYARD@puppetlabsdocsdevpuppet
yardocyard
puppetlabsnetdev_stdlibTypedefinitionsforNetworkingDevice(NetDev)StandardLi...@puppetlabs
puppetlabsnetappManagesresourcesonNetAppClusterDataONTAPdevices.@puppetlabs
puppetlabsciscopuppetCiscoPuppetprovidersandtypesforNXOSdevices@puppetlabsnetworknxos
nxoscisco
puppetlabspe_gemAddsproviderforthePuppetEnterpriseRubygemmanager.@puppetlabspegem
puppetlabscorosyncThismoduleisasetofmanifestsandtypes/providersforq...@puppetlabsdebianha
heartbeatpacemaker
puppetlabspe_puppetserver_gemPuppetLabsPEPuppetserverGemModule@puppetlabs
puppetlabsmysqlInstalls,configures,andmanagestheMySQLservice.@puppetlabsmysqlcentos
rhelubuntu
puppetlabsaccountsAccountmanagementmodule.@puppetlabs
puppetlabsfirewallManagesFirewallssuchasiptables@puppetlabsredhatcentos
debianubuntu
puppetlabsgitModuleforinstallingGitorGitosis.@puppetlabs
puppetlabstftpInstallsandmanagesTFTPserviceandconfiguration.@puppetlabsdebianubuntu
tftpcentosrhel
CopyrightLogicus2016
86
puppetlabspassengerConfiguresandmanagesPassenger.@puppetlabsapachepassenger
railsrack
puppetlabsgce_computeNativetypesformanagingGoogleCloudPlatforminfrastruct...@puppetlabsdevicecompute
googlegce
puppetlabsrabbitmqInstalls,configures,andmanagesRabbitMQ.@puppetlabsamqpstompqueue
centosrhel
puppetlabspuppetdbInstallsPostgreSQLandPuppetDB,setsuptheconnectionto...@puppetlabspuppetpuppetdb
storeconfig
puppetlabsmotdAsimplemoduletodemonstratemanaging/etc/motdorWindow...@puppetlabstesting
puppetlabslib_puppetPuppetLabslib_puppetmodule@puppetlabspuppet
puppetlabsappdirectorPuppetAppDirector@puppetlabsvmware
puppetlabskwalifyAsetofkwalifyrelatedfunctionsforpuppet.@puppetlabsvalidation
kwalify
puppetlabsapacheInstalls,configures,andmanagesApachevirtualhosts,web...@puppetlabswebhttpdrhel
sslwsgiproxy
puppetlabsmssqlPuppetLabsMicrosoftSQLServerModule@puppetlabsdatabasewindows
mssqlsql2008
puppetlabsmongodbInstallsMongoDBonRHEL/Ubuntu/Debian.@puppetlabsnosqlcluster
mongomongodb
puppetlabsdenyhostsConfigureDenyHosts@puppetlabssecurity
denyhosts
puppetlabsnode_openstackCloudProvisionersupportforOpenStack@puppetlabsopenstacknova
vm
puppetlabsvcli_rsyslogPuppetEnterprisemoduleforsaz/rsyslog@puppetlabsvclirsyslog
puppetlabslimitsDefinedresourcetypeformanaging/etc/security/limits@puppetlabs
puppetlabsawsThismoduleprovidestheabilitytomanageAWSresources@puppetlabs
puppetlabstransitionTransitionstateresourcetype@puppetlabstransition
catalog
puppetlabscloudformationModuletodeployCloudformationFace@puppetlabspuppetec2
amazonpecfn
puppetlabsawsdemo_profilesPuppetmoduletomanage"profiles"andhigherlevelabstrac...@puppetlabsawsdemo
puppetlabstomcatInstalls,deploys,andconfiguresApacheTomcatwebservices.@puppetlabstomcat
CopyrightLogicus2016
87
puppetlabsdhcpManagetheISCdhcpdaemon@puppetlabsdhcp
puppetlabssqliteManageasqliteinstallationanddatabases@puppetlabsdatabasesqlite
puppetlabspuppet_authorizationModuletomanageauth.conf.@puppetlabs
puppetlabspe_upgradeAutomatedupgradesofPE@puppetlabsenterprise
upgradepuppet
puppetlabsdismProvidesaDISMpuppetresourcetypeonWindows.@puppetlabswindowsdism
puppetlabsvcentervcenterpuppetmodule@puppetlabswindowsvmware
vcentervsphere
puppetlabsrsyncManagesrsyncclients,repositories,andservers,&providi...@puppetlabsrsync
puppetlabsmount_providersProvidesthemounttabandmountpointresourcetypes.@puppetlabssolarislinux
mountmounttab
puppetlabsopenstackInstall,configure,andmanageafullinstallationofOpenS...@puppetlabsicehousecloud
openstack
puppetlabspuppet_agentUpgradesPuppet3.8andAllInOnePuppetAgents@puppetlabs
puppetlabsboundaryBoundarymetermodule@puppetlabsnetworkboundary
bprobeprobe
puppetlabssplunkManageanddeploySplunkserversandforwarders@puppetlabssplunk
puppetlabsmrepoConfiguresandmanagesmrepomirrors@puppetlabsrpmyummrepo
mirror
puppetlabsazure_agentTheAzuremoduleinstallsandconfigurestheWindowsAzure...@puppetlabs
puppetlabsnodejsInstallNode.jspackageandnpmpackageprovider.@puppetlabsdebiannodejs
ubuntunpm
puppetlabsactivemqInstallsandconfiguresActiveMQ.@puppetlabsjavaamqpstomp
stdlib
puppetlabsstunnelAmoduleforcreatingsecuretunnels@puppetlabsdebianssl
securitytunneltls
puppetlabsopennebulaOpenNebulaModule@puppetlabscloudopennebula
puppetlabspuppetserver_gemPuppetLabsPuppetserverGemModule@puppetlabs
puppetlabsgccModuleforinstallinggccbuildutils@puppetlabsgcccompiler
puppetlabsmcollectiveInstalls,configures,andmanagesMCollectiveagents,clien...@puppetlabsclientamqp
stompserver
puppetlabsdashboardPuppetmoduleforthePuppetDashboard@puppetlabspuppetdashboard
CopyrightLogicus2016
88
consoleface
puppetlabsnode_gcePuppetGoogleComputeModule@puppetlabsnodegcecloud
google
puppetlabsbaculaThismodulemanagesabaculainfrastructure@puppetlabsbackupbacula
puppetlabsdrbdDRBDmodule@puppetlabshadrbdfailover
puppetlabswin_desktop_shortcutManagesashortcutonaWindowsdesktopforallusers@puppetlabswindowsdesktop
shortcut
puppetlabsrazorRazorpuppetmodule@puppetlabsrazorubuntu
puppetlabsnginxPuppetNGINXmanagementmodule@puppetlabshttpwebproxy
nginxhttps
puppetlabspuppet_hipchatDeplyandmanagethePuppetHipChataddonapplication@puppetlabschatopshipchat
pltrainingkickstandModuletoassistintheprovisioninglabfortheAdvancedP...@pltrainingpuppetlabs
trainingadvanced
pltraininguserprefsSimpleuseruserprefsmanagement@pltrainingpuppetlabs
training
Parainstalarummduloesuasdependnciasdigite:
puppetmoduleinstallnome
.Exemplo:
#puppetmoduleinstallpuppetlabsfirewall
Notice:Preparingtoinstallinto/etc/puppet/modules...
Notice:Downloadingfromhttps://forgeapi.puppetlabs.com...
Notice:Installingdonotinterrupt...
/etc/puppet/modules
puppetlabsfirewall(v1.8.0)
Umcomentriodepassagemsobreainstalaesdemdulososeguinte:paraignorarasdependnciasuse
ignoredependencies
.Exemplo:
puppetmoduleinstallasteriskignoredependencies
.Paradefinirumaverso:
version
.Exemplo:
puppetmoduleinstallasterisk
version
.VamosinstalaromodulodaPuppetlabspara
motd
.Faa:
CopyrightLogicus2016
89
#puppetmoduleinstallpuppetlabsmotd
Notice:Preparingtoinstallinto/etc/puppetlabs/code/environments/production/modules...
Notice:Downloadingfromhttps://forgeapi.puppetlabs.com...
Notice:Installingdonotinterrupt...
/etc/puppetlabs/code/environments/production/modules
puppetlabsmotd(v1.4.0)
puppetlabsregistry(v1.1.3)
puppetlabsstdlib(v4.12.0)
Vamosaplicaromdulo:
#puppetapplye"includemotd"
Notice:Compiledcatalogforcentos.logicus.localinenvironmentproductionin0.36seconds
Notice:/Stage[main]/Motd/File[/etc/motd]/content:contentchanged'{md5}d41d8cd98f00b204e9800998ecf8427e'to
'{md5}e44d7cea8fa84d927015444592b74830'
Notice:Appliedcatalogin0.03seconds
Agorafaaumacessoviasshdeoutramquinaparatestaronovomotd:
~$sshroot@192.168.0.106
Theauthenticityofhost'192.168.0.106(192.168.0.106)'can'tbeestablished.
ECDSAkeyfingerprintise3:37:9c:bd:4a:2e:31:cb:f8:ae:d6:fe:40:f7:a2:b1.
Areyousureyouwanttocontinueconnecting(yes/no)?yes
Warning:Permanentlyadded'192.168.0.106'(ECDSA)tothelistofknownhosts.
root@192.168.0.106'spassword:
Lastlogin:MonJun611:19:362016fromcentos.logicus.local
CopyrightLogicus2016
90
TheoperatingsystemisCentOS
Thefreememoryis768.45MiB
Thedomainislogicus.local
Ouseja,astrsltimaslinhasqueindicamosistemaoperacional,amemriaeodomnioforamadicionadasaoarquivomotdpelomdulo
instalado.Paradesinstalardigite:
puppetmoduleuninstallnome
.Exemplo:
#puppetmoduleuninstallproxy
Notice:Preparingtouninstall'proxy'...
Removed'proxy'from/opt/puppetlabs/puppet/modules
Masvocnotemomduloproxycerto?MastemoFirewall.DesinstalecomoprticaomdulodeFirewalletentepensarnoporqunada
aconteceuquandovocinstalouele.Essapegadinhaparapensar!Masesevocquisercriarummdulo?Primeirogarantaqueestejano
diretriorelativoaosmdulos:
#pwd
/opt/puppetlabs/puppet/modules
Useaopo
generate
erespondaasperguntasqueserofeitasemrelaoaomduloasercriado:
#puppetmodulegeneratelogicusutils
Weneedtocreateametadata.jsonfileforthismodule.Pleaseanswerthe
followingquestionsifthequestionisnotapplicabletothismodule,feelfree
toleaveitblank.
CopyrightLogicus2016
91
PuppetusesSemanticVersioning(semver.org)toversionmodules.
Whatversionisthismodule?[0.1.0]
>0.1.0
Whowrotethismodule?[logicus]
>logicus
Whatlicensedoesthismodulecodefallunder?[Apache2.0]
>apache2.0
Howwouldyoudescribethismoduleinasinglesentence?
>otimizaodalogicus
Whereisthismodule'ssourcecoderepository?
>
Wherecanothersgotolearnmoreaboutthismodule?
>logicus.com.br
Wherecanothersgotofileissuesaboutthismodule?
>
{
"name":"logicusutils",
"version":"0.1.0",
"author":"logicus",
"summary":"otimizaodalogicus",
"license":"apache2.0",
"source":"",
"project_page":"logicus.com.br",
"issues_url":null,
CopyrightLogicus2016
92
"dependencies":[
{"name":"puppetlabsstdlib","version_requirement":">=1.0.0"}
],
"data_provider":null
}
Abouttogeneratethismetadatacontinue?[n/Y]
>y
Notice:Generatingmoduleat/opt/puppetlabs/puppet/modules/utils...
Notice:Populatingtemplates...
Finishedmodulegeneratedinutils.
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
Agorasmodificaraestruturadeacordocomasuademanda.Paracriarumtarballdomdulo:
#puppetmodulebuildutils/
Notice:Building/opt/puppetlabs/puppet/modules/utilsforrelease
CopyrightLogicus2016
93
Modulebuilt:/opt/puppetlabs/puppet/modules/utils/pkg/logicusutils0.1.0.tar.gz
Masvaledizerqueseoseudesejocriarmdulosoueditarmdulosexistentesvocpodeusarumeditorchamado
Geppetto
.Tratasedeuma
IDEambientededesenvolvimentointegrado,construdasoboEclipse.umaferramentaparadesenvolvimentodemdulosemanifestos.Nele
voctemrealcedesintaxe,depuraoeaindapodefazer:
Criarnovosprojetos
criarprojetosdemanifestosoumdulosdozerooubaseadosem
projetosexistentesnoGitouSVN
Gerenciarcontroledeverso
criarnovosprojetosnoGitouSVNouatmesmoimportarprojetos
existentesedepoisatualizlos
ImportareexportarnoForge
trabalharcomprojetosexistentesounovoseenvilosdiretamente
paraoForge
Parainstalaracesseolink:
https://puppetlabs.github.io/geppetto/download.html
efaadownloaddeacordocomamquinadeondeirrealizaro
desenvolvimento.Exemplo:
CopyrightLogicus2016
94
CopyrightLogicus2016
95
Apsodownloaddescompacteoarquivo:
$unzipgeppettolinux.gtk.x86_644.3.1R201501182354.zip
Acesseapastadescompactada.Percebaquehdiversosarquivosnesta:
$lsl
total216
rwrr1gustavogustavo65151Jan192015artifacts.xml
drwxrxrx4gustavogustavo4096Jan192015configuration
rwrr1gustavogustavo15551Jan182015eplv10.html
drwxrxrx28gustavogustavo4096Jan192015features
rwxrxrx1gustavogustavo74675Jan192015geppetto
rwrr1gustavogustavo244Jan192015geppetto.ini
rwxrxrx1gustavogustavo10616Jan192015icon.xpm
rwrr1gustavogustavo2056Jan182015notice.html
drwxrxrx4gustavogustavo4096Jan192015p2
drwxrxrx4gustavogustavo28672Jan192015plugins
Executeoarquivogeppettonapastadescompactada!
CopyrightLogicus2016
96
CopyrightLogicus2016
97
Vamosabrirummduloexistenteparaedio.CliqueemFileedepoisemImport.SelecioneaopoPuppeteemseguidaFromForge
Repository,comoindicadoabaixo:
CopyrightLogicus2016
98
InsiranaseoKeywordsearchumapalavrachaveparabuscadomdulo.VamosusarapalavraFirewall:
CopyrightLogicus2016
99
Iroaparecertodososmdulosrelativosapalavrachavequefoibuscada.Selecioneaopopuppetlabsfirewall1.1.3comonafiguraabaixo:
CopyrightLogicus2016
100
Umavezselecionadaaopoumanovacaixaserabertaparaconfirmao:
CopyrightLogicus2016
101
CliqueemFinisheomduloserabertoparaedio:
CopyrightLogicus2016
102
Ok!Agoravocdeveestarpensandoqueescritademdulojalgomuitoavanado,erealmente,vocprecisaseaprofundarumpoucomais
antes.Poristovamoslhedaroutradicaquentequeaseguinte:aPuppetLabsdisponibilizaumamquinavirtualcomoPuppetinstaladoe
configuradoparaquevocpossaaprender.Iniciaroaprendizadoporelainclusiveomelhorcaminho!TratasedeumaVMcomCentOs
disponvelparadownload.Olinkparadownload:
http://info.puppetlabs.com/downloadlearningpuppetVM.html.
Apsrealizarodownload
descompacteoarquivobaixado:
CopyrightLogicus2016
103
$unziplearning_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
NocrieumanovaVM.Importeaquefezdownload!Exemplo:
CopyrightLogicus2016
104
Antesdeacessararedepelaprimeiravezcertifiquesedequeconfigurouarededamquinavirtualnomodobridged.Vejamos:
CopyrightLogicus2016
105
CopyrightLogicus2016
106
Percebaquenosfoiindicadoip,usernameesenha.FaaoseuloginviassheverifiqueaversodoPuppet:
root@learning:~#puppetV
4.4.2
SevocacessarvianavegadoratravsdeHTTPoendereodavmteracessoaumroteirodeaprendizagemcuidadosamenteelaboradopela
PuppetLabs,fenomenal!Vejamos:
CopyrightLogicus2016
107
SevocacessaropainelviaHTTPSteracessoaopaineldoPuppet:
CopyrightLogicus2016
108
Paraacessaruseologinadmineasenhapuppetlabs.Vocverumatelacomoabaixo:
CopyrightLogicus2016
109
CopyrightLogicus2016
110
Duranteosseusestudosvocepodeseutilizaroquest,quelheauxilianoacompanhamentodoaprendizadoemPuppet:
#questhelp
NAME
questTrackthestatusofquestsandtasks.
SYNOPSIS
quest[globaloptions]command[commandoptions][arguments...]
GLOBALOPTIONS
helpShowthismessage
COMMANDS
beginBeginaquest
helpShowsalistofcommandsorhelpforonecommand
listListavailablequests
statusShowstatusofthecurrentquest
Ouseja,namedidaemquevocfortrabalhandocomasquestsindicadasnaspginasquevocacessouviaHTTPparaaprenderPuppetcomo
roteirocriadopelaPuppetLabsvocpoderircontrolandooquejresolveu.Porexemplo:
#queststatus
Quest:welcome
Task1:UsepuppetVtocheckthepuppetversion
Task2:Viewtheoptionsforthequesttool
XTask3:Checkthequeststatus
CopyrightLogicus2016
111
EssaumaformamuitointeressanteemboraofocodestaVMsejaaversoEnterprisedoPuppet.Noentantomuitacoisaquevocirvercom
estaVMpodeserusadanaversoparacomunidadequevimosnesteartigo.Dequalquerformaofatoquesevocchegouataquijtemasua
prpriainfralevantadaconformeoroteiroquelheindicamos.OqueveremosagoracomoinstalaroPuppetServerparaqueestecomandeo
quedevehavernasdemaismquinasdainfra,ouseja,ocaraqueirdizeroqueosoutrosservidoresdeveroter,entodeixeaVMde
aprendizagemdoPuppetumpoucodelado(masnodeixadeestudlaquandoterminaresteartigo)eretorneparaainfraquemontamosjuntos
paravermossobreoPuppetServer.OPuppetServerrodasobreJVM.BasicamentepodemosdizerqueoPuppetServerveiosubstituiroantigo
PuppetMaster.Vamosmostrarasduasformasdeinstalao,masvamoscomearpeloPuppetServerqueprovavelmenteoquevocirquerer
usar.NocasodoPuppetServernoentantoimportantequevoctenhaumamquinacompelomenosuns4GigasdeRamparaevitar
problemasquepossamocorrernainicializaodoservio.VamosaproveitaramquinadoCentOS7presenteemnossainfra.Confiraseu
/etc/hosts:
#cat/etc/hosts
127.0.0.1localhostlocalhost.localdomain
192.168.0.107centos.logicus.localcentospuppet
ParainstalaroPuppetServer:
#yuminstallpuppetserver
Aumenteotimeoutdosystemd:
#echo"START_TIMEOUT=300">>/etc/sysconfig/puppetserver
CopyrightLogicus2016
112
Antesdeiniciaroserviogereocertificado:
#puppetcertgeneratecentos.logicus.localdns_alt_names=puppet
Inicieoservio:
#systemctlstartpuppetserver
Confira:
#systemctlstatuspuppetserver
puppetserver.servicepuppetserverService
Loaded:loaded(/usr/lib/systemd/system/puppetserver.servicedisabledvendorpreset:disabled)
Active:active(running)sinceSeg2016060621:29:08BRT6minago
Process:2860ExecStartPost=/bin/bash${INSTALL_DIR}/ezbakefunctions.shwait_for_app(code=exited,status=0/SUCCESS)
Process:2856ExecStartPre=/usr/bin/installdirectoryowner=puppetgroup=puppetmode=775/var/run/puppetlabs/puppetserver
(code=exited,status=0/SUCCESS)
MainPID:2859(java)
CGroup:/system.slice/puppetserver.service
2859/usr/bin/javaXms2gXmx2gXX:MaxPermSize=256mXX:OnOutOfMemoryError=kill9%p
Djava.security.egd=/dev/urandomcp/opt/...
Jun0621:28:29centos.logicus.localsystemd[1]:StartingpuppetserverService...
Jun0621:28:29centos.logicus.localjava[2859]:OpenJDK64BitServerVMwarning:ignoringoptionMaxPermSize=256msupportwas
removedin8.0
Jun0621:28:37centos.logicus.localjava[2859]:Warning:Thefollowingoptionstoparseoptsareunrecognized::flag
Jun0621:29:08centos.logicus.localsystemd[1]:StartedpuppetserverService.
CopyrightLogicus2016
113
Jun0621:36:03centos.logicus.localsystemd[1]:StartedpuppetserverService.
Garantaqueoarquivodeconfiguraodopuppet,o
puppet.conf
,estejacomoagentdevidamenteindicadoparaevitarproblemacomo
certificado:
#cat/etc/puppetlabs/puppet/puppet.conf|grepvE'^#'
[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
Vamoselaborarumaconfiguraodeteste:
#cat/etc/puppetlabs/code/environments/production/manifests/site.pp
node"centos.logicus.local"{
package{'lynx':
ensure=>present,
}
}
Empurreaconfigurao:
CopyrightLogicus2016
114
#puppetagentt
Info:Usingconfiguredenvironment'production'
Info:Retrievingpluginfacts
Info:Retrievingplugin
Info:Cachingcatalogforcentos.logicus.local
Info:Applyingconfigurationversion'1465261549'
Notice:/Stage[main]/Main/Node[centos.logicus.local]/Package[lynx]/ensure:created
Info:Creatingstatefile/opt/puppetlabs/puppet/cache/state/state.yaml
Notice:Appliedcatalogin8.50seconds
AgoraverifiquequeemseuCentOSqueestatuandocomoclienteeservidoraomesmotempojestinstaladooLynx.Ouseja,empurramosa
configuraousandoamesmamquinacomopuppetagentepuppetserveraomesmotempo.SeaoinvsdoCentOSvocpreferiroUbuntu
16.04comoservidordeconfiguraesfaanoUbuntu:
#aptgetinstallpuppetserver
Parainiciaroservio:
#servicepuppetserverstart
Confira:
#servicepuppetserverstatus
puppetserver.servicepuppetserverService
CopyrightLogicus2016
115
Loaded:loaded(/lib/systemd/system/puppetserver.servicedisabledvendorpreset:enabled)
Active:active(running)sinceSeg2016060614:36:00BRT9sago
Process:21260ExecStartPost=/bin/bash${INSTALL_DIR}/ezbakefunctions.shwait_for_app(code=exited,status=0/SUCCESS)
Process:21254ExecStartPre=/usr/bin/installdirectoryowner=puppetgroup=puppetmode=775/var/run/puppetlabs/puppetserver
(code=exited,
MainPID:21259(java)
Tasks:26
Memory:1.0G
CPU:57.389s
CGroup:/system.slice/puppetserver.service
21259/usr/bin/javaXms2gXmx2gXX:MaxPermSize=256mXX:OnOutOfMemoryError=kill9%p
Djava.security.egd=/dev/urandomcp/opt/pu
Jun0614:35:20ubuntusystemd[1]:StartingpuppetserverService...
Jun0614:35:20ubuntujava[21259]:OpenJDK64BitServerVMwarning:ignoringoptionMaxPermSize=256msupportwasremovedin8.0
Jun0614:35:28ubuntujava[21259]:Warning:Thefollowingoptionstoparseoptsareunrecognized::flag
Jun0614:36:00ubuntusystemd[1]:StartedpuppetserverService.
EacerteoarquivodeconfiguraocomofeitoanteriormentenoCentOS.SevoctiverdificuldadecomoPuppetServerepreferirusaroPuppet
MasterporusaroDebianWheezyaoinvsdoJessie,sigaoroteiroabaixo.ParainstalaroPuppetMasternoDebianWheezybaixeeinstaleo
release:
#wgethttp://apt.puppetlabs.com/puppetlabsreleasepc1wheezy.deb
#dpkgipuppetlabsreleasepc1wheezy.deb
#aptgetupdate
Noseesqueaquenasmquinasclientesopacotecorretoopuppetagent.NamquinaescolhidaparaseroMasterfaremosdiferente.
Faremososeguinte:
CopyrightLogicus2016
116
#aptgetinstallypuppetpuppetcommonpuppetelpuppettestsuitepuppetmasterpuppetmastercommonvimpuppet
Pareoservio:
#kill9$(psaux|greppuppet|grepvgrep|awk'{print$2}')
Paradesabilitaroincioautomtico:
#sedi"s/START=yes/START=no/g"/etc/default/puppetmaster
Instaleopassenger:
#aptgetinstallpuppetmasterpassenger
Verifiqueseoserviofoilevantadonaportacorreta:
#netstata|grep8140
tcp600[::]:8140[::]:*LISTEN
Aoacessaroipdomasterviahttpsnaporta8140deveaparecernoseunavegadorafraseTheenvironmentmustbepurelyalphanumeric,not''.
Istosignificarqueomasterestlevantado!Ouseja,paraencerrar,lembresedequeparafazerascomunicaesentreasmquinasagenteseo
CopyrightLogicus2016
117
servidorprecisoinserirnoarquivo
puppet.conf
(exatamentecomofeznoexemplodoCentOS)aconfiguraoqueapontaparaoserver.Ao
realizarocomando
puppetagenttest
(nasmquinasclientes)porexemplovocdeverrecebernoservidorquevaigerenciarosnsas
seguintesrequisiesdecertificado:
#puppetcertlista
"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
(altnames:"DNS:centos.logicus.local","DNS:puppet")
Paraliberarfaaporexemplonamquinaemqueestinstaladoopuppetserver:
#puppetcertsignubuntu.logicus.local
Ouparatodasasrequisies:
#puppetcertsignall
AgoracomasmquinassecomunicandocomoPuppetServerrepitaopassorealizadonoCentOScomrelaoainstalaodolynxsque
indicandocomonodeasmquinasclientes.Istobomparapraticar!Porfimgostariamosdefalarqueexisteumaferramentachamada
Mcollectiveparaocasodequererenviarcomandosmaisrapidamenteparatodososmembrosdasuainfra.OMcollectiveumFrameworkque
visaservirparaorquestrao.Suaideiadequeexecutaaesemservidoressimultaneamente.Vejamosumapequenatabeladoquepossvel
fazercomMCollective:
CopyrightLogicus2016
118
Pode?
Oqu?
Sim
Interagircomumnmeropequenoougrandedeclusters
Sim
Ferramentassimplesemlinhadecomandoparachamaragentesremotos
Sim
Plugveleadaptvelasnecessidadeslocais
Sim
ReutilizarcapacidadedeMiddlewareparaclustering,roteamentoeisolamento
derede.Comistopossvelconfiguraesseguraseescalveis
NossoobjetivocomesteartigoquevocfossecapazdecompreenderalgicadoPuppet,criarmanifestoslocalmente,instalaredesinstalar
mdulos,instalaroPuppetServeresercapazdeempurrarumaconfiguraonarede.Esperamosterdespertadooseuinteresseparaomundo
DevOpscomestaferramentamaravilhosaqueoPuppet!Nodeixedeestudarmaisaindasobreoutrasferramentascomoporexemploo
Ansible!
Haveanicehackingday!
CopyrightLogicus2016
119