terraform - 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
解决方案
我不完全确定我是否理解您的要求,但听起来您想从 .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
模块块的值。
这种方法确实有一个很大的警告,如果您将来更改count
of module "one"
,那么您还将重新编号所有module "two"
实例,因为length(module.one)
会发生变化。不幸的是,这是 IP 地址范围规划的一个典型问题,我通常建议通过将您的地址分配集中在一个位置,然后将分配的地址传递到需要它们的单独模块中来解决它,因为以后您可以维护 IP 地址将表格放在一个地方——确保不会无意中重新编号任何现有网络——而不必仔细协调多个不同模块之间的更改。
推荐阅读
- python - 带有列表的字典中每个键的前 30 个值
- javascript - 使用 shareData 使用共享 API 共享 textArea 内容/将内容转换为 USVString
- apache-spark - Spark进程中的任务卡在JavaPairRDD.repartition-将20.6 GB的内存映射溢出到磁盘
- amazon-web-services - 使用 AWS 开发工具包自动创建 AWS Quicksight Athena 数据源
- macos - 如何解决 sudo: port: command not found (Big Sur)
- java - 如何为比所有其他测试花费更长的特定测试覆盖 Timeout @Rule
- python - PySpark - 根据日期列获取季度周
- node.js - 如何在 NodeJS 和 Express 中基于 req.query 进行过滤
- c++ - 有没有更简洁的方法可以向此代码添加额外的 switch 语句?
- python-3.x - 如何等到 Excel 计算 xlwings 中的公式?