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

使用Terraform在vSphere上部署CoreOS虚拟机,terraform,coreos,vsphere,Terraform,Coreos,Vsphere,我在尝试使用Terraform在vsphere上部署CoreOS虚拟机时遇到了很大困难 到目前为止,这是我正在使用的地形文件: # 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 "ign

我在尝试使用Terraform在vsphere上部署CoreOS虚拟机时遇到了很大困难

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

# 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)}"
  }
}
#配置VMware vSphere提供程序。为用户名和密码设置的环境变量。
提供程序“vsphere”{
vsphere_server=“192.168.105.10”
允许\u未验证\u ssl=true
}
供应商“点火”{
version=“1.0.0”
}
数据“vsphere_数据中心”“dc”{
name=“数据中心”
}
数据“vsphere_数据存储”“数据存储”{
name=“vol_af01_idvms”
datacenter_id=“${data.vsphere_datacenter.dc.id}”
}
数据“vsphere\u资源\u池”“池”{
name=“集群\研究/资源”
datacenter_id=“${data.vsphere_datacenter.dc.id}”
}
数据“vsphere_网络”“网络”{
name=“虚拟机网络”
datacenter_id=“${data.vsphere_datacenter.dc.id}”
}
数据“vsphere\u虚拟机”模板{
name=“coreos_生产”
datacenter_id=“${data.vsphere_datacenter.dc.id}”
}
#创建文件夹
资源“vsphere_文件夹”“测试路径”{
datacenter_id=“${data.vsphere_datacenter.dc.id}”
path=“测试”
type=“vm”
}
#定义点火数据
数据“点火网络”装置“vmnetwork”{
name=“00-ens192.网络”
内容=编辑(2018-03-02)

从terraform vsphere provider的1.3.0版开始,有一个新属性可用。使用此属性,无需像我在第一个回答中所做的那样使用VMware PowerCLI调整虚拟机

有一个使用此属性的完整示例

现在的机器定义如下所示:

  ...

  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)}"
  }

  ...
旧答案

终于让它工作了

我使用Terraform在vSphere上创建CoreOS机器的工作流如下:

  • 从下载最新的容器Linux Stable OVA
  • 将coreos\u production\u vmware\u ova.ova导入vCenter
  • 根据需要编辑机器设置(CPU数量、磁盘大小等)
  • 禁用虚拟机的“vApp选项”
  • 将虚拟机转换为虚拟机模板
  • 完成此操作后,您就有了一个CoreOS虚拟机模板,可以与Terraform一起使用

    正如我在对该问题的评论中所说,几天前我发现,这让我明白,我的问题可能与无法执行步骤4有关

    问题是,要禁用“vApp选项”(即在UI中查看虚拟机的“vApp选项”选项卡),您需要在vSphere群集中启用DSR,要启用DSR,您的主机必须使用支持DRS的密钥进行许可。我的密钥不支持,所以我被困在第四步

    我写信给VMware支持部门,他们告诉我一种替代方法,无需购买其他许可证

    这可以使用VMware PowerCLI完成。以下是安装PowerCLI的步骤,也是参考。一旦安装了PowerCLI,这就是我用来在我的计算机中禁用“vApp选项”的脚本:

    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上执行了这一操作,并成功地重新配置了虚拟机,执行了第四步。通过这一步,我终于为这个场景正确配置了CoreOS虚拟机模板


    我已经使用terraform vSphere provider版本v0.4.2和v1.1.0(语法更改)对此进行了测试,机器创建正确;点火设置工作正常,并且您在点火文件中添加的所有内容(网络配置、用户等)都有效在新创建的机器上应用。

    一个好的起点是输出渲染的点火配置,以查看它是否符合预期。如果需要有关如何操作的指导,请联系。@DanCat我已经这样做了,文件是正确的。根据github的评论,我怀疑我的问题与我设置的vApp选项有关不能取消选中(由于我们没有相应的VMware许可证,我的虚拟机中缺少该选项)。我向VMware支持部门发送了一封电子邮件,解释了我的情况,正在等待答复。如何对点火配置进行更改?@Dhawal我使用Terraform点火提供程序