Hoe Puppet Modules te gebruiken voor automatisering van IT-infrastructuur?



Een praktische poppentheater waarin wordt gesproken over het schrijven van een poppenmodule en het gebruik van een manifest om de IT-infrastructuur van een organisatie te automatiseren en te onderhouden.

Voorheen maakten systeembeheerders gebruik van shell-scripts om hun servers uit te voeren, en deze methode had geen schaalbaarheid. Het is een ontmoedigende taak om constant scripts aan te passen voor honderden of duizenden steeds veranderende servers en hun systeemconfiguraties.

In dit artikel over puppet modules & manifesten laten we eens kijken hoe we puppet-modules kunnen gebruiken voor het automatiseren van serverconfiguratie, programma-installatie en systeembeheer.





Deze blog behandelt de volgende onderwerpen:

Inleiding tot het programmeren van poppen

Marionet is een van de veelgebruikte DevOps-tools die veel wordt gebruikt voor configuratiebeheer. Het wordt gebruikt om te bewerkstelligen consistentie in de infrastructuur. Puppet kan infrastructuur definiëren als code, meerdere servers beheren en systeemconfiguratie afdwingen, en zo helpen bij het automatiseren van het proces van infrastructuurbeheer.



Marionet heeftzijn eigen configuratietaal, Marionet DSL . Net als bij andere DevOps-programma's, Puppet automatiseert wijzigingen, waardoor handmatige scriptgestuurde wijzigingen worden geëlimineerd. Puppet is echter niet zomaar een andere shell-taal, noch is het een pure programmeertaal, zoals PHP. In plaats daarvan gebruikt Puppetnaar declaratieve modelgebaseerde benadering tot IT-automatisering. Hierdoor kan Puppet infrastructuur definiëren als code en systeemconfiguratie afdwingen met programma's.

Laten we, voordat we verder gaan met de demo, eens kijken naar enkele kernaspecten van poppenprogrammering.

wat is een bufferedreader java

Sleutelbegrippen in Puppet Programming

Manifesten

Een poppenprogramma heet manifesteren en heeft een bestandsnaam met .pp uitbreiding. Het standaardhoofdmanifest van Puppet is /etc/puppet/manifests/site.pp . (Dit definieertglobale systeemconfiguraties, zoals LDAP-configuratie, DNS-servers of andere configuraties die van toepassing zijn op elk knooppunt).



Klassen

Binnen deze manifesten worden codeblokken genoemd klassen andere modules kunnen bellen. Klassen configureren grote of middelgrote stukken functionaliteit, zoals alle pakketten, configuratiebestanden en services die nodig zijn om een ​​applicatie uit te voeren. Klassen maken het gemakkelijker om Puppet-code opnieuw te gebruiken en verbeteren de leesbaarheid.

Middelen

Puppet-code bestaat voornamelijk uit aangiften van middelen. EEN bron beschrijft een specifiek element over de gewenste toestand van het systeem. Het kan bijvoorbeeld bevatten dat een specifiek bestand moet bestaan ​​of dat een pakket moet worden geïnstalleerd.

Puppet-modules

Behalve de belangrijkstesite.ppmanifesteren,het slaat manifesten opin modules .

Al onze Puppet-code is georganiseerd in modules die de basisbouwstenen zijn van puppet die we kunnen hergebruiken en delen. Elke module beheert een specifieke taak in de infrastructuur, zoals het installeren en configureren van een stuk software.

Modules bevatten Puppet-klassen, gedefinieerde typen, taken, taakplannen, capaciteiten, resourcetypen en plug-ins, bijvoorbeeld aangepaste typen of feiten. Installeer modules in de Puppetmodule-pad. Puppet laadt alle inhoud van elke module in het modulepad, waardoor deze code beschikbaar is voor gebruik.

Modules - Puppet Programming - EdurekaPuppetlabs heeft vooraf gedefinieerde modules die we direct kunnen gebruiken door ze te downloaden PuppetForge . U kunt ook een aangepaste poppenmodule maken die aan uw eisen voldoet.

Puppet Program Workflow

We zullen de declaratieve taal van Puppet gebruiken om de gewenste toestand van het systeem te beschrijven in bestanden die manifesten worden genoemd. Manifesten beschrijven hoe u uw netwerk- en besturingssysteembronnen, zoals bestanden, pakketten en services, moet configureren.

Puppet compileert manifesten in catalogi en het past elke catalogus toe op het bijbehorende knooppunt om ervoor te zorgen dat de configuratie van thij knoop is correctin uw infrastructuur.

Demonstratie: Automatisering van de installatie van Apache en MySQL

Dit artikel over poppenmodules is hands-on dat twee manieren laat zien om een ​​poppenmodule te gebruiken en je ook leert hoe je dat moet doen automatiseren de installatie van een server geconfigureerd met deze twee modules.

Zorg er om te beginnen voor dat u een Puppet-infrastructuur klaar heeft staan ​​die een puppet-masterserver en 2 puppet-agents omvat.

  • Puppet Master: Ubuntu 18.04
  • Agent 1: Ubuntu 18.04
  • Agent 2:CentOS7

Hier is een overzicht van wat we zullen bereiken in deze hands-on:


Dus laten we beginnen met de hands-on:

Een geheel nieuwe module maken

In deze poppenmodule behandelen we taken zoals het downloaden van het Apache-pakket, het configureren van bestanden en het opzetten van virtuele hosts.

  • Navigeer vanuit de Puppet Master naar de modulemap van Puppet en maak de Apache-map:
    cd / etc / puppet / modules sudo mkdir apache
  • Maak vanuit de apache-map submappen: manifesten, sjablonen, bestanden en voorbeelden.
    cd apache sudo mkdir {manifesten, sjablonen, bestanden, voorbeelden}
  • Navigeer naar de map met manifesten:
    cd manifesten
  • Vanaf hier zullen we de module in klassen verdelen op basis van de doelen van dat gedeelte van de code.

init.pp -> om het Apache-pakket te downloaden

params.pp -> om variabelen en parameters te definiëren

config.pp -> om eventuele configuratiebestanden voor de Apache-service te beheren.

vhosts.pp -> om de virtuele hosts te definiëren.

Deze module zal ook gebruik maken van Hiera (een ingebouwd opzoeksysteem voor configuratiegegevens voor sleutelwaarden, gebruikt voor het scheiden van gegevens van Puppet-code) gegevens, om variabelen voor elk knooppunt op te slaan.

Stap 1: Apache-pakket downloaden

Maak de init.pp-klasse

Nu gaan we eeninit.ppbestand onder de map manifesten om het apache-pakket te bevatten.
Omdat we 2 verschillende besturingssystemen hebben (ubuntu en CentOS7) die verschillende pakketnamen gebruiken voor Apache, zullen we een variabele moeten gebruiken$ apachenaam.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

class apache {pakket {'apache': name => $ apachename, sure => present,}}

pakket resource maakt het beheer van een pakket mogelijk. Dit wordt gebruikt om een ​​pakket toe te voegen, te verwijderen of ervoor te zorgen dat er een pakket aanwezig is.

In de meeste gevallen is het naam van de bron (apache, hierboven) zou de naam moeten zijn van het pakket dat wordt beheerd. Vanwege de verschillende naamgevingsconventies,we noemen de werkelijke naam van het pakketop met de naam referentie. Zo naam , roept de nog niet gedefinieerde variabele aan$ apachenaam.

ervoor zorgen reference zorgt ervoor dat het pakketCadeau.

Maak het params.pp-bestand

Deparams.ppbestand zal de benodigde variabelen definiëren. Hoewel we deze variabelen zouden kunnen definiëren binnen deinit.ppbestand, aangezien er meer variabelen moeten worden gebruikt buiten het resourcetype zelf, met behulp van eenparams.ppbestand staat toe dat variabelen worden gedefinieerd inalsverklaringen en gebruikt in meerdere klassen.

Maak eenparams.ppbestand en de volgende code.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp

class apache :: params {if $ :: osfamily == 'RedHat' {$ apachename = 'httpd'} elsif $ :: osfamily == 'Debian' {$ apachename = 'apache2'} else {fail ('dit is niet een ondersteunde distro. ')}}

Buiten het origineel init.ppklasse, moet elke klassenaam vertakkenapache. We noemen deze klasse als apache :: params . De naam na de dubbele dubbele punt moet een naam delen met het bestand. Eenals-instructie wordt gebruikt om de parameters te definiëren, op basis van informatie die wordt verstrekt door Factor , Puppet heeft facter-installatie als onderdeel van de installatie zelf. Hier zal Facter de familie van het besturingssysteem (osfamily), om te onderscheiden of dat zo isrode HoedofOp Debian gebaseerd.

Nu de parameters eindelijk zijn gedefinieerd, moeten we de params.pp bestand en de parameters ininit.pp. Om dit te doen, moeten we de parameters achter de klassenaam toevoegen, maar vóór de accolade openen({).

Dus deinit.ppdie we eerder hebben gemaakt, zou er ongeveer zo uit moeten zien:

class apache ($ apachename = $ :: apache :: params :: apachename,) erft :: apache :: params {pakket {'apache': name => $ apachename, verzeker => aanwezig,}}

De waarde-string $ :: apache :: params :: waarde vertelt Puppet om de waarden uit de apache modules, params class, gevolgd door de parameternaam. Het fragment erft :: apache :: params toestaan ​​voorinit.ppom deze waarden te erven.

Stap 2: Beheer configuratiebestanden

Het Apache-configuratiebestand zal verschillen, afhankelijk van of u op een op Red Hat of op Debian gebaseerd systeem werkt.

Aan het einde van deze demo vindt u de volgende afhankelijkheidsbestanden:httpd.conf(Rode Hoed),apache2.conf(Debian).

c ++ sorteerreeks van ints
  • Kopieer de inhoud van httpd.conf enapache2.confin afzonderlijke bestanden en sla ze op in de bestanden directoryBij / etc / puppetlabs / code / environments / production / modules / apache / files .
  • Bewerk beide bestanden naar uitschakelen in leven houden. U moet de regel toevoegen KeepAlive uit in dehttpd.confhet dossier. Als u deze instelling niet wilt wijzigen, moeten we bovenaan elke instelling een opmerking plaatsenhet dossier:
    /etc/puppetlabs/code/environments/production/modules/apache/files/httpd.conf
#Dit bestand wordt beheerd door puppet

Voeg deze bestanden toe aan hetinit.ppbestand, zodat Puppet de locatie van deze bestanden op zowel de hoofdserver als de agentknooppunten weet. Hiervoor gebruiken we de het dossier bron.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

bestand {'configuratiebestand': path => $ conffile, sure => file, source => $ confsource,}

Omdat we de configuratiebestanden op twee verschillende locaties hebben, geven we de bron de generieke naam configuratiebestand met het bestand pad gedefinieerd als een parameter met depadattribuut.

ervoor zorgen zorgt ervoor dat het een bestand is.

bron geeft de locatie op de Puppet-master van de hierboven gemaakte bestanden.

Open deparams.pphet dossier.

We definiëren de $ conffile en $ confsourcevariabelen binnen dealsuitspraak:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp

if $ :: osfamily == 'RedHat' {... $ conffile = '/etc/httpd/conf/httpd.conf' $ confsource = 'puppet: ///modules/apache/httpd.conf'} elsif $: : osfamily == 'Debian' {... $ conffile = '/etc/apache2/apache2.conf' $ confsource = 'puppet: ///modules/apache/apache2.conf'} else {...

We moeten de parameters aan het begin van hetapacheclass verklaring in deinit.ppbestand, vergelijkbaar met het vorige voorbeeld.

Wanneer het configuratiebestand verandert, moet Apache opnieuw worden opgestart. Om dit te automatiseren, kunnen we de serviceresource gebruikenin combinatie met de melden attribuut, dat de bron aanroept om uit te voeren wanneer het configuratiebestand wordt gewijzigd:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

bestand {'configuratiebestand': path => $ conffile, sure => file, source => $ confsource, verwittigen => Service ['apache-service'],} service {'apache-service': name => $ apachename, hasrestart => true,}

onderhoud resource gebruikt de reeds gemaakte parameter die de Apache-naam definieerde op Red Hat- en Debian-systemen.
is opnieuw gestart attribuut wordt gebruikt om een ​​herstart van de gedefinieerde service te activeren.

Stap 3: Maak de virtuele hostbestanden

Afhankelijk van de distributie van uw systeem, worden de bestanden van de virtuele host anders beheerd. Daarom zullen we de code voor virtuele hosts in eenalsstatement, vergelijkbaar met degene die wordt gebruikt in deparams.ppklasse maar met daadwerkelijke Puppet-bronnen.

  • Van binnenuit hetapache / manifesten /directory, maak en open eenvhosts.pphet dossier. Voeg het skelet van dealsuitspraak:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {} elsif $ :: osfamily == 'Debian' {} else {}}

De locatie van het virtuele hostbestand op onze CentOS 7-server is/etc/httpd/conf.d/vhost.conf . U moet het bestand als sjabloon op de Puppet-master maken. Doe hetzelfde voor het Ubuntu virtuele hosts-bestand, dat zich bevindt op/etc/apache2/sites-available/example.com.conf, vervangenexample.commet de FQDN van de server.

  • Navigeer naar het Sjablonen bestand in het apache module en maak vervolgens twee bestanden voor uw virtuele hosts:

Voor Red Hat-systemen:
/etc/puppetlabs/code/environments/production/modules/apache/templates/vhosts-rh.conf.erb

ServerAdmin Servernaam ServerAlias ​​www. DocumentRoot / var / www // public_html / ErrorLog /var/www//logs/error.log CustomLog /var/www//logs/access.log gecombineerd

Voor Debian-systemen:
/etc/puppet/modules/apache/templates/vhosts-deb.conf.erb

ServerAdmin Servernaam ServerAlias ​​www. DocumentRoot / var / www / html // public_html / ErrorLog /var/www/html//logs/error.log CustomLog /var/www/html//logs/access.log gecombineerdVereis alles verleend

We gebruiken slechts twee variabelen in deze bestanden: adminemail en server naam . We zullen deze per knooppunt definiëren, binnen hetsite.pphet dossier.

  • Ga terug naar devhosts.pphet dossier. De gemaakte sjablonen kunnen nu worden geraadpleegd in de code:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {file {'/etc/httpd/conf.d/vhost.conf': sure => file, content => template ('apache / vhosts-rh .conf.erb '),}} elsif $ :: osfamily ==' Debian '{file {' /etc/apache2/sites-available/$servername.conf ': sure => file, content => template (' apache /vhosts-deb.conf.erb '),}} else {fail (' Dit is geen ondersteunde distributie. ')}}

Beide distributiefamilies bellen naar dehet dossierresource en neem de titel aan van de locatie van de virtuele host op de respectievelijke distributie. Voor Debian betekent dit nogmaals dat er wordt verwezen naar het$ servernaamwaarde. Deinhoudattribuut roept de respectieve sjablonen aan.

  • Beide virtuele hostbestanden verwijzen naar twee mappen. Ze staan ​​niet standaard op de systemen. We kunnen deze maken door het gebruik van dehet dossierresource, elk binnen dealsuitspraak. Het completevhosts.confbestand zou moeten lijken op:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {file {'/etc/httpd/conf.d/vhost.conf': sure => file, content => template ('apache / vhosts-rh .conf.erb '),} bestand {[' / var / www / $ servernaam ',' / var / www / $ servernaam / public_html ',' / var / www / $ servernaam / log ',]: sure => directory,}} elsif $ :: osfamily == 'Debian' {file {'/etc/apache2/sites-available/$servername.conf': sure => file, content => template ('apache / vhosts-deb. conf.erb '),} bestand {[' / var / www / $ servernaam ',' / var / www / $ servernaam / public_html ',' / var / www / $ servernaam / logs ',]: sure => directory ,}} else {fail ('Dit is geen ondersteunde distributie.')}}

Stap 4: Test de module

  • Navigeer naar hetapache / manifesten /directory, voer het puppet parser op alle bestanden om ervoor te zorgen dat de Puppet-codering foutloos is:

sudo / opt / puppetlabs / bin / puppet parser valideer init.pp params.pp vhosts.pp

Het zou leeg moeten terugkeren, zonder problemen.

  • Navigeer naar het voorbeelden directory binnen hetapachemodule. Creëer eeninit.ppbestand en neem de gemaakte klassen op. Vervang de waarden voor$ servernaamen$ adminemailmet je eigen:

/etc/puppetlabs/code/environments/production/modules/apache/examples/init.pp

serveremail = 'webmaster@example.com' $ servername = 'puppet.example.com' inclusief apache inclusief apache :: vhosts
  • Test de module door uit te voeren marionet van toepassing met de -Noop label:
    sudo / opt / puppetlabs / bin / puppet apply --noop init.pp

Het zou geen fouten moeten retourneren en output dat het vernieuwingen van gebeurtenissen zal activeren. Om apache op de Puppet-master te installeren en te configureren, voert u opnieuw uit zonder-Noop, indien gewenst.

  • Navigeer terug naar de hoofddirectory van Puppet en vervolgens naar hetmanifestenmap (nietdegene die aanwezig is in de Apache-module).

cd / etc / puppetlabs / code / environments / production / manifesten

Maak eensite.pphet dossier,en neem de Apache-module op voor elk agentknooppunt. Voer ook de variabelen in voor deadminemail en server naamparameters. Jouwsite.ppzou er als volgt uit moeten zien:

/etc/puppetlabs/code/environments/production/manifests/site.pp

knoop 'puppet-agent-ubuntu.example.com' {$ adminemail = 'webmaster@example.com' $ servername = 'puppet.example.com' omvat apache include apache :: vhosts} knoop 'puppet-agent-centos.example .com '{$ adminemail =' webmaster@example.com '$ servername =' puppet.example.com 'inclusief apache inclusief apache :: vhosts}

Standaard controleert de Puppet-agentservice op uw beheerde knooppunten automatisch eens per 30 minuten bij de master en past eventuele nieuwe configuraties van de master toe. U kunt het Puppet-agentproces ook handmatig oproepen tussen automatische agent-runs. Om de nieuwe module handmatig op uw agentknooppunten uit te voeren, logt u in op de knooppunten en voert u het volgende uit:

talend open studio tutorial pdf

sudo / opt / puppetlabs / bin / puppet agent -t

Nu we hebben geleerd hoe we vanuit het niets een module kunnen maken, gaan we leren hoe we een reeds bestaande module van de poppensmederij van puppetlabs kunnen gebruiken.

Gebruik een module van PuppetForge

Puppet Forge heeft al veel modules die de server kan draaien. We kunnen deze net zo uitgebreid configureren als een module die u hebt gemaakt en kunnen tijd besparen omdat we de module niet helemaal opnieuw hoeven te maken.

Zorg ervoor dat u zich in het / etc / puppetlabs / code / environments / production / modules directory en installeer het De MySQL-module van Puppet Forge door PuppetLabs. Hiermee worden ook alle vereiste modules geïnstalleerd.

cd / etc / puppetlabs / code / environments / productie / modules

sudo / opt / puppetlabs / bin / puppet module install puppetlabs-mysql

Gebruik Hiera om databases te maken

Voordat u de configuratiebestanden voor de MySQL-module maakt, moet u er rekening mee houden dat u misschien niet dezelfde waarden voor alle agentknooppunten wilt gebruiken. Om Puppet van de juiste data per node te voorzien, gebruiken we Hiera. Je gebruikt een ander root-wachtwoord per node, waardoor je verschillende MySQL-databases maakt.

  • Navigeren naar/ etc / puppeten maak het configuratiebestand van Hierahiera.yamlin het algemeenmarionetdirectory. Je gebruikt de standaardwaarden van Hiera:

/etc/puppetlabs/code/environments/production/hiera.yaml

--- versie: 5 hiërarchie: - naam: gemeenschappelijk pad: common.yaml standaardinstellingen: data_hash: yaml_data datadir: data
  • Maak het bestandcommon.yaml. Het zal de standaard definiëren wortel wachtwoord voor MySQL:

/etc/puppetlabs/code/environments/production/common.yaml

mysql :: server :: root_password: 'wachtwoord'

Wij gebruiken decommon.yamlhet dossierwanneer een variabele niet ergens anders is gedefinieerd. Dit betekent dat alle servers hetzelfde MySQL-rootwachtwoord zullen delen. Deze wachtwoorden kunnen ook worden gehasht om de veiligheid te vergroten.

  • Om de standaardinstellingen van de MySQL-module te gebruiken, kunt u een omvatten ‘:: mysql :: server’ lijn naar desite.pphet dossier. In dit voorbeeld overschrijft u echter enkele standaardinstellingen van de module om een ​​database voor elk van uw knooppunten te maken.

Bewerk hetsite.ppbestand met de volgende waarden:

knooppunt 'Puppetagent-ubuntu.example.com' {$ adminemail = 'webmaster@example.com' $ servername = 'hostnaam.example.com' inclusief apache inclusief apache :: vhosts inclusief mysql :: server mysql :: db {'mijndb_ $ {fqdn} ': user =>' myuser ', password =>' mypass ', dbname =>' mydb ', host => $ :: fqdn, grant => [' SELECT ',' UPDATE '], tag = > $ domein,}} knooppunt 'Puppetagent-centos.example.com' {$ adminemail = 'webmaster@example.com' $ servernaam = 'hostnaam.example.com' omvatten apache omvatten apache :: vhosts omvatten mysql :: server mysql :: db {'mydb _ $ {fqdn}': user => 'myuser', password => 'mypass', dbname => 'mydb', host => $ :: fqdn, grant => ['SELECT', ' UPDATE '], tag => $ domein,}}

Automatisering van de installatie van de Puppet Modules van poppenspeler tot poppenspeler

  • U kunt deze updates handmatig op elk knooppunt uitvoeren door SSH in elk knooppunt te plaatsen en de volgende opdracht te geven:

sudo / opt / puppetlabs / bin / puppet agent -t

  • Anders zal de Puppet-agentservice op uw beheerde knooppunten automatisch elke 30 minuten contact opnemen met de master en eventuele nieuwe configuraties van de master toepassen.

Catalogus succesvol toegepast op Ubuntu-agent

Catalogus succesvol toegepast op CentOS-agent

Zo krijgt de hele installatie geautomatiseerd op de agentknooppunten door gewoon de catalogus toe te passen.De codebestanden en afhankelijkheden die voor deze demo worden gebruikt, zijn te vinden hier .

Ik hoop dat deze demo je heeft geholpen een duidelijk beeld te krijgen van poppenmodules en manifesten en hun gebruik voor het automatiseren van de IT-infrastructuur.In dit geval wordt uw werk zo gemakkelijk, specificeer gewoon de configuraties in Puppet Master en Puppet-agenten zullen automatisch het hoofdmanifest evalueren en de module toepassen die de Apache- en MySQL-instellingen specificeert. Als u nog vragen heeft, kunt u deze op posten .

Als je dit hebt gevonden Puppet-zelfstudie relevant, bekijk de door Edureka, een vertrouwd online leerbedrijf met een netwerk van meer dan 250.000 tevreden leerlingen verspreid over de hele wereld. De Edureka DevOps Certification Training-cursus helpt leerlingen expertise op te doen in verschillende DevOps-processen en tools zoals Puppet, Jenkins, Nagios en GIT voor het automatiseren van meerdere stappen in SDLC.