为多实例 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。我建议检查一下。
我不太清楚如何向我的模块添加配置“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。我建议检查一下。