文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何为地图值的地图创建自定义 terraform 数据源提供程序架构?

2024-02-10 11:05

关注

php小编香蕉今天将为您介绍如何为地图值的地图创建自定义terraform数据源提供程序架构。在使用Terraform进行基础设施编排时,我们经常需要获取来自外部系统或服务的数据来进行动态配置。而自定义数据源提供程序可以帮助我们实现这一目标。通过创建自定义数据源提供程序架构,我们可以轻松地从地图值的地图上获取所需的数据,并将其应用于我们的Terraform配置中。接下来,让我们一起来了解如何实现吧!

问题内容

我有一个 golang 函数,它返回 map[string]map[string]string 类型的角色

例如:

map[foo:map[name:abc env:dev id:465 project:e-1] boo:map[name:def env:prd id:82 project:e-1] :doo[name:ght env:stg id:353 project:e-3]]

我为它创建了一个架构,如下所示...

func datasourceaccounthelper() *schema.resource {
    return &schema.resource{
        read: accounthelperread,

        schema: map[string]*schema.schema{
        
            "roles": {
                type: schema.typemap,
                elem: &schema.schema{
                    type:     schema.typemap,
                    computed: true,
                    elem: &schema.schema{
                        type: schema.typestring,
                    },
                },

                computed: true,
            },

            "id": &schema.schema{
                computed: true,
                type:     schema.typestring,
            },
        },
    }
}

以及将角色值传递给架构的创建方法

func rolesread(d *schema.resourcedata, m interface{}) error {
    filteredroles := filteraccounts("john") // returns `map[string]map[string]string`



    if err := d.set("account_map", filteredroles); err != nil {
        return err
    }

    //accountmaps := make(map[string]interface{})

    d.setid("-")

    return nil
}

但是 terraform 输出是一个空地图,我该如何修复它,请帮忙:)

outputs:

output = {
  "roles" = tomap(null) 
  "id" = tostring(null)
}

期望输出如下

Outputs:

output = {
  "roles" = { foo    = {name = "abc" env = "dev" id= 465 project = "e-1"}
              boo    = {name = "efg" env = "prd" id= 82 project = "e-2"}       
            },
  "id" = "-"
}

解决方法

您正在使用的旧版 terraform sdk 无法实现您在此处尝试执行的操作。映射只能是基本类型:typestringtypeinttypebool

要创建此结构,您需要迁移到新框架,它是为现代 terraform 的类型系统构建的,而不是(如 sdkv2 的情况)经典 terraform v0.11 及更早版本的类型系统。

在 terraform 插件框架中,与您尝试在此处描述的结构等效的结构是 mapnestedattribute,以下内容描述了您在问题中显示的架构结构:

schema.mapnestedattribute{
    nestedobject: schema.nestedattributeobject{
        attributes: map[string]schema.attribute{
            "name": schema.stringattribute{
                // ...
            },
            "env": schema.stringattribute{
                // ...
            },
            "id": schema.numberattribute{
                // ...
            },
            "project": schema.stringattribute{
                // ...
            },
        },
    },
}

这表示具有给定属性的对象的映射,因此上述模式类型相当于以下类型约束,可以使用 terraform 语言的类型约束语法:

map(
  object({
    name    = string
    env     = string
    id      = number
    project = string
  })
)

以上就是如何为地图值的地图创建自定义 terraform 数据源提供程序架构?的详细内容,更多请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯