使用Terraform在vSphere上部署CoreOS虚拟机

时间:2017-12-14 11:08:59

标签: terraform coreos vsphere

我在使用Terraform在vsphere上部署CoreOS虚拟机时非常困难。

到目前为止,这是我正在使用的terraform文件:

# Configure the VMware vSphere Provider. ENV Variables set for Username and Passwd.

provider "vsphere" {
 vsphere_server = "192.168.105.10"
 allow_unverified_ssl = true
}

provider "ignition" {
  version = "1.0.0"
}

data "vsphere_datacenter" "dc" {
  name = "Datacenter"
}

data "vsphere_datastore" "datastore" {
  name          = "vol_af01_idvms"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_resource_pool" "pool" {
  name          = "Cluster_rnd/Resources"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_network" "network" {
  name          = "VM Network"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_virtual_machine" "template" {
  name          = "coreos_production"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

# Create a folder
resource "vsphere_folder" "TestPath" {
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
  path       = "Test"
  type       = "vm"
}

#Define ignition data
data "ignition_networkd_unit" "vmnetwork" {
  name  = "00-ens192.network"

  content = <<EOF
  [Match]
  Name=ens192
  [Network]
  DNS=8.8.8.8
  Address=192.168.105.27/24
  Gateway=192.168.105.1
EOF
}

data "ignition_config" "node" {
  networkd = [
    "${data.ignition_networkd_unit.vmnetwork.id}"
  ]
}

# Define the VM resource
resource "vsphere_virtual_machine" "vm" {
 name   = "terraform-test"
 folder = "${vsphere_folder.TestPath.path}"
 resource_pool_id = "${data.vsphere_resource_pool.pool.id}"
 datastore_id     = "${data.vsphere_datastore.datastore.id}"

 num_cpus = 2
 memory   = 1024
 guest_id = "other26xLinux64Guest"

 network_interface {
   network_id = "${data.vsphere_network.network.id}"
 }

 disk {
    name             = "terraform-test.vmdk"
    size             = "${data.vsphere_virtual_machine.template.disks.0.size}"
    eagerly_scrub    = "${data.vsphere_virtual_machine.template.disks.0.eagerly_scrub}"
    thin_provisioned = "${data.vsphere_virtual_machine.template.disks.0.thin_provisioned}"
  }

 clone {
    template_uuid = "${data.vsphere_virtual_machine.template.id}"
  }

 extra_config {
    guestinfo.coreos.config.data.encoding = "base64"
    guestinfo.coreos.config.data          = "${base64encode(data.ignition_config.node.rendered)}"
  }
}

我使用terraform vsphere provier来创建虚拟机和点火提供程序,以传递虚拟机的自定义详细信息,例如网络配置。

如果我正确使用虚拟机定义中的 extra_config 属性,我不太清楚。您可以找到有关该属性的文档here

虚拟机已创建,但网络设置从未应用,这意味着点火配置无法正常工作。

我将非常感谢有关如何针对此特定方案(Vsphere环境和CoreOS虚拟机)正确配置Terraform的任何指导,特别是关于guestinfo配置。

  • Terraform v0.11.1,provider.ignition v1.0.0,provider.vsphere v1.1.0

  • VMware ESXi,6.5.0,5310538

  • CoreOS 1520.0.0

1 个答案:

答案 0 :(得分:4)

编辑(2018-03-02)

从terraform vsphere提供程序的1.3.0版本开始,可以使用新的vApp属性。使用此属性,无需像在第一个答案中那样使用VMware PowerCLI调整虚拟机。

有一个使用此属性here

的完整示例

机器定义现在看起来像这样:

  ...

  clone {
    template_uuid = "${data.vsphere_virtual_machine.template.id}"
  }

  vapp {
     properties {
        "guestinfo.coreos.config.data.encoding" = "base64"
        "guestinfo.coreos.config.data"          = "${base64encode(data.ignition_config.node.rendered)}"
  }

  ...

OLD ANSWER

终于搞定了。

我使用Terrafomr在vSphere上创建CoreOS计算机的工作流程如下:

  1. 从中下载最新的Container Linux稳定OVA https://stable.release.core-os.net/amd64-usr/current/coreos_production_vmware_ova.ova
  2. coreos_production_vmware_ova.ova导入vCenter。
  3. 根据需要编辑机器设置(CPU数量,磁盘大小等)
  4. 禁用&#34; vApp选项&#34;虚拟机。
  5. 将虚拟机转换为虚拟机模板。
  6. 完成此操作后,您就拥有了可以与Terraform一起使用的CoreOS虚拟机模板。

    正如我在对该问题的评论中所说,几天前我找到了this,这让我明白我的问题可能与无法执行第4步有关。

    事情就是能够禁用&#34; vApp选项&#34; (即,在UI中查看虚拟机的&#34; vApp选项&#34;选项卡)您需要在vSphere群集中启用DSR,并且为了能够启用DSR,您的主机必须获得一个密钥,支持DRS。我没有,所以我陷入了第四步。

    我写信给VMware支持,他们告诉我另一种方法,而不必购买其他许可证。

    这可以使用VMware PowerCLI完成。 Here是安装PowerCLI的步骤,here是参考。一旦安装了PowerCLI,这就是我用来禁用&#34; vApp选项&#34;在我的机器上:

    Import-Module VMware.PowerCLI
    
    #connect to vcenter
    Connect-VIServer -Server yourvCenter -User yourUser -Password yourPassword
    
    #Use this to disable the vApp functionality.
    $disablespec = New-Object VMware.Vim.VirtualMachineConfigSpec
    $disablespec.vAppConfigRemoved = $True
    
    #Use this to enable
    $enablespec = New-Object VMware.Vim.VirtualMachineConfigSpec
    $enablespec.vAppConfig = New-Object VMware.Vim.VmConfigSpec
    
    #Get the VM you want to work against.
    $VM = Get-VM yourTemplate | Get-View
    
    #Disables vApp Options
    $VM.ReconfigVM($disablespec)
    
    #Enables vApp Options
    $VM.ReconfigVM($enablespec)
    

    我在Powershell上执行了该操作并设法重新配置虚拟机,执行第4步。有了这个,我终于为这种情况正确配置了我的CoreOS虚拟机模板。

    我使用terraform vSphere提供程序版本v0.4.2和v1.1.0(语法更改)对此进行了测试,并正确创建了计算机;点火配置工作以及您在点火文件上放置的所有内容(网络配置,用户等)都应用于新创建的机器上。