使用 Terraform 在 vSphere 上部署 CoreOS 虚拟机
Deploy CoreOS virtual machine on vSphere with Terraform
我很难尝试使用 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 创建虚拟机和 ignition provider 以传递虚拟机的自定义详细信息,例如网络配置。
我不太清楚我是否正确使用了虚拟机定义中的 extra_config 属性。您可以找到有关 属性 here.
的文档
创建了虚拟机,但从未应用网络设置,这意味着 ignition 配置无法正常工作。
对于如何针对此特定场景(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
编辑 (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)}"
}
...
旧答案
终于成功了。
我使用 Terraform 在 vSphere 上创建 CoreOS 机器的工作流程如下:
- 从中下载最新的 Container Linux 稳定版 OVA
https://stable.release.core-os.net/amd64-usr/current/coreos_production_vmware_ova.ova.
- 将
coreos_production_vmware_ova.ova
导入 vCenter。
- 根据需要编辑机器设置(CPU 数量、磁盘大小等)
- 禁用虚拟机 "vApp Options"。
- 将虚拟机转换为虚拟机模板。
完成此操作后,您就有了一个可以与 Terraform 一起使用的 CoreOS 虚拟机模板。
正如我在对该问题的评论中所说,几天前我发现 this 这让我明白我的问题可能与无法执行第 4 步有关。
要禁用 "vApp Options"(即在 UI 虚拟机的 "vApp Options" 选项卡中查看),您需要在 vSphere 集群中启用 DSR ,并且,为了能够启用 DSR,您的主机必须使用支持 DRS 的密钥获得许可。我的没有,所以我卡在了第 4 步。
我写信给 VMware 支持,他们告诉我另一种方法,无需购买不同的许可证。
这可以使用 VMware PowerCLI 完成。 Here are the steps to install PowerCLI, and here 是参考。安装 PowerCLI 后,这是我用来在我的机器中禁用 "vApp Options" 的脚本:
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(语法更改)对此进行了测试,并且机器已正确创建; Ignition 配置有效,您在 Ignition 文件中放置的所有内容(网络配置、用户等)都会应用到新创建的机器上。
我很难尝试使用 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 创建虚拟机和 ignition provider 以传递虚拟机的自定义详细信息,例如网络配置。
我不太清楚我是否正确使用了虚拟机定义中的 extra_config 属性。您可以找到有关 属性 here.
的文档创建了虚拟机,但从未应用网络设置,这意味着 ignition 配置无法正常工作。
对于如何针对此特定场景(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
编辑 (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)}"
}
...
旧答案
终于成功了。
我使用 Terraform 在 vSphere 上创建 CoreOS 机器的工作流程如下:
- 从中下载最新的 Container Linux 稳定版 OVA https://stable.release.core-os.net/amd64-usr/current/coreos_production_vmware_ova.ova.
- 将
coreos_production_vmware_ova.ova
导入 vCenter。 - 根据需要编辑机器设置(CPU 数量、磁盘大小等)
- 禁用虚拟机 "vApp Options"。
- 将虚拟机转换为虚拟机模板。
完成此操作后,您就有了一个可以与 Terraform 一起使用的 CoreOS 虚拟机模板。
正如我在对该问题的评论中所说,几天前我发现 this 这让我明白我的问题可能与无法执行第 4 步有关。
要禁用 "vApp Options"(即在 UI 虚拟机的 "vApp Options" 选项卡中查看),您需要在 vSphere 集群中启用 DSR ,并且,为了能够启用 DSR,您的主机必须使用支持 DRS 的密钥获得许可。我的没有,所以我卡在了第 4 步。
我写信给 VMware 支持,他们告诉我另一种方法,无需购买不同的许可证。
这可以使用 VMware PowerCLI 完成。 Here are the steps to install PowerCLI, and here 是参考。安装 PowerCLI 后,这是我用来在我的机器中禁用 "vApp Options" 的脚本:
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(语法更改)对此进行了测试,并且机器已正确创建; Ignition 配置有效,您在 Ignition 文件中放置的所有内容(网络配置、用户等)都会应用到新创建的机器上。