Dukkevejledning for begyndere: Grundlæggende og DSL
⚡ Smart opsummering
Puppet er en open source-konfigurationsstyringsplatform, der automatiserer, hvordan servere provisioneres, konfigureres og holdes konsistente. Den anvender infrastruktur som kode gennem et deklarativt domænespecifikt sprog og erstatter gentagen manuel administration på tværs af store serverflåder.
Puppet er et open source-konfigurationsstyringsværktøj, der giver dig mulighed for at definere infrastruktur som kode og holde store serverflåder i en ensartet, repeterbar tilstand. Før vi lærer Puppet at kende, lad os først forstå konfigurationsstyring.
Hvad er Configuration Management?
Konfigurationsstyring er processen med at vedligeholde software- og computersystemer – såsom servere, lagring og netværk – i en kendt, ønsket og ensartet tilstand. Det giver også adgang til en nøjagtig historisk registrering af systemtilstand til projektstyring og revisionsformål.
Systemadministratorer udfører for det meste gentagne opgaver, såsom installation og konfiguration af servere. Disse fagfolk kan automatisere dette arbejde ved at skrive scripts.
Dette bliver dog et vanskeligt job, når de arbejder på en massiv infrastruktur. Konfigurationsstyringsværktøjer som Puppet blev introduceret for at løse disse problemer.
Hvad er Puppet?
Marionet er et systemstyringsværktøj til centralisering og automatisering af konfigurationsstyringsprocessen. Puppet bruges også som et softwareimplementeringsværktøj.
Det er open source-konfigurationsstyringssoftware, der er meget anvendt til serverkonfiguration, administration, implementering og orkestrering af forskellige applikationer og tjenester på tværs af hele en organisations infrastruktur.
Puppet er specielt designet til at styre konfigurationen af Linux og Windows systemer. Den er skrevet i Ruby og bruger dens unikke Domain SÆRLIGE Lnguage (DSL) for at beskrive systemkonfigurationen.
Hvad er Puppet-versionerne?
Puppet kommer i to versioner:
- Open Source marionetDet er en basisversion af Puppet-konfigurationsværktøjet, også kendt som Open Source Puppet. Det er tilgængeligt direkte fra Puppets hjemmeside og er licenseret under Apache 2.0-systemet.
- Puppet EnterpriseEn kommerciel version, der tilbyder funktioner som compliance-rapportering, orkestrering, rollebaseret adgangskontrol, en GUI, en API og kommandolinjeværktøjer til effektiv administration af noder.
Hvad kan dukke?
Lad os for eksempel antage, at du har en infrastruktur med omkring 100 servere. Som systemadministrator er det din rolle at sikre, at alle disse servere altid er opdaterede og kører med fuld funktionalitet.

For at gøre dette kan du bruge Puppet, som giver dig mulighed for at skrive simpel kode, der kan implementeres automatisk på disse servere. Dette reducerer den menneskelige indsats og gør udviklingsprocessen hurtig og effektiv.

Puppet udfører følgende funktioner:
- Puppet giver dig mulighed for at definere forskellige konfigurationer for hver vært.
- Værktøjet giver dig mulighed for løbende at overvåge servere for at bekræfte, om den nødvendige konfiguration findes og ikke er blevet ændret. Hvis konfigurationen ændres, vender Puppet tilbage til den foruddefinerede konfiguration på værten.
- Det giver også kontrol over alle konfigurerede systemer, så en centraliseret ændring automatisk udføres overalt.
- Det bruges også som et implementeringsværktøj, fordi det automatisk implementerer software i systemet. Det implementerer infrastruktur som kode, fordi politikker og konfigurationer er skrevet som kode.
Puppet DSL og programmeringsparadigmer
Før vi lærer Puppet DSL at kende, lad os forstå programmeringsparadigmer. Et programmeringsparadigme er en stil, man bruger i computerprogrammering.
Fire typer af paradigmer er:
- Imperativ.
- Erklærende.
- Funktionel (som betragtes som en delmængde af det deklarative paradigme).
- Objektorienteret.
Vi vil fokusere på de imperative og deklarative paradigmer.
Imperative paradigmer
Dette programmeringsparadigme udtrykker logikken i en beregning (hvad man skal gøre) og beskriver også dens kontrolflow (hvordan man gør det).
Eksempel:
Antag, at du skal til dit kontor. Du bestiller en taxa og begynder at give chaufføren trinvise anvisninger, indtil du når kontoret. At specificere, hvad du skal gøre, og hvordan du gør det, er en bydende nødvendig stil.
Deklarative paradigmer
Dette programmeringsparadigme udtrykker logikken i en beregning (hvad man skal gøre) uden at beskrive dens kontrolflow (hvordan man gør det).
Eksempel:
Antag, at du skal til dit kontor. Du bestiller en Uber-taxa og angiver kun den endelige destination (kontoret). At angive, hvad du skal gøre, men ikke hvordan, er en deklarativ stil.
| Paradigm | Hvad skal man gøre | Hvordan man gør |
|---|---|---|
| bydende nødvendigt | Ja | Ja |
| deklarativ | Ja | Ingen |
Puppet bruger et deklarativt programmeringsparadigme
Puppet bruger en deklarativ programmeringstilgang.
Eksempel: Opret en bruger på systemet.
Det kan gøres ved hjælp af et imperativt programmeringsmønster med et shell-script. Her specificerer vi, hvordan brugeren oprettes, og hvilke kommandoer der skal bruges på operativsystem.
Det kan dog også gøres ved hjælp af et deklarativt programmeringsmønster med kun et par linjer Puppet-kode og Puppet-domænespecifikke sprog (DSL) og stadig opnå det samme resultat.
Implementeringsmodeller af værktøjer til konfigurationsstyring
Der er to implementeringsmodeller til værktøjer til konfigurationsstyring:
- Push-baseret implementeringsmodel: initieret af en masterknude.
- Pull-baseret implementeringsmodel: initieret af agenter.
Push-baseret implementeringsmodel
I denne implementeringsmodel sender masterserveren konfigurationer og software til de enkelte agenter. Efter at have bekræftet en sikker forbindelse kører masterserveren kommandoer eksternt på agenterne. For eksempel: Ansible og Salt Stack.
Pull-baseret implementeringsmodel
I denne implementeringsmodel kontakter individuelle servere en masterserver, verificerer og etablerer en sikker forbindelse, downloader deres konfigurationer og software og konfigurerer derefter sig selv i overensstemmelse hermed – for eksempel Puppet og Chef.
Hvordan Puppet virker?
Puppet er baseret på en pull-implementeringsmodel, hvor agentnoderne tjekker ind regelmæssigt – efter hver 1800 sekunder — med masternoden for at se, om noget skal opdateres på agenten. Hvis en opdatering er påkrævet, henter agenten den nødvendige Puppet-kode fra masternoden og udfører de nødvendige handlinger.
Lad os forklare dette med et eksempel på en master-agent-opsætning.
The Master
Dette er en Linux-baseret maskine med Puppet master-softwaren installeret. Den er ansvarlig for at vedligeholde konfigurationer i form af Puppet-kode. Masternoden kan kun være Linux.
Agenterne
Dette er de målmaskiner, der administreres af Puppet, med Puppet-agentsoftwaren installeret på dem.
Agenten kan konfigureres på ethvert understøttet operativsystem, f.eks. Linux, Windows, Solariseller Mac OS.
Kommunikationen mellem masteren og agenten etableres via sikre certifikater.

Kommunikation mellem skibsføreren og agenten
Trin 1) Når forbindelsen er etableret mellem agenten og masteren, sender Puppet-agenten data om sin tilstand til Puppet-masterserveren. Disse kaldes fakta, og disse oplysninger omfatter værtsnavn, kerneoplysninger, IP-adresse, filnavnsoplysninger osv.

Trin 2) Puppet-masteren bruger disse data og udarbejder en liste over den konfiguration, der skal anvendes på agenten. Denne liste over konfigurationer, der skal udføres på en agent, kaldes en katalogDet kan omfatte pakkeinstallation, opgraderinger eller fjernelser, oprettelse af filsystemer, oprettelse eller sletning af brugere, genstart af server, ændringer af IP-konfiguration og så videre.
Trin 3) Agenten bruger denne liste over konfigurationer til at anvende eventuelle nødvendige konfigurationsændringer på noden.
Hvis der ikke er nogen afvigelser i konfigurationen, udfører agenten ingen konfigurationsændringer og lader noden køre med den samme konfiguration.

Trin 4) Når det er gjort, rapporterer noden tilbage til Puppet-masteren og angiver, at konfigurationen er blevet anvendt og fuldført.
Dukkeblokke
Puppet giver fleksibiliteten til at integrere rapporter med tredjepartsværktøjer ved hjælp af Puppet API'er.
Fire typer af Puppet-byggeklodser er:
- Ressourcer
- Klasser
- Manifest
- Moduler
Dukkeressourcer
Dukke-ressourcer er byggestenene i Dukke.
Ressourcer er indbyggede funktioner der kører i backend for at udføre de nødvendige operationer i Puppet.
Dukke klasser
En kombination af forskellige ressourcer kan grupperes sammen i én enhed kaldet en klasse.
Dukkemanifest
Et manifest er en mappe, der indeholder Puppet DSL-filer. Disse filer har filtypenavnet .pp, som står for Puppet-program. Puppet-koden består af definitioner eller deklarationer af Puppet-klasser.
Dukkemoduler
Moduler er en samling af filer og mapper, såsom manifester og klassedefinitioner. De er de genbrugelige og delbare enheder i Puppet.
For eksempel MySQL modul installeres og konfigureres MySQL, og Jenkins modul administrerer Jenkins.

Typer af puppet ressourcer
Generelt består et system af filer, brugere, tjenester, processer, pakker og så videre. I Puppet kaldes disse ressourcer, og de er de grundlæggende byggesten i Puppet.
Alle operationer på Puppet-agenter udføres ved hjælp af Puppet-ressourcer.
Puppet-ressourcer er de færdige værktøjer, der bruges til at udføre forskellige opgaver og handlinger på enhver understøttet platform. Vi kan bruge en enkelt Puppet-ressource til at udføre en specifik opgave, eller vi kan bruge flere Puppet-ressourcer sammen til at udføre komplekse applikationskonfigurationsimplementeringer.
Ressourcer kan have forskellige typer. Dukkebrug ressourcer og ressourcetyper for at beskrive et systems konfiguration.
Der er tre slags ressourcetyper:
- Puppet core eller indbyggede ressourcetyper.
- Dukkedefinerede ressourcetyper.
- Dukke tilpassede ressourcetyper.
Puppet core eller indbyggede ressourcetyper
Kerne- eller indbyggede ressourcetyper er de præbyggede Puppet-ressourcetyper, der leveres med Puppet-softwaren. Alle de kerne- eller indbyggede Puppet-ressourcetyper er skrevet og vedligeholdt af Puppet-teamet.
Dukkedefinerede ressourcetyper
Definerede ressourcetyper er lette ressourcetyper skrevet i det deklarative sprog Puppet ved hjælp af en kombination af eksisterende ressourcetyper.
Dukke tilpassede ressourcetyper
Brugerdefinerede ressourcetyper er helt tilpassede ressourcetyper skrevet i Ruby.
Lad os udforske Puppet-ressourcetyper yderligere.
I terminalen skal du skrive følgende kommando for at få vist en liste over Puppet-relaterede underkommandoer:
Puppet --help
I vores tilfælde er vi interesserede i underkommandoen "ressource", som vi vil bruge til at finde information om de indbyggede Puppet-ressourcetyper.
Indtast en af følgende kommandoer i terminalen for at få vist en liste over aktioner forbundet med Puppet-underkommandoen "ressource"
Puppet help resource Puppet resource --help
I dette tilfælde har vi det ressource som underkommandoen og – typer som handlingen.
Puppet har 49 indbyggede kerneressourcetyper.
I terminalen skal du skrive følgende kommando for at få vist en liste over de tilgængelige indbyggede Puppet-ressourcetyper:
puppet resource –types
Hver type understøtter en liste over attributter. Disse attributter giver en detaljeret beskrivelse, som Puppet bruger til at administrere ressourcen.
For at finde alle de attributter, der er knyttet til en Puppet-ressourcetype, skal du bruge følgende kommando:
puppet describe <resource type name>
Parametrene vil vise alle tilgængelige attributter for den pågældende ressourcetype.
marionet beskrive pakke
Det er svært for en ny person at forstå og relatere mange ikke-administrerede Puppet-kodefiler. Det er her, vi har brug for noget group.ping at binde operationer sammen. Målet er at løse et enkelt problem, såsom alle de operationer, der kræves for at konfigurere SSH på en server, en NTP-tjeneste eller en komplet webserver eller databaseserver fra bunden.
Hvad er dukkeklasser?
Puppet-klasser er samlinger af Puppet-ressourcer, der er samlet som en enkelt enhed.
Puppet introducerede klasser for at gøre strukturen genbrugelig og organiseret.
Først skal vi definere en klasse ved hjælp af klassedefinitionssyntaksen. Klasser skal være unikke og kan kun deklareres én gang med samme navn:
class <class-name> {
<Resource declarations>
}
Eksempel:
class ntpconfig {
file {
"/etc/ntp.conf":
ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n",
}
}
Indtil videre har vi kun defineret klassen; vi har ikke brugt den nogen steder. Det betyder, at den kode, vi har skrevet, aldrig vil blive udført, medmindre vi deklarerer denne klasse et andet sted.
Klasseerklæring
For at bruge en defineret klasse i din kode skal du bruge omfatter nøgleord.
class ntpconfig {
file {
"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
}
include ntpconfig
Lad os forstå dette med et scenarie fra den virkelige verden.
Demoinstallation af NTP
Først skal du sørge for, at NTP-pakken ikke allerede findes på serveren. Følgende kommando returnerer ingenting, hvis NTP-pakken ikke findes på serveren:
rpm -qa | grep -i ntp
Som vi kan se, er NTP-pakken allerede til stede på serveren. Lad os fjerne den eksisterende NTP-pakke:
yum remove ntp
Når du har fjernet pakken, skal du sørge for, at ntp.conf-filen ikke længere findes:
ls -lrt /etc/ntp.conf
Bekræft at ntp-tjenesten ikke findes ved at køre følgende kommando:
systemctl status ntp
Opret en ny .pp-fil for at gemme koden. Fra kommandolinjen:
vi demontp.pp
Skift til indsætningstilstand ved at trykke på i på tastaturet.
Indtast følgende kode for at oprette en ny fil:
# Class Definition
class ntpconfig {
# Installing NTP Package
package {"ntp":
ensure=> "present",
}
# Configuring NTP configuration file
file {"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
# Starting NTP services
service {"ntpd":
ensure=> "running",
}
}
Når du er færdig med at redigere, skal du trykke på esc.
For at gemme filen skal du trykke på :wq!
Det næste trin er at kontrollere om koden har nogen syntaksfejl. Udfør følgende kommando:
puppet parser validate demontp.pp
Sørg for, at du har skiftet til rod brugeren kan gennemføre testen uden fejl ved at udføre kommandoen:
su root
Test er det næste trin i kodeoprettelsesprocessen. Udfør følgende kommando for at udføre en røgtest:
Puppet applies demontp.pp --noop
Det sidste skridt er at køre Dukke i realtilstand og verificer outputtet.
puppet apply demontp.pp
Puppet opførte ikke noget, fordi demoklassen lige var definerede men ikke erklærede.
Så indtil du deklarerer Puppet-klassen, vil koden ikke blive anvendt.
Lad os erklære demoklassen inde i den samme kode ved hjælp af inkludere klassenavn i slutningen af koden:
# Class Definition
class ntpconfig {
# Installing NTP Package
package {"ntp":
ensure=> "present",
}
# Configuring NTP configuration file
file {"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
# Starting NTP services
service {"ntpd":
ensure=> "running",
}
}
# Class Declaration
include ntpconfig
Igen, kontrollere om koden har nogen syntaksfejl. Udfør følgende kommando:
puppet parser validate demontp.pp
Sørg for, at du har skiftet til rod brugeren kan gennemføre testen uden fejl ved at udføre kommandoen:
su root
Test er det næste trin i kodeoprettelsesprocessen. Udfør følgende kommando for at udføre en røgtest:
Puppet apply demontp.pp --noop
Det sidste skridt er at køre Dukke i realtilstand og verificer outputtet.
puppet apply demontp.pp
Denne gang anvendes koden, fordi klassen blev defineret og derefter deklareret.
Sørg for at ntp.conf nu findes:
ls -lrt /etc/ntp.conf
Bekræft at ntp-tjenesten er startet ved at køre følgende kommando:
systemctl status ntpd












