Difference between revisions of "Terraform or OpenTofu"

From docwiki
Jump to: navigation, search
(Creating a VM and Adding a DNS Entry)
Line 1: Line 1:
   
 
Example how to configure a simple network in Google via Terraform/OpenTofu
 
Example how to configure a simple network in Google via Terraform/OpenTofu
  +
  +
== Basics of Terraform / OpenTofu ==
  +
  +
In terraform you '''declare''' how your environment should look like instead of giving a procedure on how to generate it.
  +
  +
The init prepeares your terraform environment. You can run the init multiple times without deleting your existing environments.
  +
  +
The plan tells you what would change.
  +
  +
The apply makes the actual modifications to your environment.
  +
  +
<pre>
  +
tofu init
  +
tofu plan
  +
tofu apply
  +
</pre>
  +
   
 
== Creating a Network ==
 
== Creating a Network ==

Revision as of 07:17, 19 April 2024

Example how to configure a simple network in Google via Terraform/OpenTofu

Basics of Terraform / OpenTofu

In terraform you declare how your environment should look like instead of giving a procedure on how to generate it.

The init prepeares your terraform environment. You can run the init multiple times without deleting your existing environments.

The plan tells you what would change.

The apply makes the actual modifications to your environment.

tofu init
tofu plan
tofu apply


Creating a Network

main.tf

 terraform {
 }
 provider "google" {
  project = "linux-lv-test"
  region  = "europe-west1"
  zone    = "europe-west1-d"
 }

network.tf

resource "google_compute_network" "lv_vpc" {
  project                 = "linux-lv-test"
  name                    = "linux-lv-vpc"
  auto_create_subnetworks = false
  mtu                     = 1460
}
resource "google_compute_subnetwork" "lv_vpc_west1" {
  name          = "mywest1"
  ip_cidr_range = "10.20.0.0/16"
  region        = "europe-west1"
  network       = google_compute_network.lv_vpc.id
  secondary_ip_range {
    range_name    = "lv-secondary-range"
    ip_cidr_range = "10.120.0.0/24"
  }
}
resource "google_compute_firewall" "lvfw" {
  name    = "lv-fw"
  network = google_compute_network.lv_vpc.id
  allow {
    protocol = "icmp"
  }
  allow {
    protocol = "tcp"
    ports    = ["22", "80", "443","10000-20000"]
  }
  #source_tags = ["linux-lv"]
  source_ranges = ["0.0.0.0/0"]
}
resource "google_compute_router" "lvrouter" {
  name    = "lv-router"
  region  = google_compute_subnetwork.lv_vpc_west1.region
  network = google_compute_network.lv_vpc.id
}
resource "google_compute_router_nat" "lvnat" {
  name   = "lv-router-nat"
  router = google_compute_router.lvrouter.name
  region = google_compute_router.lvrouter.region
  nat_ip_allocate_option = "AUTO_ONLY"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}

Creating a VM and Adding a DNS Entry

If this is in a different project we can read out the network specifics via "data" blocks.

terraform {
}

provider "google" {
  project = "linux-lv-test"
  region  = "europe-west1"
  zone    = "europe-west1-d"
}


resource "google_compute_instance" "lv_testsrv" {
  name         = "lvsrv"
  #machine_type = "f1-micro"
  machine_type = "e2-micro"
  zone        = "europe-west1-b"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-12"
    }
  }
  metadata_startup_script = "sudo apt-get update; sudo apt-get upgrade -yq ; apt-get install -yq joe bind9-host tmux vim"

  metadata = {
    ssh-keys = "mond:${file("mond.pub")}"
  }
  network_interface {
     subnetwork = data.google_compute_subnetwork.lv_vpc_west1.id
     access_config {
    }
  }
  tags=["linux-lv"]

}
resource "google_dns_record_set" "lvsrv" {
  name         = "lvsrv.g.mond.at."
  managed_zone = data.google_dns_managed_zone.gmond.managed_zone_id
  type         = "A"
  ttl          = 600
  rrdatas      = [local.pubip_lvsrv]
  project = "arctic-sign-343718"
}

data "google_dns_managed_zone" "gmond" {
  name     = "g-mond"
  project = "arctic-sign-343718"
  #dns_name = "g.mond.at."
}

data "google_compute_network" "lv_vpc" {
  project                 = "linux-lv-test"
  name                    = "linux-lv-vpc"
}

data "google_compute_subnetwork" "lv_vpc_west1" {
  name          = "west1"
}