Terraform for the Absolute Beginners - udemy - labs

course notes

lab 01: HCL Basics

link

Terraform extension: .tf

main.tf:

resourc "local_file" "games" {
  file = "/root/favorit-games"
  content = "FIFA 21"
}

If you don't want to have the contents of the file being created to be echoed on the screen, use the resource type local_sensitive_file.

lab 02: Terraform Providers

main.tf:

resource "local_file" "things-to-do" {
  filename = "/root/things-to-do.txt"
  content = "Clean my room before Christmas\nComplete the CKA Certification!"
}

resource "local_file" "more-things-to-do" {
  filename = "/root/more-things-to-do.txt"
  content = "Learn how to play Astronomia on the guitar!"
}

In both resources, the provider is local.

Provider types:

In the lab there was an example with registry.terraform.io/<somename>/ansible. What makes it clear that it refers to a community plugin is the fact that ansible is managed by redhat. So, previous knowledge is required.

lab 03: Multiple Providers

Nothing very significant...

When we change the .tf file we need to run terraform init again.

lab 04: Variables

variable types:

Variables are accessed by prefixing the var name with var.

lab 05: Using variables in terraform

getting vars from env: ENV_VAR_<variable_name>

The argument for -var-file is a a *.tfvars file.

variáveis em arquivos .tfvars são definidas simplesmente assim:

var_name = var_value

para que as variáveis sejam carregadas, é necessário que isso seja explicitado no arquivo variables.tf.

lab 06: Resource attributes

Some resources don't need any arguments. Example:

resource "time_static" "time_update" {
}

To access the id we use time_static.time_update.id.

Interpolation: `"Time stamp of this file is ${time_static.time_update.id}"

lab 07: Resource Dependencies

Declaring an explicit dependency:

resource "local_file" "pet" {
  filename = var.filename
  content = "My favorite pet is Mr.Cat"
  # here #############
  depends_on = [
    random_pet.my-pet
  ]
  ####################
}

resource "random_pet" "my-pet" {
  prefix = var.prefix
  separator = var.separator
  length = var.length
}

lab 08: Output Variables

output "<variable-name>" {
  value = "<variable-value>"
  <arguments>
}

inspect the value with terraform output or terraform output <variable-name>.

lab 09: Terraform State

The command terraform show is useful to check the terraform state.

NOTE: Terraform State stores sensitive data.

lab 10: Terraform Commands

Use terraform validate to check your .tf config files.

Use terraform fmt to format your code.

Use terraform providers to list the providers currently in use.

lab 11: Data Sources

Data Sources go in a data block.

resource vs. data source:

resource data source
keyword: resource keyword: data
creates, updates and destroys infrastructure reads infrastructures
aka "managed resources" aka "data resources"

lab 12: count and for_each

count

# main.tf
resource "local_file" "pet" {
  count = 3
  filename = var.filename[count.index]
}

# variables.tf
variable "filename" {
  default = [
    "/root/pets.txt",
    "/root/dogs.txt",
    "/root/cats.txt"
  ]
}

Note that count = 3 is hardcoded above 👆

A more dynamic way would be to use count = length(var.filename)

for_each

# main.tf
resource "local_file" "pet" {
  filename = each.value
  for_each = toset(var.filename)
}

# variables.tf
variable "filename" {
  type = list(string)
  default = [
    "/root/pets.txt",
    "/root/dogs.txt",
    "/root/cats.txt"
  ]
}