1
votes

Using below terraform code. main.tf file is as below

data "azurerm_resource_group" "tf-rg-external" {
  name = var.rg_name
}

data "azurerm_virtual_network" "tf-vn" {
  name                = var.vnet_name
  resource_group_name = var.rg_name
}

# Reference existing subnet
data "azurerm_subnet" "tf-sn" {
  name                 = var.subnet_name
  virtual_network_name = data.azurerm_virtual_network.tf-vn.name
  resource_group_name  = var.rg_name
}

module "sql_vm" {
  source                        = "Azure/compute/azurerm"
  location                      = data.azurerm_resource_group.tf-rg-external.location
  vnet_subnet_id                = data.azurerm_virtual_network.tf-vn.subnets
  resource_group_name           = data.azurerm_resource_group.tf-rg-external.name
  admin_password                = var.admin_password
  admin_username                = var.admin_username
  boot_diagnostics              = var.boot_diagnostics
  boot_diagnostics_sa_type      = var.boot_diagnostics_sa_type
  # data_disk                     = var.data_disk
  # data_disk_size_gb             = var.data_disk_size_gb
  # data_sa_type                  = var.data_sa_type
  delete_os_disk_on_termination = var.delete_os_disk_on_termination
  enable_accelerated_networking = var.enable_accelerated_networking
  # flag is_windows_image is required only when you use a custom image to spin up a VM
  # is_windows_image
  # flag vm_os_id is required only when you are using custom image
  # you need to provide id of your custom image
  # vm_os_id
  nb_instances                 = var.nb_instances
  #nb_public_ip                 = var.nb_public_ip
  public_ip_address_allocation = var.public_ip_address_allocation
  storage_account_type         = var.storage_account_type
  vm_hostname                  = var.vm_hostname
  vm_os_offer                  = var.vm_os_offer
  vm_os_publisher              = var.vm_os_publisher
  # vm_os_simple is to be used is you do not wish to specify offer, publisher and sku
  # vm_os_simple                  = UbuntuServer, WindowsServer, RHEL, openSUSE-Leap, CentOS, Debian, CoreOS and SLES
  vm_os_sku     = var.vm_os_sku
  vm_os_version = var.vm_os_version
  vm_size       = var.vm_size
}

my variables.tf file is as below:

variable "public_ip_address_allocation" {
  type    = string
  default = "Dynamic"
}
variable "storage_account_type" {
  type    = string
  default = "Standard_LRS"
}
variable "vm_hostname" {
  type    = string
  default = "testvm"
}
variable "vm_os_offer" {
  type    = string
  default = "WindowsServer"
}
variable "vm_os_publisher" {
  type    = string
  default = "MicrosoftWindowsServer"
}
variable "vm_os_sku" {
  type    = string
  default = "2012-R2-Datacenter"
}
variable "vm_os_version" {
  type    = string
  default = "latest"
}
variable "vm_size" {
  type    = string
  default = "Standard_B1ms"
}
variable "admin_password" {
  type = string
  default = "Symphony12#$%"
}
variable "admin_username" {
  type = string
  default = "devopsadmin"
}
variable "boot_diagnostics" {
  type = bool
  default = "true"
}
variable "boot_diagnostics_sa_type" {
  type = string
  default = "Standard_LRS"
}
# variable "data_disk" {
#   type = bool
#   default ="false"
# }
# variable "data_disk_size_gb" {
#   type = number
#   default = 0
# }
# variable "data_sa_type" {
#   type = string
# }
variable "delete_os_disk_on_termination" {
  type = bool
  default = true
}
variable "enable_accelerated_networking" {
  type = bool
  default = false
}
variable "nb_instances" {
  type = number
  default = 2
}
# variable "nb_public_ip" {
#   type = bool
#   default = "1"
# }
# variable "location" {
#   type = string
# }
# variable "vnet_subnet_id" {
#   type = string
# }
variable "rg_name" {
  type = string
  default = "nxt-grp-prd-manage-rgp-au-se"
}
variable "subnet_name" {
  type = string
  default = "subnet_1"
}
variable "vnet_name" {
  type = string
  default = "virtual_network_1"
}

When I run terraform plan, it reports Error below:

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

data.azurerm_virtual_network.tf-vn: Refreshing state...
data.azurerm_resource_group.tf-rg-external: Refreshing state...
data.azurerm_subnet.tf-sn: Refreshing state...

------------------------------------------------------------------------

Warning: "public_ip_address_allocation": [DEPRECATED] this property has been deprecated in favor of `allocation_method` to better match the api

  on .terraform/modules/sql_vm/Azure-terraform-azurerm-compute-fb014dd/main.tf line 248, in resource "azurerm_public_ip" "vm":
 248: resource "azurerm_public_ip" "vm" {



Warning: "public_ip_address_allocation": [DEPRECATED] this property has been deprecated in favor of `allocation_method` to better match the api

  on .terraform/modules/sql_vm/Azure-terraform-azurerm-compute-fb014dd/main.tf line 248, in resource "azurerm_public_ip" "vm":
 248: resource "azurerm_public_ip" "vm" {



Error: domain_name_label must contain only lowercase alphanumeric characters, numbers and hyphens. It must start with a letter and end only with a number or letter

  on .terraform/modules/sql_vm/Azure-terraform-azurerm-compute-fb014dd/main.tf line 248, in resource "azurerm_public_ip" "vm":
 248: resource "azurerm_public_ip" "vm" {

I would like to have an ability to override what it is in default module, something like below

domain_name_label = "false"

Unfortunately, when I do so in my main file, I get error like below:

Error: Unsupported argument

  on main.tf line 48, in module "sql_vm":
  48:   domain_name_label = "false"

An argument named "domain_name_label" is not expected here.

So, is there not anyway to override, as this is an out-of-box configuration, I would be much happier to see it working.

1

1 Answers

2
votes

I would like to have an ability to override what it is in default module, something like below

For that, the tf module should declare that as a variable. Your module Azure/compute/azurerm doesn't have a variable defined for domain_name_label.

Taking a step back and looking at your original issue: Look at the following block of code from this module:

https://github.com/Azure/terraform-azurerm-compute/blob/master/main.tf#L248

resource "azurerm_public_ip" "vm" {
  count                        = "${var.nb_public_ip}"
  name                         = "${var.vm_hostname}-${count.index}-publicIP"
  location                     = "${var.location}"
  resource_group_name          = "${azurerm_resource_group.vm.name}"
  public_ip_address_allocation = "${var.public_ip_address_allocation}"
  domain_name_label            = "${element(var.public_ip_dns, count.index)}"
  tags                         = "${var.tags}"
}

Please set a value for public_ip_dns in your call to this module. That is expected to fix your issue.

Example: (Note the line public_ip_dns = ["my-new-good-vm"]):

module "sql_vm" {
  source                        = "Azure/compute/azurerm"
  location                      = data.azurerm_resource_group.tf-rg-external.location
  vnet_subnet_id                = data.azurerm_virtual_network.tf-vn.subnets
  resource_group_name           = data.azurerm_resource_group.tf-rg-external.name
  admin_password                = var.admin_password
  admin_username                = var.admin_username
  public_ip_dns                 = ["my-new-good-vm"]
  boot_diagnostics              = var.boot_diagnostics
  boot_diagnostics_sa_type      = var.boot_diagnostics_sa_type
  # data_disk                     = var.data_disk
  # data_disk_size_gb             = var.data_disk_size_gb
  # data_sa_type                  = var.data_sa_type
  delete_os_disk_on_termination = var.delete_os_disk_on_termination
  enable_accelerated_networking = var.enable_accelerated_networking
  # flag is_windows_image is required only when you use a custom image to spin up a VM
  # is_windows_image
  # flag vm_os_id is required only when you are using custom image
  # you need to provide id of your custom image
  # vm_os_id
  nb_instances                 = var.nb_instances
  #nb_public_ip                 = var.nb_public_ip
  public_ip_address_allocation = var.public_ip_address_allocation
  storage_account_type         = var.storage_account_type
  vm_hostname                  = var.vm_hostname
  vm_os_offer                  = var.vm_os_offer
  vm_os_publisher              = var.vm_os_publisher
  # vm_os_simple is to be used is you do not wish to specify offer, publisher and sku
  # vm_os_simple                  = UbuntuServer, WindowsServer, RHEL, openSUSE-Leap, CentOS, Debian, CoreOS and SLES
  vm_os_sku     = var.vm_os_sku
  vm_os_version = var.vm_os_version
  vm_size       = var.vm_size
}