如何在不破坏现有客户端的情况下扩展terraform模块输入变量模式?

标记

我有一个带有以下输入变量的模块:

variable "apsvc_map" {
  description = "The App Services sharing the same App Service Plan. Maps an App Service name to its properties."
  type        = map(object({ 
    identity_ids = list(string),
    disabled = bool
  }))
}

现在,我想向架构添加一个新属性- no_custom_hostname_binding新版本将是:

variable "apsvc_map" {
  description = "The App Services sharing the same App Service Plan. Maps an App Service name to its properties."
  type        = map(object({ 
    identity_ids = list(string),
    disabled = bool
    no_custom_hostname_binding = bool
  }))
}

借助该try功能,可以使此更改在模块代码中向后兼容,因为省略新属性等同于为其提供false值。

但是,terraform严格对待此模式,并且在没有新字段的情况下不允许传递输入:

2020-05-30T15:34:20.8061749Z Error: Invalid value for module argument
2020-05-30T15:34:20.8062005Z 
2020-05-30T15:34:20.8062205Z   on ..\..\modules\web\main.tf line 47, in module "web":
2020-05-30T15:34:20.8062336Z   47:   apsvc_map = {
2020-05-30T15:34:20.8062484Z   48:     dfhub = {
2020-05-30T15:34:20.8062727Z   49:       disabled     = false
2020-05-30T15:34:20.8065156Z   50:       identity_ids = [local.identity_id]
2020-05-30T15:34:20.8065370Z   51:     }
2020-05-30T15:34:20.8065459Z   52:   }
2020-05-30T15:34:20.8065538Z 

我从terraform抱怨的错误中了解到,因为我没有在输入中指定new属性的值。

因此,有三种解决方案:

  1. 更新所有现有代码以添加新属性-毫无疑问。
  2. 用不同的方式标记模块的新版本,并让新代码引用新标记,而旧代码继续引用旧标记-从长远来看,这将导致标记激增,从而在特征中创建各种奇异的笛卡尔乘积标签名称。最终-毫无疑问。
  3. 通过注释掉可选属性并try在代码中使用放宽输入变量架构

最后一个选项并不理想,因为该模块的文档不会列出可选属性。但是从代码管理的角度来看,这是最好的。

所以问题是-输入对象属性可以定义为可选的吗?理想情况下,它应该包含默认值,但是我现在可以使用该try方法。

编辑1

我实际上以为可以在对象中传递未知的属性,但不能。一旦给出了模式,就无非就是了。因此,唯一向后兼容的解决方案是map(any)在我的情况下使用

清除棕褐色

已为Terraform建议了对象变量中的可选参数:https :
//github.com/hashicorp/terraform/issues/19898

不幸的是,截至2020年5月30日,这方面还没有任何进展。
这是他们的回购计划中最受争议的问题,我们所能做的就是继续投票,并希望很快会实施。

而且您是对的,其他选择完全是不可能的,或者是毫无用处的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不破坏现有客户端代码的情况下将类转换为模板类(c++17 之前)?

如何在不破坏客户端代码的情况下拆分大型程序包?

如何在不破坏现有HTML的情况下更改DOM中的所有文本?

如何在不立即保存的情况下将文件发送到客户端

如何在不破坏现有设置的情况下更改akka-scala响应模型

如何在不破坏循环的情况下返回变量?

如何在没有REST客户端的情况下演示REST API

OAuth2 - 如何在没有客户端密码的情况下授权?

如何在没有任何JQuery Lib的情况下知道实际的客户端高度?

如何在不停机的情况下更改 elasticsearch 集群中现有节点的节点类型(数据、主节点或客户端)?

如何在不破坏客户报告的情况下更新客户的Power BI文件?

节点中的Redis - 快递。如何在不初始化客户端的情况下扫描密钥

如何在不创建服务器的情况下测试客户端应用程序?

如何在不阻止服务器的情况下通过tcp将数据发送到客户端?

如何在不破坏标签文本的情况下缩短数字输入框的输入字段?

如何在没有客户端身份验证的情况下从服务器认证Firebase用户?

CXF RESTful客户端-如何在没有Spring的情况下进行基本的http认证?

如何在没有SSL Manager插件的情况下使用HTTP Sender提交客户端证书?

如何在没有手动转换为JSON的情况下使用Jersey客户端发布Pojo?

如何在没有域名的情况下进行客户端-服务器通信

如何在没有邮件接收客户端的情况下验证Mandrill自定义发送域?

如何在没有任何身份验证尝试的情况下获取boto3 STS客户端?

如何在没有数据库的情况下安装MySQL客户端(在Windows Server上)

如何在没有风险的情况下将ip(客户端)存储在数据库中

如何在不破坏DataFrame.append()的情况下继承或扩展熊猫DataFrame?

如何在不扩展扩展的情况下避免对客户发出过时的警告

如何在不使用 Stripe 的 UI 层的情况下获取客户端令牌?

如何在启用keepalive选项的情况下检测死客户端

如何在不将凭据存储在本地的情况下建立google oAuth客户端?