DevOps

Terraform prompt for variable input when creating a virtual machine

Terraform is a great infrastructure as code scripting language from Hashicorp. I use it day in and day out in the lab and in production environments to streamline the process of deploying infrastructure. In the lab environment, I have had a Terraform script that allows cloning and customizing a Linux virtual machine template I have running in VMware vSphere. However, I have been editing the file manually to specify certain parameters, such as the virtual machine name, the vSphere inventory name, IP address, etc. I wanted to update this to instead prompt for these values so I can enter these on the fly. Let’s look at Terraform prompt for variable during virtual machine creation and see how we can do this.

What are Terraform variables?

Like any other programming or scripting language, Terraform enables the ability to use variables in your code. Variables make working with code and various scripts much easier as they provide a placeholder allowing for automated input when required or for prompting for input as we want to accomplish here.

There are two files in the Terraform HCL (Hashicorp Configuration Language) that allow you to define variables. These are the:

  • variables.tf – The variables.tf file allows you to define the variables
  • terraform.tfvars – The terraform.tfvars file is the file that is generally used to define values for the variables you have created in the variables.tf file.

Terraform prompt for variable input when creating a virtual machine

So, in the first version of my Terraform code, I have something similar to the following defined in the files:

variables.tf

variable "ipv4" {}

terraform.tfvars

ipv4 = "10.1.149.40"

However, this means, that each time I want to clone a virtual machine template to customize the Linux virtual machine, I have to manually go in and change the IP address defined. The same is true for the Linux hostname and the vSphere inventory name.

The solution is quite simple. Instead of defining the value in the terraform.tfvars file, you can simply leave it out and only define the variable itself in the variables.tf file. When you do this, if the variable is indeed required information, which IP address, and others are, it will instead prompt you for the value you want to use.

You can see how I reference the variables in the code below, which is a block of my main.tf file. As you can see below, I have a couple of variables that I am prompting for, var.linux_hostname and the var.ipv4, which as mentioned, are both defined only in the variables.tf file and not the terraform.tfvars file.

clone {
    template_uuid = "${data.vsphere_virtual_machine.template.id}"

    customize {
      linux_options {
        host_name = var.linux_hostname
        domain    = "cloud.local"
      }

      network_interface {
        ipv4_address = var.ipv4
        ipv4_netmask = 24
      }

      ipv4_gateway = "10.1.149.1"
    }
  }	

It results in the following behavior when running a terraform plan and terraform apply.

Terraform prompt for variable input during a virtual machine clone operation
Terraform prompt for variable input during a virtual machine clone operation

See my full implementation of how to clone a Linux virtual machine using Terraform here:

Terraform prompt for input variable FAQs

  • What is Terraform? Terraform is arguably the leading infrastructure as code offering allowing DevOps engineers to define infrastructure as code and operate in a declarative manner. It provides hundreds of modules allowing you to work with a wide range of “providers” which are the environments that Terraform can “speak” to.
  • What is infrastructure as code? It is a new way of defining infrastructure in code. It has been brought about by the introduction of cloud infrastructure that can be controlled using API endpoints.
  • What are variables? Variables are ways of defining placeholder values that allow automatically inserting values or prompting for input from a user.

Wrapping Up

If you haven’t got your hands on Terraform, you need to. It is a great way to interact with your infrastructure, including on-premises infrastructure like VMware vSphere. It allows you to define infrastructure in a declarative way. Hopefully, this little tutorial on how to configure Terraform prompt for variable behavior will help any who want to implement this in their terraform scripts.

Subscribe to VirtualizationHowto via Email 🔔

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Brandon Lee

Brandon Lee is the Senior Writer, Engineer and owner at Virtualizationhowto.com and has over two decades of experience in Information Technology. Having worked for numerous Fortune 500 companies as well as in various industries, Brandon has extensive experience in various IT segments and is a strong advocate for open source technologies. Brandon holds many industry certifications, loves the outdoors and spending time with family.

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.