使资源架构依赖于另一个变量

时间:2018-12-28 07:58:20

标签: terraform

我要在terraform中创建一个插件,并说我想添加一个仅在提供另一个模式时才能调用的模式。

"host_name": &schema.Schema{
    Type:        schema.TypeString,
    Optional:    true,
    DefaultFunc: schema.EnvDefaultFunc("host_name", nil),
    Description: "Should give name in FQDN if being used for DNS puposes .",
},
"enableDns": &schema.Schema{
   Type:        schema.TypeString,
   Required:    true,
   DefaultFunc: schema.EnvDefaultFunc("host_name", nil),
   Description: "Should give name in FQDN if being used for DNS puposes .",

所以在这里,我只想在传递host_name时才在.tf文件中传递enableDNs字符串,如果未给出并且我传递enableDNs它将引发错误,有人可以指出我的做法

1 个答案:

答案 0 :(得分:0)

Terraform提供商实际上没有一流的方法来根据ConflictsWith属性以外的其他参数有条件地进行操作。

有一种使用CustomizeDiff进行交叉参数处理的方法,但是它仅在真正需要的几个地方使用。

通常,提供程序将简单地验证各个参数,并且如果提供程序正在使用的API需要交叉参数验证,那么只有在应用程序返回API错误时才能看到此验证。

有关在进行交叉参数验证时使用CustomizeDiff引发计划时间错误的示例,请参见the aws_elasticache_cluster resource

    CustomizeDiff: customdiff.Sequence(
        func(diff *schema.ResourceDiff, v interface{}) error {
            // Plan time validation for az_mode
            // InvalidParameterCombination: Must specify at least two cache nodes in order to specify AZ Mode of 'cross-az'.
            if v, ok := diff.GetOk("az_mode"); !ok || v.(string) != elasticache.AZModeCrossAz {
                return nil
            }
            if v, ok := diff.GetOk("num_cache_nodes"); !ok || v.(int) != 1 {
                return nil
            }
            return errors.New(`az_mode "cross-az" is not supported with num_cache_nodes = 1`)
        },