Terraform: Difference between revisions

From Leo's Notes
This page was last edited on 17 February 2022, at 00:10.
m Added categories and navbox
No edit summary
Line 1: Line 1:
Terraform is a "infrastructure as code" deployment tool. In a nutshell, Terraform allows you to define virtual machine configurations in HashiCorp Configuration Language (HCL) and then have Terraform do all the work of setting up these VMs for you automatically. The benefit of this approach is that your configs are declarative and any changes can be version controlled, are repeatable (idempotent too), and predictable.
Terraform is a "infrastructure as code" deployment tool. In a nutshell, Terraform allows you to define virtual machine configurations in HashiCorp Configuration Language (HCL) and then have Terraform do all the work of setting up these VMs for you automatically. The benefit of this approach is that your configs are declarative and any changes can be version controlled, are repeatable (idempotent too), and predictable.


==Cheat sheet==
==Quick usage guide==
There are 4 components to using Terraform:
 
=== Installation ===
Refer to the documentation at: https://www.terraform.io/downloads
 
=== Terraform commands ===
There are 4 actions when using Terraform. Be familiar with the following commands:
{| class="wikitable"
{| class="wikitable"
!Description
!Description
Line 20: Line 25:
|}
|}


==Example use-case==
=== Setup providers ===
===Provisioning VMs on Proxmox using Terraform===
Next, set up the appropriate providers that you'll need to interact with your IaaS and then run <code>terraform init</code>. If your IaaS isn't covered below, you should be able to find additional providers on Terraform's documentation at: https://runebook.dev/en/docs/terraform/-index-#Providers
Because of Terraform's modular system, there are a number of Proxmox providers for Terraform. The most popular one is [https://registry.terraform.io/providers/Telmate/proxmox/latest Telmate/proxmox] which will be the one we'll be using here. For more information on this provider and to see all the available input parameters, see:https://registry.terraform.io/providers/Telmate/proxmox/latest/docs/resources/vm_qemu.
 
To quickly get started, we will:


#Install Terraform
==== Proxmox ====
#Setup an account with an API key on Proxmox. This account should have permissions to '/' as well as to any storage volumes it needs to create VMs on '/storage/data'. (TBD)
There are a number of Proxmox providers for Terraform. The most popular one is [https://registry.terraform.io/providers/Telmate/proxmox/latest Telmate/proxmox] which will be the one we'll be using here. For more information on this provider and to see all the available input parameters, see:https://registry.terraform.io/providers/Telmate/proxmox/latest/docs/resources/vm_qemu.
#We will use the following <code>main.tf</code> file which will define the provider and provider configurations. The VM definitions are also included here.
#Run <code>terraform init</code> to set up the provider
#Run <code>terraform plan</code> to plan the tasks
#Run <code>terraform apply</code> to create the VMs.


main.tf:{{Highlight
Create a main.tf file with the following:
{{Highlight
| code = # Use Telmate proxmox provider
| code = # Use Telmate proxmox provider
terraform {
terraform {
Line 51: Line 50:
   pm_tls_insecure = true
   pm_tls_insecure = true
}
}
| lang = terminal
}}
Setup an account with an API key on Proxmox. This account should have permissions to '/' as well as to any storage volumes it needs to create VMs on '/storage/data'. ('''TBD''')


# Define our first VM
Run <code>terraform init</code> to set up the provider.
 
==== CloudStack ====
Create a <code>main.tf</code> file with the following:
{{Highlight
| code = terraform {
  required_providers {
    cloudstack = {
      source = "cloudstack/cloudstack"
      version = "0.4.0"
    }
  }
}
 
provider "cloudstack" {                                                                                                                         
  api_url    = "${var.cloudstack_api_url}"
  api_key    = "${var.cloudstack_api_key}"
  secret_key = "${var.cloudstack_secret_key}"
}
| lang = text
}}
Create a <code>vars.tf</code> with the following:
{{Highlight
| code = variable "cloudstack_api_url" {
  default = "http://cloudstack-management:8080"
}
variable "cloudstack_api_key" {
  default = "
}
variable "cloudstack_api_secret_key" {                                                                                                         
  default = ""
}
| lang = text
}}
If you don't already have a API key and secret key, log in to the CloudStack console and navigate to your profile. Click on 'Generate Keys' and copy down the keys listed under your profile. Populate the values into <code>vars.tf</code>.
 
Run <code>terraform init</code> to set up the provider.
 
===Deploy a VM===
====Proxmox====
After setting up the Proxmox provider, add the following to your main.tf file.{{Highlight
| code = # Define our first VM
resource "proxmox_vm_qemu" "test-vm" {
resource "proxmox_vm_qemu" "test-vm" {
   count = 1                            # 0 will destroy the VM
   count = 1                            # 0 will destroy the VM
Line 110: Line 153:
| lang = text
| lang = text
}}
}}
*Run <code>terraform plan</code> to plan the tasks
*Run <code>terraform apply</code> to create the VMs.
== Troubleshooting ==
====Issues with the apply step====
====Issues with the apply step====
I kept on getting "<code>400 Parameter verification failed</code>":{{Highlight
I kept on getting "<code>400 Parameter verification failed</code>":{{Highlight

Revision as of 00:10, 17 February 2022

Terraform is a "infrastructure as code" deployment tool. In a nutshell, Terraform allows you to define virtual machine configurations in HashiCorp Configuration Language (HCL) and then have Terraform do all the work of setting up these VMs for you automatically. The benefit of this approach is that your configs are declarative and any changes can be version controlled, are repeatable (idempotent too), and predictable.

Quick usage guide

Installation

Refer to the documentation at: https://www.terraform.io/downloads

Terraform commands

There are 4 actions when using Terraform. Be familiar with the following commands:

Description Command
Initialize and setup any providers terraform init
Show any changes Terraform will do terraform plan
Apply the changes (create/modify/destroy) to VMs as required. terraform apply
Tear down everything terraform destroy

Setup providers

Next, set up the appropriate providers that you'll need to interact with your IaaS and then run terraform init. If your IaaS isn't covered below, you should be able to find additional providers on Terraform's documentation at: https://runebook.dev/en/docs/terraform/-index-#Providers

Proxmox

There are a number of Proxmox providers for Terraform. The most popular one is Telmate/proxmox which will be the one we'll be using here. For more information on this provider and to see all the available input parameters, see:https://registry.terraform.io/providers/Telmate/proxmox/latest/docs/resources/vm_qemu.

Create a main.tf file with the following:

# Use Telmate proxmox provider
terraform {
  required_providers {
    proxmox = {
      source = "telmate/proxmox"
      version = "2.7.4"
    }
  }
}

# Configure the proxmox provider
provider "proxmox" {
  pm_api_url = "https://proxox-server:8006/api2/json"
  pm_api_token_id = "terraform@pam!terraform_token_id"
  pm_api_token_secret = "e458e7bc-d8e6-4028-885b-d0896f4becfa"
  pm_tls_insecure = true
}

Setup an account with an API key on Proxmox. This account should have permissions to '/' as well as to any storage volumes it needs to create VMs on '/storage/data'. (TBD)

Run terraform init to set up the provider.

CloudStack

Create a main.tf file with the following:

terraform {
  required_providers {
    cloudstack = {
      source = "cloudstack/cloudstack"
      version = "0.4.0"
    }
  }
}

provider "cloudstack" {                                                                                                                          
  api_url    = "${var.cloudstack_api_url}" 
  api_key    = "${var.cloudstack_api_key}" 
  secret_key = "${var.cloudstack_secret_key}" 
}

Create a vars.tf with the following:

variable "cloudstack_api_url" { 
   default = "http://cloudstack-management:8080" 
} 
variable "cloudstack_api_key" { 
   default = " 
} 
variable "cloudstack_api_secret_key" {                                                                                                           
   default = "" 
}

If you don't already have a API key and secret key, log in to the CloudStack console and navigate to your profile. Click on 'Generate Keys' and copy down the keys listed under your profile. Populate the values into vars.tf.

Run terraform init to set up the provider.

Deploy a VM

Proxmox

After setting up the Proxmox provider, add the following to your main.tf file.

# Define our first VM
resource "proxmox_vm_qemu" "test-vm" {
  count = 1                            # 0 will destroy the VM
  name = "test-vm-${count.index + 1}"  # count.index starts at 0. We want the VM to be named test-vm-1
  target_node = var.proxmox_host       # target proxmox host
  clone = var.template_name            # VM template to clone from
  
  os_type = "cloud-init"
  agent = 1
  cores = 2
  sockets = 1
  cpu = "host"
  memory = 2048
  scsihw = "virtio-scsi-pci"
  bootdisk = "sata0"

  disk {
    slot = 0
    size = "10G"
    type = "sata"
    storage = "data"
    iothread = 1
  }
  
  network {
    model = "virtio"
    bridge = "vmbr0"
  }
  
  lifecycle {
    ignore_changes = [
      network,
    ]
  }
  
  ipconfig0 = "ip=10.1.1.10${count.index + 1}/22,gw=10.1.1.1"
  
  # sshkeys set using variables. the variable contains the text of the key.
  sshkeys = <<EOF
  ${var.ssh_key}
  EOF
}

vars.tf:

variable "ssh_key" {
  default = "ssh-rsa  ... "
}

# This should be the exact same name as your proxmox node name
variable "proxmox_host" {
	default = "proxmox-server"
}

variable "template_name" {
	default = "rocky85-template"
}
  • Run terraform plan to plan the tasks
  • Run terraform apply to create the VMs.

Troubleshooting

Issues with the apply step

I kept on getting "400 Parameter verification failed":

╷
│ Error: 400 Parameter verification failed.
│
│   with proxmox_vm_qemu.test-vm[0],
│   on main.tf line 20, in resource "proxmox_vm_qemu" "test-vm":
│   20: resource "proxmox_vm_qemu" "test-vm" {
│
╵

The issues I encountered which triggered this error was:

  • Incorrect host name for the Proxmox node
  • Invalid values for the disk type (I tried changing type = "scsi" to type = "sata") while leaving iothread = 1 defined.

To help diagnose issues, review the provider's documentation and ensure the values you're using are appropriate. You may also want to enable additional logging by running with the TF_LOG=TRACE environment variable:

$ TF_LOG=TRACE terraform apply