为多实例 VM vSphere 部署配置供应脚本

Configure provisioning script for multiple instance VM vSphere deployment

我不太清楚如何向我的模块添加配置“remote-exec”部分,我希望它从项目目录复制配置脚本并执行它们。但是当我添加这个模块时,我似乎无法让它以 VM 实例为目标,因为它有多个网卡,我只想以主卡为目标。

我已经使用它通过 Terraform 在本地 vSphere 实例上部署了 Linux VM。

provider "vsphere" {
  user           = var.vsphere_user
  password       = var.vsphere_password
  vsphere_server = var.vsphere_server
  # If you have a self-signed cert
  allow_unverified_ssl = true
}

这是概述网络部分的示例 Linux 部署脚本,它允许将多个网卡配置到一个 VM

resource "vsphere_virtual_machine" "Linux" {
  count      = var.is_windows_image ? 0 : var.instances
  depends_on = [var.vm_depends_on]
  name       = "%{if var.vmnameliteral != ""}${var.vmnameliteral}%{else}${var.vmname}${count.index + 1}${var.vmnamesuffix}%{endif}"
........
  dynamic "network_interface" {
    for_each = keys(var.network) #data.vsphere_network.network[*].id #other option
    content {
      network_id   = data.vsphere_network.network[network_interface.key].id
      adapter_type = var.network_type != null ? var.network_type[network_interface.key] : data.vsphere_virtual_machine.template.network_interface_types[0]
    }
  }
........
    //Copy the file to execute
    provisioner "file" {
      source      = var.provisioner_file_source // eg ./scripts/*
      destination = var.provisioner_file_destination // eg /tmp/filename
      connection {
          type     = "ssh" // for Linux its SSH 
          user     = var.provisioner_ssh_username
          password = var.provisioner_ssh_password
          host     = self.vsphere_virtual_machine.Linux.*.guest_ip_address
        }
      }  
    //Run the script
    provisioner "remote-exec" {
      inline = [
        "chmod +x ${var.provisioner_file_destination}",
        "${var.provisioner_file_destination} args",
      ]
    
      connection {
        type     = "ssh" // for Linux its SSH 
        user     = var.provisioner_ssh_username
        password = var.provisioner_ssh_password
        host     = self.vsphere_virtual_machine.Linux.*.guest_ip_address
      }
    }
 }
} // end of resource "vsphere_virtual_machine" "Linux"

所以我自己试过了。参考,但到目前为止 self.vsphere_virtual_machine.Linux.*.guest_ip_address 这只显示了整个来宾 IP 数组?

任何人都可以为我指出正确的方向,甚至是关于 terraform 模块的好指南?

我注意到的第一个问题是 vsphere_virtual_machine 资源没有 属性 guest_ip_address,它是 guest_ip_addresses。这确实 return 一个列表,因此您需要弄清楚如何从列表中 select 您想要的 IP。我不确定 vSphere 中的顺序是否可预测。如果我记得的话,它不是。

最简单的方法,在不知道你想要完成什么的情况下,可能是使用 default_ip_address 因为这个 return 是一个地址, select 是 ip “最有可能”的情况。

您似乎也在将主机设置为多宿主。这增加了额外的复杂性。如果 default_ip_address 没有给你你想要的,你需要求助于使用一些更复杂的表达式来找到你的 IP。也许你可以使用 sort function so the ordering is more predictable. You may also be able to "find" the IP using a for 循环。

关于构建模块,如果上面的代码在模块中,我首先建议避免使用count。其原因在以下文本中解释。 Hashicorp 直接在他们的网站上有很多很好的文档。另外,gruntwork 的人也有 blog series that they developed into a book called Terraform Up and Running。我建议检查一下。