使资源架构依赖于另一个变量 [英] Make a resource schema dependant on another variable

查看:23
本文介绍了使资源架构依赖于另一个变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要在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时才传递enableDns文件中的enableDns字符串。如果未给出它,并且我通过了enableDns,则它应该在计划期间引发错误。

推荐答案

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`)
        },

这篇关于使资源架构依赖于另一个变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆