Terraform 系列-使用Dynamic Blocks对Blocks进行迭代

系列文章

  • Terraform 系列文章
  • Grafana 系列文章

概述

Terraform 系列文章 介绍了使用 Grafana Terraform Provider, 基于 Terraform 的 IaC 方法论, 来批量自动化创建 Grafana 的各类资源, 包括 Dashboard/Datasource 等.

现在有这么一个现实需求:

出于权限控制的需求, 需要启用 Folder Permissions, 限制指定的某几个 team 可以有该 Folder 的 view 权限.

该如何实现?🤔

解决方案

通过 Terraform 的 for_eachdynamic blocks 实现.

基本概念

Dynamic Blocks

在资源(resource)等顶级块结构中,表达式通常只能在使用 name = expression 形式为参数赋值时使用。这涵盖了许多用途,但有些资源类型的参数中包含可重复嵌套的块(block),这些块通常代表与包含对象相关(或嵌入其中)的独立对象:

resource "aws_elastic_beanstalk_environment" "tfenvtest" {name = "tf-test-name" # can use expressions heresetting {# but the "setting" block is always a literal block}
}

您可以使用特殊的 dynamic 块类型动态构建可重复嵌套的块,如resourcedataproviderprovisioner 块都支持这种类型:

resource "aws_elastic_beanstalk_environment" "tfenvtest" {name                = "tf-test-name"application         = "${aws_elastic_beanstalk_application.tftest.name}"solution_stack_name = "64bit Amazon Linux 2018.03 v2.11.4 running Go 1.12.6"dynamic "setting" {for_each = var.settingscontent {namespace = setting.value["namespace"]name = setting.value["name"]value = setting.value["value"]}}
}

动态块的作用与for表达式很相似,但它产生的是嵌套代码块,而不是复数值。它遍历给定的复数值,并为复数值的每个元素生成一个嵌套块。

  • 动态代码块的标签(上例中的 "setting")指定了要生成的嵌套代码块的类型。
  • for_each "参数提供了要遍历的复合值。
  • iterator 参数(可选)设置了一个临时变量的名称,该变量代表复数值的当前元素。如果省略,变量名默认为 dynamic 块(上例中为 "setting")的标签。
  • labels 参数(可选)是一个字符串列表,它按顺序指定了要用于每个生成块的块标签。你可以在此值中使用临时迭代变量。
  • 嵌套的 content 块定义了每个生成块的主体。你可以在此块中使用临时迭代变量。

由于 for_each 参数可接受任何集合或结构值,因此可以使用 for 表达式或 splat 表达式来转换现有集合。

迭代器对象(上例中的 setting)有两个属性:

  • key 是当前元素的映射键或列表元素索引。如果 for_each 表达式产生了一个 set 值,则 keyvalue 相同。
  • value 是当前元素的值。

dynamic 代码块只能生成属于正在配置的 resource 类型、data 源、provider 或 provisioner 的参数。不能生成 meta-argument 块,如lifecycleprovisioner块,因为 Terraform 必须先处理这些参数块,然后才能安全地评估表达式。

for_each 值必须是一个集合,每个所需的嵌套块包含一个元素。如果需要根据嵌套数据结构或多个数据结构的元素组合声明资源实例,可以使用 Terraform 表达式和函数推导出合适的值。有关此类情况的一些常见示例,请参阅 flattensetproduct函数。

有些提供程序定义的资源类型包括相互嵌套的多层区块。您可以在必要时动态生成这些嵌套结构,方法是将 dynamic 模块嵌套在其他 dynamic 模块的 content 部分中。

例如,一个模块可能会接受如下复杂的数据结构:

variable "load_balancer_origin_groups" {type = map(object({origins = set(object({hostname = string}))}))
}

如果要定义一个 resource,其类型需要为每个 origin group 创建一个块,然后为组内的每个 origin 创建嵌套块,则可以要求 Terraform 使用以下嵌套的 dynamic 块动态生成该资源:

  dynamic "origin_group" {for_each = var.load_balancer_origin_groupscontent {name = origin_group.keydynamic "origin" {for_each = origin_group.value.originscontent {hostname = origin.value.hostname}}}}

在使用嵌套的 dynamic 代码块时,尤其要注意每个代码块的迭代符号。在上例中,origin_group.value 指向外层代码块的当前元素,而 origin.value 指向内层代码块的当前元素。

如果一个特定的资源类型定义了嵌套块,而这些嵌套块的类型名称与其父类中的一个类型名称相同,则可以在每个 dynamic 块中使用 iterator 参数来选择一个不同的迭代器符号,使两者更容易区分。

过度使用 dynamic 块会使配置变得难以阅读和维护,因此我们建议仅在需要隐藏细节以便为可重用模块构建简洁的用户界面时使用它们。在可能的情况下,一定要按字面意思写出嵌套模块。

实战

需求:

出于权限控制的需求, 需要启用 Folder Permissions, 限制指定的某几个 team 可以有该 Folder 的 view 权限.

对应的 Terraform 代码如下:

locals {teams = {"dev","busi","ops","data","pm"}
}resource "grafana_folder_permission" "foldersPermission" {folder_uid = "demo"dynamic "permissions" {for_each = local.teamscontent {team_id    = grafana_team.teams[each.key].idpermission = "View"}}
}

说明:

  • permissions (Block Set, Min: 1) 要添加/更新的权限项目。列表中没有的项目将被删除。

完成🎉🎉🎉

📚️参考文档

  • Dynamic Blocks - Configuration Language | Terraform | HashiCorp Developer
  • grafana_dashboard_permission | Resources | grafana/grafana | Terraform | Terraform Registry

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 22.04 安装 Terraform

Ubuntu 22.04 安装 Terraform 安装 Terraform 安装 Terraform sudo apt updatesudo apt install software-properties-common gnupg2 curlcurl https://apt.releases.hashicorp.com/gpg | gpg --dearmor > hashicorp.gpgsudo install -o root -g root -m 644 hashicorp.gpg…

shell_62.shell脚本生成一个标准的 SQL INSERT 语句

无论是将文件读入脚本,还是将数据从脚本输出到文件,都会用到文件重定向,这是一种很 常见的操作。本节中的示例脚本两种功能皆有。它会读取 CSV 格式的数据文件,输出 SQL INSERT 语句,并将数据插入数据库。 shell 脚本使…

数字展厅搭建平台要具备哪些功能,如何选择数字展厅搭建平台

引言: 数字展厅搭建平什台是现代营销中不可或缺的重要工具之一。它可以帮助企业打造个性化、多媒体、互动性强的展示空间,吸引、引导和留住目标用户。在选择数字展厅搭建平台时,我们需要考虑各方面的功能和性能,以确保能够满足企业的需求并取…

面试算法47:二叉树剪枝

题目 一棵二叉树的所有节点的值要么是0要么是1,请剪除该二叉树中所有节点的值全都是0的子树。例如,在剪除图8.2(a)中二叉树中所有节点值都为0的子树之后的结果如图8.2(b)所示。 分析 下面总结什么样的节…

全网公开电商数据的采集重点

数据的采集是根据需求而定的,品牌会做数据采集的原因,一般与内部营销、渠道管控有关,如需要做价格管控时,需要先采集价格,这就需要对数据进行采集,包括价格、促销信息,又或者是需要做行业分析、…

typing.Union` 标注一多种变量类型

typing.Union 标注一多种变量类型 typing.Union 是Python typing 模块中用于标注一个变量可以是多种类型之一的类型提示。在Python 3.10版本及以后,推荐使用 | 运算符代替 Union。不过,在详细介绍 Union 的用法前,值得注意的是在大多数情况下…

PHP连接SQLServer echo输出中文汉字显示乱码解决方法

1、查询结果有中文会显示乱码。 解决方法一&#xff08;较简单&#xff0c;建议使用&#xff09;&#xff1a; 在php文件最开头写上&#xff1a; header(Content-type: text/html; charsetUTF8); // UTF8不行改成GBK试试&#xff0c;与你保存的格式匹配 <?php header(&q…

matab读取包含struct混合类型的mat文件转为txt文件

现有一个mat文件&#xff0c;其内容如下&#xff1a; 目标&#xff1a;要将data.mat中的Obs_Iridium_A转为文本格式。 分析&#xff1a; data.mat里面包含了4个struct结构的成员&#xff0c;Obs_Iridium_A是其中之一&#xff0c;Obs_Iridium_A为1*7496维&#xff0c;7496代表…

波浪理论第3波anzo capital昂首资本3个方法3秒确认

要想通过波浪理论在交易中赚取最大利润&#xff0c;确认第三波必不可少&#xff0c;因为第三波通常是趋势中最大和最强的一波&#xff0c;今天anzo capital昂首资本3个方法3秒确认。 首先&#xff0c;第一个确认方法—斜率。 通常&#xff0c;第三波的斜率会比第一波更陡峭&a…

Linux内核是如何创建进程?

目录 1.Linux如何创建进程 2.fork函数原理 2.1 fork函数原型 2.2 fork函数实现原理 2.3 父子进程虚拟地址空间&#xff08;mm_struct&#xff09;之间的关系 2.4 写时拷贝&#xff08;copy-on-write&#xff09;技术 2.5 父子进程如何共享文件&#xff08;files_struct&…

06、Caused by: java.nio.charset.MalformedInputException: Input length = 1

目录 问题&#xff1a;原因&#xff1a;解决方法&#xff1a; 问题&#xff1a; Caused by: java.nio.charset.MalformedInputException: Input length 1 原因&#xff1a; 应该是中文有哪些文字导致的。 yml 编码格式出错 解决方法&#xff1a; 直接这里把GBK改成 utf-8…

unordered系列关联式容器--哈希结构详细讲解及使用示例

目录 unordered系列关联式容器unordered_map 哈希哈希概念哈希函数直接定址法&#xff1a;除留余数法&#xff1a; 哈希冲突解决哈希冲突闭散列&#xff1a;开散列&#xff1a; unordered系列关联式容器 之前讲解在C98中STL提供了底层为红黑树结构的一系列关联式容器&#xff…

vue按需加载组件

写vue时候&#xff0c;通常会进行路由懒加载&#xff0c;如下&#xff1a; {path: /settlementCenter/offCompensationSettlement,name: XXX,component: () >import(/view/settlementCenter/settlement/offCompensationSettlement.vue),meta: {}},写vue代码页面时&#xff0…

Nginx域名重定向(如何访问的域名和实际的数据请求路径不同,可解决前端跨域)

感情需要被抑制&#xff0c;不能泛滥… 当需要将一个域名重定向到另一个域名并且用户仍然看到原始域名时&#xff0c;Nginx是一个强大的工具。这种场景通常涉及到反向代理或重写URL的技巧。在本篇博客中&#xff0c;我们将详细介绍如何使用Nginx来实现这个目标&#xff0c;以及…

Navicat安装和使用

获取安装包打开这个地址 https://wp.hellocode.name/?page_id1349 Navicat是一款功能强大的数据库管理工具,它可以让您更方便地管理MySQL、MariaDB、SQL Server、Oracle、PostgreSQL等数据库。下面我来给您简单介绍一下Navicat的主要功能和使用方法: 一、建立数据库连接 首先…

精品基于Python的考场考试分配规划系统

《[含文档PPT源码等]精品基于Python的考场分配规划系统的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技…

合肥工业大学离散数学总评报告

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :hfut实验课设 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少…

深入理解JVM虚拟机第十四篇:虚拟机栈的特点和详细介绍(一)

大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻JavaScript 本文章简介:话不多说,让我们讲清楚JavaScript里边的Math 文章目…

非负的整型怎么定义字段类型?状态只有0和1?还有只有几个状态?几十个状态?

对于非负的整型数据&#xff1a; TINYINT UNSIGNED&#xff1a;MySQL中的一种整数数据类型&#xff0c;用于存储非负整数&#xff0c;取值范围为0到255。这个类型通常用于存储小范围的非负整数&#xff0c;如0到100之间的数值。SMALLINT UNSIGNED&#xff1a;MySQL中的另一种整…

234. 回文链表

Problem: 234. 回文链表 文章目录 解题方法复杂度Code 解题方法 找到链表的中点&#xff1a;首先&#xff0c;我们可以使用快慢指针技巧来找到链表的中点。慢指针每次移动一步&#xff0c;快指针每次移动两步。当快指针到达链表的末尾时&#xff0c;慢指针就会指向链表的中点。…