1

I am using terraform to deploy Linux VMs from the azure marketplace.

I have set a plan block in the linux module and declared the variables in my main.tf.

When running terraform plan/apply it works and builds the VM

I'm wondering how I would go about modifying my module and the main.tf to add the plan block as a conditional if statement.

I would like to use this module to build both non-azure marketplace & azure marketplace vms.

I wouldn't want a separate modules to do this.

module "vm-ansiblecontroller" {
  resource_group_name = module.rg-ansiblecontroller.resource_group_name
  location            = local.location
  linux_machine_name  = "linux-test1"
  tags                = var.tags

  nic_id = [module.vm-ansiblecontroller.nic_id]
  subnet_id = module.subnet-networkcore.subnet_id

  virtual_machine_size = "Standard_D2"

  admin_username       = "jpadmin"
  admin_ssh_public_key = file("~/.ssh/id_rsa.pub")

  source_image_publisher = "procomputers"
  source_image_offer     = "rocky-lnx-8-latest"
  source_image_sku       = "rocky-linux-8-latest"
  source_image_version   = "8.5.20220222"

  plan_name = "rocky-linux-8-latest"
  plan_product = "rocky-lnx-8-latest"
  plan_publisher = "procomputers"
  
  operating_system_disk_cache = "ReadWrite"
  operating_system_disk_type  = "Standard_LRS"

  ip_configuration_name         = "internal"
  private_ip_address_allocation = "Dynamic"

  public_ip_allocation_method = "Static"
  public_ip_sku               = "Standard"

   depends_on = [
    module.rg-networkcore,
    module.vnet-networkcore,
    module.subnet-networkcore
  ]
}

module "vm-jpdev" {
  resource_group_name = module.rg-jpdev-vm.resource_group_name
  location            = local.location
  linux_machine_name  = "linux-test2"
  tags                = var.tags

  nic_id = [module.vm-jpdev.nic_id]
  subnet_id = module.subnet-networkcore.subnet_id

  virtual_machine_size = "Standard_D2"

  admin_username       = "jpadmin"
  admin_ssh_public_key = file("~/.ssh/id_rsa.pub")

  source_image_publisher = "Canonical"
  source_image_offer     = "UbuntuServer"
  source_image_sku       = "16.04-LTS"
  source_image_version   = "latest"

  operating_system_disk_cache = "ReadWrite"
  operating_system_disk_type  = "Standard_LRS"

  ip_configuration_name         = "internal"
  private_ip_address_allocation = "Dynamic"

  public_ip_allocation_method = "Static"
  public_ip_sku               = "Standard"

}

modules/virtualmachine/linux/variables.tf

# VM Name
variable "linux_machine_name" {
  description = "Linux Virtual Machine Name - If left blank generated from metadata module"
  type        = string
  default     = ""
}

variable "resource_group_name" {
  description = "Resource group name"
  type        = string
}

variable "location" {
  description = "Azure region"
  type        = string
}

variable "tags" {
  description = "tags to be applied to resources"
  type        = map(string)
}

# VM Size
variable "virtual_machine_size" {
  description = "Instance size to be provisioned"
  type        = string
}

variable "admin_username" {
  description = "names to be applied to resources"
  type        = string
}

variable "admin_ssh_public_key" {
  description = "(Linux) Public SSH Key - Generated if left blank"
  type        = string
  default     = ""
  sensitive   = true
}

# Operating System
variable "source_image_publisher" {
  description = "Operating System Publisher"
  type        = string
}

variable "source_image_offer" {
  description = "Operating System Name"
  type        = string
}

variable "source_image_sku" {
  description = "Operating System SKU"
  type        = string
}

variable "source_image_version" {
  description = "Operating System Version"
  type        = string
  default     = "latest"
}

# Plan Block Variables
variable "plan_name" {
  description = "Plan Name"
  type        = string
}

variable "plan_product" {
  description = "Plan Product"
  type        = string
}

variable "plan_publisher" {
  description = "Plan Publisher"
  type        = string
}

# Operating System Disk
variable "operating_system_disk_cache" {
  description = "Type of caching to use on the OS disk - Options: None, ReadOnly or ReadWrite"
  type        = string
  default     = "ReadWrite"
}

variable "operating_system_disk_type" {
  description = "Type of storage account to use with the OS disk - Options: Standard_LRS, StandardSSD_LRS or Premium_LRS"
  type        = string
  default     = "StandardSSD_LRS"
}

variable "ip_configuration_name" {
  description = "ip configuration name"
  type        = string
  default     = ""
}

# Networking
variable "nic_id" {
  type        = list(string)
  description = "ID of the nic"
}

variable "subnet_id" {
  type        = string
  description = "ID of the subnet"
}

variable "private_ip_address_allocation" {
  type        = string
  description = "Private ip allocation method"
}

variable "public_ip_allocation_method" {
  type        = string
  description = "Public ip allocation method"
}

variable "public_ip_sku" {
  description = "SKU to be used with this public IP - Basic or Standard"
  type        = string
  default     = "Standard"
}

modules/virtualmachine/variables.tf

# Interface id
output "nic_id" {
  description = "ids of the vm nics provisoned."
  value = azurerm_network_interface.nic-linux.id

}

9
  • Conditional, but what would be the condition? Commented Apr 14, 2022 at 4:38
  • I'm not sure if this is possible solely in terraform but I'm thinking: If VM is of Azure marketplace use the the plan block otherwise don't use it. I'm open to other suggestions though if there is a better way to do this or would I need to create another module for azure marketplace vms ? Commented Apr 14, 2022 at 4:52
  • But which variable determines that? Commented Apr 14, 2022 at 4:56
  • 1
    I've taken a look at all the Rocky Linux VMs in the Marketplace and all versions cost $ per hour. So I was thinking of using a conditional against plan_product = "rocky-lnx-8-latest" var.plan_product == "rocky-lnx-8-latest" ? run the plan block : don't run the plan block and execute the rest of the code Commented Apr 14, 2022 at 9:54
  • 2
    This is new issue, not related to how to have "the plan block as a conditional if statement". Thus, new question should be asked. Commented Apr 14, 2022 at 10:20

1 Answer 1

1

You can use dynamic blocks for that:

resource "azurerm_linux_virtual_machine" "vm-linux" {

  #....

  dynamic "plan" {
    for_each    =  var.plan_product == "rocky-lnx-8-latest" ? [1] : []
    content {
      name      = var.plan_name
      product   = var.plan_product
      publisher = var.plan_publisher
    }
 }
  
  # ... 
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.