首页 > 解决方案 > Terraform 模块之间的可共享“计数”元参数?

问题描述

我有一个案例,其中我有两个模块,一个从 OS1 创建资源,另一个使用 OS2。这两个资源使用通用网络配置,以便它们在配置时连接到同一网络。我希望实现的是在指定这些机器的 IP 地址时,我可以为连接到特定网络的机器设置后续 IP,例如,给定

module one{
    source = /path/to/OS1_module
    count = 2
    network_config = var.networkConfig1
}

module two{
    source = /path/to/OS2_module
    count = 2
    network_config = var.networkConfig1
}

是否有某种方法可以在两者之间共享一个变量,以便模块二中配置的后续两个 VM 将遵循模块一的那些?例如,如果我想保存一个定义 192.168.x/24 网络的第三个八位字节的变量,是否可以使用 count 或其他方法创建这样一个变量,并在两者之间共享它,这样

VM1-OS1 = 192.168.1.10

VM2-OS1 = 192.168.1.11

VM3-OS2 = 192.168.1.12

VM4-OS3 = 192.168.1.13

标签: terraform

解决方案


我不完全确定我是否理解您的要求,但听起来您想从 .module "two"之后的下一个可用地址开始编号module "one"

实现这一点的一种方法是向该模块添加一个新的输入变量以指定主机号,然后以考虑模块“堆叠”的方式为每个实例设置该变量,如下所示:

module "one" {
    source = "./modules/OS1"
    count  = 2

    network_config = var.networkConfig1
    host_number    = count.index
}

module "two" {
    source = "./modules/OS1"
    count  = 2

    network_config = var.networkConfig1
    host_number    = length(module.one) + count.index
}

这利用了一个事实,即一个模块块count出现在表达式中作为代表所有实例的对象列表,因此length(module.one)将始终等于该count模块块的值。

这种方法确实有一个很大的警告,如果您将来更改countof module "one",那么您还将重新编号所有module "two"实例,因为length(module.one)会发生变化。不幸的是,这是 IP 地址范围规划的一个典型问题,我通常建议通过将您的地址分配集中在一个位置,然后将分配的地址传递到需要它们的单独模块中来解决它,因为以后您可以维护 IP 地址将表格放在一个地方——确保不会无意中重新编号任何现有网络——而不必仔细协调多个不同模块之间的更改。


推荐阅读