我刚刚开始使用 Terraform,作为起点,我从我们的 vSphere 集群中导入资源 - 只是我设置的一个简单的测试环境来玩一些 Ansible 的东西。
我发现自己重复了很多次,想知道是否有更好的方法来做到这一点。我不确定模块是否适合我所追求的,我重复的资源也不相同,所以我不确定直接循环是否有效。
实际上,我正在寻找设置资源默认值,然后我可以在需要时扩展/覆盖。一个简短的虚构示例,演示了我想要实现的目标:
resource_defaults "vsphere_virtual_machine" {
resource_pool_id = "${data.vsphere_resource_pool.pool.id}"
datastore_id = "${data.vsphere_datastore.datastore.id}"
num_cpus = 2
memory = 1024 guest_id = "other3xLinux64Guest"
network_interface {
network_id = "${data.vsphere_network.network.id}" }
disk {
label = "disk0"
size = 20
}
}
resource "vsphere_virtual_machine" "node1" {
name = "terraform-test"
}
resource "vsphere_virtual_machine" "doublenet" {
name = "terraform-test-2"
network_interface {
network_id = "${data.vsphere_network.other_network.id}"
}
}
resource "vsphere_virtual_machine" "bigdisk" {
name = "terraform-test-3"
disk {
label = "disk0"
size = 100
}
}
有谁知道我怎样才能实现我想要做的事情?
更新:现在我对 Terraform 有了更多的经验,模块正是我想做的。我只是不知道我可以传入参数!有机会我会尽量详细说明。我最近做了类似的事情,通过将数据结构传递到模块中,我可以获得相似但不同的实例来按预期构建。
Terraform 模块是您在复制时想要的。这些用你常用的默认值封装了某些资源,你可以用最少的输入重复使用一组资源,而不用重新编写它们。
Terraform 模块注册表涵盖了一些用于大型 Provider的预制模块,您可以在其中尝试一些现有的模块,或者 - 如果您的 Provider 不受支持 - 为应该如何使用和设计模块开发更好的图片。