Hoe Infrastructuurgegevens te Beheren met Terraform Uitvoer

Inleiding

Terraform-uitvoer wordt gebruikt om informatie over de infrastructurele resources uit het projectstatus te halen. Met behulp van andere functionaliteiten van de Hashicorp Configuration Language (HCL), die Terraform gebruikt, kan informatie over resources gequeryrd en in complexere data structuren, zoals lijsten en kaarten, worden getransformeerd. Uitvoer is handig voor het leveren van informatie aan externe software, die kan werken op de aangemaakte infrastructurele resources.

In dit cursus zult u zich leren kennen met de Terraform-uitvoersyntaxis en zijn parameters door middel van het maken van een eenvoudige infrastructuur die Droplets deployt. U zult ook de uitvoer programmatisch verwerken door ze om te zetten naar JSON.

Vereisten

Note: Deze handleiding is specifiek getest met Terraform 1.0.2.

Definiëren van Uitvoer

In deze sectie declareer je een Droplet, deploy die naar de cloud, en leer je over uitvoer door een uitvoer te definiëren die de IP-adres van het Droplet weergeeft.

Vanuit de map terraform-outputs die je als voorbereiding hebt aangemaakt, maak en open de bestand droplets.tf voor bewerking:

  1. nano droplets.tf

Voeg de volgende Droplet bron en uitvoerdefinitie toe:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_address" {
  value = digitalocean_droplet.web.ipv4_address
}

Naam van de resource voor een Dropletten wordt gedeclareerd als web. De actuele naam in de cloud zal zijn test-droplet, in de regio fra1, met Ubuntu 20.04.

Uiteindelijk declareer je een uitvoer genaamd droplet_ip_address. In Terraform worden uitvoeringen gebruikt om gegevens en informatie over de bronnen te exporteren en te tonen. Hier stelt je het value-parameter aan, die de data accepteert om te exporteren, als de IP-adres van de gedeclareerde Dropletten. Tijdens declareren is het onbekend, maar wordt toegankelijk nadat de Dropletten is geïnstalleerd. Uitvoeringsinformatie wordt weergegeven na elke deployement.

Sla je bestand op en sluit je het af, dan voer de volgende commando uit:

  1. terraform apply -var "do_token=${DO_PAT}"

Gebruik ja wanneer je prompt wordt gevraagd. De einde van de uitvoer zal er bijna gelijk zijn aan dit:

Output
... digitalocean_droplet.web: Creating... ... digitalocean_droplet.web: Creation complete after 32s [id=207631771] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: droplet_ip_address = ip_address

De ondersteine gehighlighteerde IP-adres behoort tot de nieuw geïnstalleerde Dropletten. Bij het toepassen van het project worden de uitvoeringsinformaties aan het einde getoond, wanneer alle bronnen attributen beschikbaar zijn. Zonder de droplet_ip_address-uitvoer zou Terraform geen meer informatie over de Dropletten laten zien, behalve dat ze geïnstalleerd zijn.

Uitvoeringsinformatie kan ook getoond worden met de output-commando:

  1. terraform output

Het uitvoer lijst alle outputs in het project:

Output
droplet_ip_address = ip_address

Je kunt ook een specifieke uitvoer naam door middel van een argument specificeren:

  1. terraform output output_name

Voor droplet_ip_address, de uitvoer zal bestaan uit alleen de IP-adres:

Output
ip_address

Er zijn ook enkele optionele parameters voor outputs:

  • description: inbedden korte documentatie die aanduidt wat de uitvoer oplevert.
  • depends_on: een meta-parameter die bij elk bronniveau beschikbaar is, die u expliciet kan specificeren dat de uitvoer van Terraform afhankelijk is van bronnen die Terraform niet automatisch bepaalt tijdens het plannen.
  • sensitive: accepteert een boolenaanwaarde, waardoor de inhoud van de uitvoer wordt geheimgehouden na de deploying als true wordt ingesteld.

De sensitive-parameter is nuttig wanneer de logboeken van de Terraform-deployment publiekelijk zijn, maar de uitvoerinhoud moet worden gehouden. U zal nu deze toevoegen aan de definitie van uw Dropt resource.

Open droplets.tf voor het editeren en voeg de gekleurdde lijn toe:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_address" {
  value      = digitalocean_droplet.web.ipv4_address
  sensitive = true
}

Sla de bestand sluiten wanneer u klaar is. Deploy de project opnieuw door te runnen:

  1. terraform apply -var "do_token=${DO_PAT}"

Voer ja in wanneer u wordt aangevraagd. U zult zien dat de uitvoer wordt redacteerd:

Output
... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_address = <sensitive>

Zelfs als het markering als sensitive is, wordt de uitvoer en haar inhoud wel beschikbaar via andere kanalen, zoals het bekijken van de Terraform-staat of queries naar de uitvoer direct.

In de volgende stap zal u een andere Dropt aanmaken en een structuur voor uitvoer creeren, dus verwijder de momenteel geïmplementeerde en gebruik de volgende commando’s om ze te vernietigen:

  1. terraform destroy -var "do_token=${DO_PAT}"

Uw uitvoer aan de laatste van de lijst zal zijn:

Output
... Destroy complete! Resources: 1 destroyed.

U hebt een Dropt gecreerd en een uitvoer gemaakt die zijn IP-adres toont. U leer dan hoe u gebruikt uitvoers om meer complexe structuren te tonen, zoals lijsten en mapjes.

Uitvoer van complexe structuren

In deze sectie zullen u meerdere Droplets van dezelfde definitie deployen met behulp van de count woordvoerder en zullen u hun IP-adressen in verschillende formaten uitgeven.

Gebruik van de for lus

U bent het count sleutelwoord moeten aanpassen voor de bronresource definitie, dus open je hem voor het editeren:

  1. nano droplets.tf

Modificeer hem om er als volgens te komen:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

Je hebt specifiek gevraagd dat er drie Droplets worden gemaakt met gebruik van de count-key en je hebt de huidige index toegevoegd aan de Droplet naam, zodat je later tussen hen kan onderscheiden. Verwijder de bestaande uitvoer hieronder. Wanneer je klaar is, slaaf en sluit de bestand.

Toepassen van de code door te runnen:

  1. terraform apply -var "do_token=${DO_PAT}"

Terraform zal plannen om drie getekende Droplets te maken, genaamd test-droplet-0, test-droplet-1, en test-droplet-2. Geef ja wanneer u wordt aangevraagd om de proces te voltooien. U zult eindelijk de volgende uitvoer zien in de einde:

Output
... Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Dit betekent dat alle drie Droplets succesvol zijn gedeployed en dat al informatie over hen opgeslagen is in de project staat.

De makkelijkste manier om hun bronnenattributen te benutten is door gebruik te maken van uitvoer, maar het maken van één voor elk Dropleten is niet scalabel. De oplossing is om de for loop te gebruiken om door de lijst van Dropletten te traverseren en hun attributen te verzamelen, of alternatief splat expressies (die je later in deze stap leer zien).

Je moet eerst een uitvoer definieren die de IP-adressen van de drie Dropletten uitgeleverd wordt, gepaard met hun namen. Open droplets.tf voor editing:

  1. nano droplets.tf

Voeg de volgende regels toe:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_addresses" {
  value = {
    for droplet in digitalocean_droplet.web:
    droplet.name => droplet.ipv4_address
  }
}

De waarde van de uitvoer droplet_ip_addresses wordt gemaakt met behulp van een for loop. Omdat hij wordt omgeven door curly braces, zal de resulterende typemap zijn. De loop doorloopt de lijst van Dropletten en voor elke instantie, paarsgewijs haalt hij zijn naam samen met zijn IP-adres en voegt hem aan de resulterende map toe.

Sla het bestand op en sluit het af, dan probeer je het project opnieuw te toepassen:

  1. terraform apply -var "do_token=${DO_PAT}"

Gebruik de output commando van Terraform en antwoord je met ja wanneer je daarvoor wordt gevraagd. Uiteindelijk krijg je aan het einde de uitvoer inhoud:

Output
Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_addresses = { "test-droplet-0" = "ip_address" "test-droplet-1" = "ip_address" "test-droplet-2" = "ip_address" }

De uitvoer droplet_ip_addresses geeft de IP-adressen van de drie geïnstalleerde Dropletten weer.

Met de Terraform output commando kunt u de inhoud van de uitvoer als JSON bekomen met zijn commandoargument:

  1. terraform output -json droplet_ip_addresses

Het resultaat zal er bijna gelijk zijn aan het volgende:

Output
{"test-droplet-0":"ip_address","test-droplet-1":"ip_address","test-droplet-2":"ip_address"}

JSON-parsing wordt breed ondersteund en wordt veelgebruikt in verschillende programmeertalen. Zo kunt u programmaatisch de informatie over de geïnstalleerde Droplettenresources parsen.

Gebruik van Splat Expressies

Splat expressies bieden een compacte manier om over alle elementen van een lijst heen te iterateren en de inhoud van een attribuut van elk ervan te verzamelen, resulterend in een lijst. Een splat expressie die de IP-adressen van de drie geïmplementeerde dropletten zou uitlezen, zou de volgende syntaxis hebben:

digitalocean_droplet.web[*].ipv4_address

Het symbool [*] doorloopt de lijst aan links en neemt de inhoud van zijn gegeven attribuut aan rechts mee voor elk van de elementen. Als de referentie aan links niet zelf een lijst is, wordt ze ermee omgezet waardoor ze de enige elementen wordt.

U kunt droplets.tf openen voor het bewerken en de volgende regels aanpassen om dit te implementeren:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_addresses" {
  value = digitalocean_droplet.web[*].ipv4_address
}

Nadat u het bestand heeft opgeslagen, kunt u het project toepassen door de volgende opdracht uit te voeren:

  1. terraform apply -var "do_token=${DO_PAT}"

U krijgt uitvoer die nu een lijst is en die alleen de IP-adressen van de Dropletten bevat:

Output
... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_addresses = [ "ip_address", "ip_address", "ip_address", ]

Om de uitvoer als JSON te krijgen, voert u de volgende opdracht uit:

  1. terraform output -json droplet_ip_addresses

De uitvoer zal een enkele array zijn:

Output
["ip_address","ip_address","ip_address"]

U heeft outputs samen met splat expressies en for-lussen gebruikt om de IP-adressen van de geïmplementeerde Dropletten uit te lezen. U heeft ook de inhoud van de uitvoer ontvangen als JSON en u zal nu jq – een tool voor dynamisch JSON te filteren volgens gegeven expressies – gebruiken om ze te parsen.

JSON-bestanden parsen met `jq`

In deze stap zal u `jq` installeren en de basis van het gebruik ervan leren. `jq` is een tool voor het bewerken van JSON-documenten. U zal het gebruiken om de uitvoer van uw Terraform-project te parsen.

Als u op Ubuntu draait, voer dan de volgende opdracht uit om `jq` te installeren:

  1. sudo snap install jq

Op macOS kunt u `jq` installeren met behulp van Homebrew:

  1. brew install jq

`jq` roteert het aangeleverde verwerkingsexpressie op gegeven invoer, die via de pijp kan worden doorgegeven. De eenvoudigste taak in `jq` is het mooi afdrukken van de invoer:

  1. terraform output -json droplet_ip_addresses | jq '.'

Door de identiteitsoperator (.) mee te geven betekent dit dat het gehele JSON-document, ge parsed van de invoer, zonder wijzigingen wordt afgedrukt:

Output
[ "first_ip_address", "second_ip_address", "third_ip_address" ]

U kunt de tweede IP-adres aangevraagd door middel van array bracket notatie, tellend vanaf nul:

  1. terraform output -json droplet_ip_addresses | jq '.[1]'

De uitvoer zal zijn:

Output
"second_ip_address"

Om het resultaat van de verwerking een array te maken, wordt het expressie in haakjes omgehouden:

  1. terraform output -json droplet_ip_addresses | jq '[.[1]]'

U krijgt een mooi afgedrukte JSON-array:

Output
[ "second_ip_address" ]

U kunt delen van arrays ophalen in plaats van single elementen door middel van het specificeren van een reeks indexen binnen de haakjes:

  1. terraform output -json droplet_ip_addresses | jq '.[0:2]'

De uitvoer zal zijn:

Output
[ "first_ip_address", "second_ip_address" ]

De gebieden 0..2 geven de eerste twee elementen terug—de bovenste deel van de reeks (2) is niet inclusief, dus alleen elementen op posities 0 en 1 worden geleverd.

U kunt nu de geïnstalleerde resources verwijderden door het uitvoeren van:

  1. terraform destroy -var "do_token=${DO_PAT}"

In deze stap hebben u jq gedownload en gebruikt om de uitvoer van uw Terraform-project te parsen en te manipuleren, waarmee u drie Droplets heeft geïnstalleerd.

Conclusie

U hebt leren over Terraform-outputs, hoe ze gebruiken om details over de geïnstalleerde resources te tonen en om gegevensstructuren te exporteren voor later extern processeren. U hebt ook gebruik gemaakt van outputs om een enkele resourceattribut te tonen, alsook om samengestelde map en lijsten te tonen die resourceattributen bevatten.

Voor meer detailelde over de functies van jq, beschik je over de officiële documentatie.

Dit tutorial is onderdeel van de How To Manage Infrastructure with Terraform -reeks. De reeks covert een aantal Terraform-topics, van het installeren van Terraform voor het eerste keer tot het manageren van complexe projecten.

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-infrastructure-data-with-terraform-outputs