XCP-ng
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Terraform with cloud-init

    Scheduled Pinned Locked Moved Xen Orchestra
    25 Posts 7 Posters 8.0k Views 5 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • antoniolfdacruzA Offline
      antoniolfdacruz @olivierlambert
      last edited by

      Hi there!

      Please, delete my question if it is considered bad in any way.

      I am able to write terraform code that creates a vm in one of our xcp pools.

      But can't undertand how I must configure the template in order to be able to pass cloud-init userdata and metadata.

      I am using a simple VM install from ubuntu 20.04.5 ISO, turned into a template. It does not seem to load the yaml templates.

      code_textalfcruz-adm@local.hcpa.ufrgs.br@volt-ampere:~/terraform-provider-xenorchestra-intro/mkxcpvm2n$ cat main.tf
      # Infrastructure parametrization
      
      variable "xoa_pool_name" {
        type        = string
        description = "Pool Name at HCPA's XCP-ng infrastructure managed by XenOrchestra"
        default     = "UAAPool01"
      }
      
      variable "xoa_template_name" {
        type        = string
        description = "Template name at the chosen XCP-ng pool (must be unique between all the HCPA's pools"
        #default     = "Ubuntu 20.04 LTS Focal Fossa (20211008u)"
        default = "template-ubuntu-20045"
      }
      
      variable "xoa_sr_name" {
        type        = string
        description = "Name of the Storage Resource to place the VM disk(s) at the chosen pool"
        default     = "EQL01UHAASR01"
      }
      
      variable "xoa_public_vlanid" {
        type        = string
        description = "The VLAN id of the public (first) network interface of this VM"
        default     = "VLAN702"
      }
      
      variable "xoa_private_vlanid" {
        type        = string
        description = "The VLAN id of the private (or second) network interface of this VM"
        default     = "VLAN902"
      }
      
      # VM parametrization
      
      variable "vm_memory_max" {
        type        = number
        description = "VM's maximum memory (in bytes)"
        default     = 2147467264
      }
      
      variable "vm_cpus" {
        type        = number
        description = "VM's number of virtual CPU cores"
        default     = 4
      }
      
      variable "vm_name_label" {
        type        = string
        description = "The VM's name on the XCP-ng infrastructure (XOA and XCP console)"
        default     = "Terraformed at HCPA"
      }
      
      variable "vm_disk_name_label" {
        type        = string
        description = "The name of the first VM's disk"
        default     = "Filesystem root"
      }
      
      variable "vm_disk_size" {
        type        = number
        description = "The size of this VM's first disk (in bytes - default = template thick / size - 30GB)"
        default     = 32212254720
      }
      
      variable "vm_public_domain" {
        type        = string
        description = "Name of the local intranet domain"
        default     = "local.hcpa.ufrgs.br"
      }
      
      variable "vm_public_ipv4_address" {
        type        = string
        description = "The VM's public (first) interface IPv4 address"
        default     = "10.70.3.250"
      }
      
      variable "vm_public_ipv4_prefixlen" {
        type        = string
        description = "The number of network bits to use for the public IPv4 interface netmask"
        default     = "23"
      }
      
      variable "vm_public_ipv4_gateway" {
        type        = string
        description = "The IPv4 default gateway for the public interface"
        default     = "10.72.0.1"
      }
      
      # Gattering ambient facts
      
      data "xenorchestra_pool" "pool" {
        name_label = var.xoa_pool_name
      }
      
      data "xenorchestra_template" "vm_template" {
        name_label = var.xoa_template_name
      }
      
      data "xenorchestra_sr" "sr" {
        name_label = var.xoa_sr_name
        pool_id    = data.xenorchestra_pool.pool.id
      }
      
      data "xenorchestra_network" "public_vlanid" {
        name_label = var.xoa_public_vlanid
        pool_id    = data.xenorchestra_pool.pool.id
      }
      
      data "xenorchestra_network" "private_vlanid" {
        name_label = var.xoa_private_vlanid
        pool_id    = data.xenorchestra_pool.pool.id
      }
      
      # Create cloudinit templates
      
      data "template_file" "userdata" {
        template  = file("./cloud_userdata_cfg.yaml")
        vars      = {
          hostname = var.vm_name_label
          domain   = var.vm_public_domain
        }
      }
      
      data "template_file" "metadata" {
        template = file("./cloud_metadata_cfg.yaml")
        vars     = {
          hostname  = var.vm_name_label
          ip        = var.vm_public_ipv4_address
          prefixlen = var.vm_public_ipv4_prefixlen
          gateway   = var.vm_public_ipv4_gateway
        }
      }
      
      resource "xenorchestra_cloud_config" "userdataconfig" {
        name = "user data config"
        template = data.template_file.userdata.rendered
      }
      
      resource "xenorchestra_cloud_config" "metadataconfig" {
        name = "network data config"
        template = data.template_file.metadata.rendered
      }
      
      # VM creation
      
      resource "xenorchestra_vm" "vm" {
      #  cloud_config = templatefile("cloud_userdata_cfg.yaml", {
      #    hostname = var.vm_name_label
      #    domain   = var.vm_public_domain
      #  })
      #  cloud_network_config = templatefile("cloud_metadata_cfg.yaml", {
      #    hostname  = var.vm_name_label
      #    ip        = var.vm_public_ipv4_address
      #    prefixlen = var.vm_public_ipv4_prefixlen
      #    gateway   = var.vm_public_ipv4_gateway
      #  })
        cloud_network_config = xenorchestra_cloud_config.metadataconfig.template
        cloud_config = xenorchestra_cloud_config.userdataconfig.template
        memory_max = var.vm_memory_max
        cpus       = var.vm_cpus
        name_label = var.vm_name_label
        template   = data.xenorchestra_template.vm_template.id
      
        network {
          network_id = data.xenorchestra_network.public_vlanid.id
        }
      
      #  network {
      #    network_id = data.xenorchestra_network.private_vlanid.id
      #  }
      
        disk {
          sr_id      = data.xenorchestra_sr.sr.id
          name_label = var.vm_disk_name_label
          size       = var.vm_disk_size
        }
      }
      
      alfcruz-adm@local.hcpa.ufrgs.br@volt-ampere:~/terraform-provider-xenorchestra-intro/mkxcpvm2n$
      alfcruz-adm@local.hcpa.ufrgs.br@volt-ampere:~/terraform-provider-xenorchestra-intro/mkxcpvm2n$ cat cloud_userdata_cfg.yaml
      #cloud-config
      groups:
        - aghuse: [aghu]
      
      users:
        # seiseg and aghu / REDACTED | same public key
        - name: aghu
          uid: 1003
          gecos: AGHU Application Standard User
          passwd: <REDACTED>
          lock_passwd: true
          sudo: ['ALL=(ALL) NOPASSWD:ALL']
          groups: [aghuse]
          shell: /bin/bash
          homedir: /opt/aghu
          no_create_home: false
      
      packages:
        - tree
      
      runcmd:
        - sed -i -e "s/PARAMMYHOSTNAME/${hostname}/g" /etc/postfix/main.cf
        - sed -i -e "s/PARAMMYHOSTNAME/${hostname}/" /etc/puppetlabs/puppet/puppet.conf
        - /opt/ds_agent/dsa_control -r
        - /opt/ds_agent/dsa_control -a dsm://goodman.local.hcpa.ufrgs.br:4120/ "policyid:60"
        - systemctl disable networker
        -
      
      
      alfcruz-adm@local.hcpa.ufrgs.br@volt-ampere:~/terraform-provider-xenorchestra-intro/mkxcpvm2n$ cat cloud_metadata_cfg.yaml
      #cloud-config
      local-hostname: ${hostname}
      instance-id: ${hostname}
      network:
        version: 2
        ethernets:
          ens192:
            dhcp4: false
            addresses:
              - ${ip}/${prefixlen}
            gateway4: ${gateway}
            nameservers:
              search: [local.hcpa.ufrgs.br, hcpa]
              addresses: [10.10.31.13, 10.10.31.14, 10.10.31.42]
      growpart:
        mode: auto
        devices: ['/dev/sda2']
        ignore_growroot_disabled: true
      wait-on-network:
        ipv4: true
      
      alfcruz-adm@local.hcpa.ufrgs.br@volt-ampere:~/terraform-provider-xenorchestra-intro/mkxcpvm2n$
      
      
      
      1 Reply Last reply Reply Quote 0
      • olivierlambertO Offline
        olivierlambert Vates 🪐 Co-Founder CEO
        last edited by

        Question for @ddelnano I think 🙂

        antoniolfdacruzA 1 Reply Last reply Reply Quote 0
        • antoniolfdacruzA Offline
          antoniolfdacruz @olivierlambert
          last edited by

          @olivierlambert Thank you, Olivier. In fact I found in this forum another topic, don't remember by who. But that has already given me enough info to reach the solution. It was about generating images to use with cloud-init. Thank you all!

          D 2 Replies Last reply Reply Quote 0
          • D Offline
            ddelnano Terraform Team @antoniolfdacruz
            last edited by

            This post is deleted!
            1 Reply Last reply Reply Quote 0
            • D Offline
              ddelnano Terraform Team @antoniolfdacruz
              last edited by

              @antoniolfdacruz glad to hear you were able to figure it out 👍

              1 Reply Last reply Reply Quote 1
              • First post
                Last post