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.

  • 🧩 Konfigurationsstyring: Puppet holder servere, lagring og netværk i en kendt, ensartet tilstand og bevarer en kontrollerbar historik over hver ændring.
  • 🏗️ Master-Agent Archilære: En Linux-master kompilerer kataloger og agenter på Linux, Windows, Solaris, eller Mac OS anvender dem over sikre certifikater.
  • 🔄 Trækmodel: Agenter tjekker ind hvert 1800. sekund, henter den nødvendige Puppet-kode og retter eventuelle konfigurationsafvigelser på noden.
  • 🧠 Deklarativ DSL: Puppet er skrevet i Ruby og bruger et deklarativt sprog, så du definerer den ønskede sluttilstand i stedet for trinvise kommandoer.
  • 🧱 Byggesten: Ressourcer, klasser, manifester og moduler strukturerer genanvendelig kode med 49 indbyggede kerneressourcetyper tilgængelige som standard.
  • 🇧🇷 Praktisk NTP-eksempel: Definer og deklarer en klasse, valider den med puppet parser `validate`, og anvend derefter manifestet ved hjælp af `puppet apply`.

Puppet-vejledning, der forklarer det grundlæggende i konfigurationsstyring, master-agent-arkitektur og den deklarative DSL

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.

Systemadministrator arbejder manuelt på serverne
Systemadministrator arbejder manuelt på serverne

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 automatiserer serverstyring
Puppet automatiserer Server Management

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.

Deklarative paradigmer

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.

Deklarative paradigmer

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.

Puppet Master Agent Kommunikation
Puppet Master Agent Kommunikation

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.

Kommunikation mellem skibsføreren og agenten
Agent sender fakta til master

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.

Kommunikation mellem skibsføreren og agenten
Master sender et katalog til agent

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.

Kommunikation mellem skibsføreren og agenten
Agent anvender 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:

  1. Ressourcer
  2. Klasser
  3. Manifest
  4. 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.

Dukkemoduler
Dukkemoduler

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:

  1. Puppet core eller indbyggede ressourcetyper.
  2. Dukkedefinerede ressourcetyper.
  3. 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

Dukke tilpassede ressourcetyper

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		

Dukke tilpassede ressourcetyper

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

Dukke tilpassede ressourcetyper

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

Dukke tilpassede ressourcetyper

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

Demo Installer 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

Demo Installer NTP

Bekræft at ntp-tjenesten ikke findes ved at køre følgende kommando:

systemctl status ntp

Demo Installer 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.

Demo Installer NTP

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

Demo Installer NTP

Ofte Stillede Spørgsmål

Puppet er skrevet i Ruby. Det bruger sit eget deklarative Domain Specific Language (DSL), så administratorer beskriver den ønskede systemtilstand i stedet for at skrive scripts til hvert trin. Puppet DSL er inspireret af Ruby, men du behøver ikke at kende Ruby for at skrive manifester.

Puppet bruger en deklarativ, agentbaseret pull-model og sin egen DSL, så noder henter kataloger fra en master. Ansible er agentløs og flytter YAML-playbooks over SSH. Puppet er egnet til langsigtet state-håndhævelse, mens Ansible er enklere til hurtig, on-demand orkestrering.

Som standard lytter Puppet-masteren, også kaldet Puppet Server, på TCP-port 8140. Puppet-agenter opretter forbindelse til denne port via HTTPS for at indsende data og downloade deres kompilerede kataloger. Sørg for, at port 8140 er åben i firewallen mellem agenterne og masteren.

Puppet-masteren skal køre på Linux. Puppet-agenter kører på mange platforme, herunder Linux, Windows, Solarisog Mac OS. Denne platformsuafhængige agentunderstøttelse giver en enkelt Puppet-master mulighed for at administrere en blandet flåde af servere og arbejdsstationer fra ét centralt sted.

Puppet Forge er det offentlige arkiv af præbyggede Puppet-moduler, der deles af Puppet og fællesskabet. I stedet for at skrive manifester fra bunden, kan du downloade moduler, der installerer og konfigurerer software, f.eks. MySQL or Jenkinsog tilpas dem derefter til dine omgivelser.

Ja. Puppet er fortsat et udbredt konfigurationsstyrings- og infrastruktur-som-kode-værktøj, der nu vedligeholdes af Perforce. Puppet 8 er den nuværende større udgivelse, og den understøtter stadig både Open Source Puppet og den kommercielle version. Puppet Enterprise til administration af store serverflåder.

AI-assistenter kan generere Puppet DSL fra letforståelige prompter, forklare eksisterende manifester og markere syntaks- eller logikfejl, før du kører Puppet Parser Validation. Værktøjer som f.eks. ChatGPT fremskynde redigeringen, men gennemgå altid de genererede ressourcer for korrekte stier og idempotens.

Ja. GitHub Copilot autofuldfører Puppet-manifester, ressourcedeklarationer og klassedefinitioner fra en kort kommentar eller filkontekst. RevSe dens output for korrekte ressourcetyper, attributnavne og afhængigheder, fordi genereret kode kan referere til forældede moduler eller standardindstillinger.

Opsummer dette indlæg med: