【问题标题】:Sharable "count" meta-argument between Terraform modules?Terraform 模块之间的可共享“计数”元参数?
【发布时间】:2021-06-02 09:41:03
【问题描述】:

我有一个案例,我有两个模块,一个从 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
}

是否有某种方法可以在两者之间共享一个变量,以便模块 2 中配置的后续两个 VM 遵循模块 1 的那些?例如,如果我想保存一个定义 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


    【解决方案1】:

    我不确定我是否理解您的要求,但听起来您希望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 值。

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

    【讨论】:

    • 我认为这让我走上了正确的轨道,使其更具体地适用于我自己的用例,谢谢!
    猜你喜欢
    • 2021-09-24
    • 2018-02-23
    • 2022-01-17
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多