dude0786
dude0786

Reputation: 61

custom_data parameter is not triggered in terraform script

I am creating virtual machine in azure using terraform in which i am passing custom data parameter which should actually trigger a yaml file which does few installations. But it's not being triggered. Could you please advise on this issue.enter code here

Controller VM

resource "azurerm_virtual_machine" "controller-vm" {
name                  = "controller-vm"`enter code here`
location              = var.region

resource_group_name   = azurerm_resource_group.resourcegroup.name
network_interface_ids = [azurerm_network_interface.controllernic.id]
vm_size               = var.ctr_instance_type

storage_os_disk {
    name              = "controller-os-disk"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    disk_size_gb      = "400"
    managed_disk_type = "Standard_LRS"
}

storage_data_disk {
    name              = "controller-data-disk0"
    caching           = "ReadWrite"
    create_option     = "Empty"
    managed_disk_type = "Standard_LRS"
    disk_size_gb      = "512"
    lun               = 1
}

storage_data_disk {
    name              = "controller-data-disk1"
    caching           = "ReadWrite"
    create_option     = "Empty"
    managed_disk_type = "Standard_LRS"
    disk_size_gb      = "512"
    lun               = 2
}

storage_image_reference {
    publisher = "OpenLogic"
    offer     = "CentOS-CI"
    sku       = "7-CI"
    version   = "latest"
}

os_profile {
    computer_name  = "controller.${var.project_id}.local"
    admin_username = var.user
    custom_data = file(pathexpand(var.ctr_cloud_init_file))
}

os_profile_linux_config {
    disable_password_authentication = true
    ssh_keys {
        path     = "/home/${var.user}/.ssh/authorized_keys"
        key_data = file(pathexpand(var.ssh_pub_key_path))
    }
}

boot_diagnostics {
    enabled     = "true"
    storage_uri = azurerm_storage_account.storageaccount.primary_blob_endpoint
}

tags = {
    environment = var.project_id,
    user = var.user
}

}

The above code has a custom_data = file(pathexpand(var.ctr_cloud_init_file)) which should actually call the yaml file. which is not happened here.

Please find the yaml file i am using. ctr_cloud_init_file

users:
- name: bluedata
  groups: [sudo, wheel]
  shell: /bin/bash
  sudo: ['ALL=(ALL) NOPASSWD:ALL']
  ssh-authorized-keys: 
  ### SSH Public Key Here
  - ssh-rsa ...

package_upgrade: true
packages: 
  - epel-release
  - firewalld
repo_update: true
repo_upgrade: all

Upvotes: 1

Views: 3023

Answers (1)

Charles Xu
Charles Xu

Reputation: 31384

To provision the Azure VM with the Cloud-init file, it's not a good way to load the file directly. For the Cloud-init, I would recommend you use the template_cloudinit_config, this is the special the provider for Cloud-init and its featureset is specialized for the features of cloud-init. And here is the example code:

data "template_file" "script" {
  template = file("cloud-init")
}

# Render a multi-part cloud-init config making use of the part
# above, and other source files
data "template_cloudinit_config" "config" {
  gzip          = true
  base64_encode = true

  # Main cloud-config configuration file.
  part {
    filename     = "cloud-init"
    content_type = "text/cloud-config"
    content      = data.template_file.script.rendered
  }
}

resource "azurerm_virtual_machine" "controller-vm" {
...
os_profile {
    computer_name  = "controller.${var.project_id}.local"
    admin_username = var.user
    custom_data = data.template_cloudinit_config.config.rendered
}
...
}

Upvotes: 1

Related Questions