当前位置: 首页 > news >正文

Terraform 系列-批量创建资源时如何根据某个字段判断是否创建

系列文章

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

概述

前文 Grafana 系列 - Grafana Terraform Provider 基础 介绍了使用 Grafana Terraform Provider 创建 Datasource.

这几天碰到这么一个现实需求:

使用 Terraform 批量创建日志数据源时, 有的数据源类型是 ElasticSearch, 有些是 Opensearch. 那么, 如何根据某个字段(如:es_type)判断是否创建?

另外, 建议您先阅读前一篇文章: Terraform 系列 - 使用 for-each 对本地 json 进行迭代 方便快速了解上下文背景.

创建数据源的数据来源是个 json, json 通过前一篇文章的转换, 格式类似于这样:

{"dev": {"env_name": "dev","prom_url": "http://dev-prom.example.com","jaeger_url": "http://dev-jaeger.example.com","es_url": "http://dev-es.example.com:9200","es_type": "elasticsearch"},"test": {"env_name": "test","prom_url": "http://test-prom.example.com","jaeger_url": "http://test-jaeger.example.com","es_url": "http://test-es.example.com:9200","es_type": "opensearch"}
}

该如何实现?🤔

解决方案

使用: for 循环 + if 重构 map.

具体如下:

  • 批量创建资源时,通过 for_each, 进行批量创建。
  • 但是在 for_each 时, 通过 for 循环 + if 重构 map, 通过 local.env.es_type 判断是否创建.

具体如下:

locals {# 将 json 文件转换为 对象  user_data = jsondecode(file("${path.module}/env-details.json"))# 构造一个 map# key 是 env_name# value 又是一个 map, 其 key 是 grafana datasource type, value 是 urlenvs = { for env in local.user_data : env.env_name =>{prometheus = env.prom_url# 利用 ${} 构造新的 urljaeger     = "${env.jaeger_url}/trace/"es         = env.es_urles_type    = env.es_type}}
}resource "grafana_data_source" "elasticsearch" {for_each = {for env_name, env_info in local.envs : env_name => env_infoif env_info.es_type == "elasticsearch"}type          = "elasticsearch"name          = "${each.key}_es"uid           = "${each.key}_es"url           = each.value.esdatabase_name = "[example.*-]YYYY.MM.DD"json_data_encoded = jsonencode({esVersion = "6.0.0"interval = "Daily"includeFrozen              = falsemaxConcurrentShardRequests = 256timeField                  = "@timestamp"logLevelField   = "level"logMessageField = "message"})
}resource "grafana_data_source" "opensearch" {for_each = {for env_name, env_info in local.envs : env_name => env_infoif env_info.es_type == "opensearch"}type = "grafana-opensearch-datasource"name = "${each.key}_opensearch"uid  = "${each.key}_opensearch"url  = each.value.esbasic_auth_enabled  = truebasic_auth_username = "readonly"json_data_encoded = jsonencode({database = "[example.*-]YYYY.MM.DD"version  = "6.8.0"flavor   = "elasticsearch"interval = "Daily"pplEnabled                 = truemaxConcurrentShardRequests = 256timeField                  = "@timestamp"logLevelField   = "level"logMessageField = "message"})secure_json_data_encoded = jsonencode({basicAuthPassword = "Changeme!"})
}

不要看到这么长的代码就头晕, 很多跟本次没啥关系. 实现的关键就在于如下代码段:

  for_each = {for env_name, env_info in local.envs : env_name => env_infoif env_info.es_type == "elasticsearch"}

还是很直白易懂的, 就不详细说明了. 如果 es_typeelasticsearch, 才把这个对象构造到 map 中.

之后, 对于不同的 DataSource type, 会有不同的参数, 如上文:

  • Opensearch 具有和 ES 不同的 type, Opensearch 加了认证
  • Opensearch 里是 database 字段而不是 database_name
  • Opensearch 里额外还有 flavor 字段和 pplEnabled 字段.

解决方案二

如果您的原始数据, 或者构造后的 localslist 而不是 map.

那么也可以使用: count + condition ? true_val : false_val 条件表达式完成同样的功能.

示例如下:

通过 var.cloudflare 的值是 true 还是 false 来判断.

resource "cloudflare_record" "record" {count = var.cloudflare ? 1 : 0zone_id = "${data.cloudflare_zones.domain.zones[0].id}"name    = "${var.subdomain}"value   = "${var.origin_server}"type    = "CNAME"ttl     = 1proxied = true
}

关键点是: count = var.cloudflare ? 1 : 0 条件表达式.

也很清晰明了.

完成🎉🎉🎉

📚️参考文档

  • Terraform: Conditional creation of a resource based on a variable in .tfvars - Stack Overflow
  • Conditionally create resources when a for_each loop is involved - Terraform - HashiCorp Discuss

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

相关文章:

Terraform 系列-批量创建资源时如何根据某个字段判断是否创建

系列文章 Terraform 系列文章Grafana 系列文章 概述 前文 Grafana 系列 - Grafana Terraform Provider 基础 介绍了使用 Grafana Terraform Provider 创建 Datasource. 这几天碰到这么一个现实需求: 使用 Terraform 批量创建日志数据源时, 有的数据源类型是 El…...

Android侧滑栏(一)可缩放可一起移动的侧滑栏

在实际的各类App开发中,经常会需要做一个左侧的侧滑栏,类似于QQ这种。 今天这篇文章总结下自己在开发中遇到的这类可以跟随移动且可以缩放的侧滑栏。 一、实现原理 使用 HorizontalScrollView 实现一个水平方向的可滑动的View,左布局为侧滑…...

简单程度与自负是否相关?探索STM32的学习价值

事实上,无论STM32是否简单并不重要,更重要的是我们能通过学习STM32获得什么。通过STM32,我们可以学习到许多知识:如果我们制作一个键盘或鼠标,我们可以学习USB协议。如果我们制作一个联网设备,我们需要学习…...

第二章:CSS基础进阶-part3:弹性例子布局

文章目录 Flex盒模型二、常见属性2.1 flex属性2.2 justify-content2.3 flex-wrap2.4 flex-flow2.5 align-items2.6 父容器-align-content Flex盒模型 1、普通盒模型 2、弹性盒布局 使用弹性盒布局能让容器的宽度跟随浏览器窗口的变化而变换 二、常见属性 2.1 flex属性 2.2 …...

函数与方法有区别?

有区别,当然是有区别。 不管是java、rust还是go,他们都是不一样的。 先看定义: 函数(Function) 是一段独立的代码块,用于执行特定的任务。函数可以被多次调用,并且可以接受参数和返回结果。在G…...

VMware vCenter忘记密码操作,和Linus原理一致

mount -o remount,rw / passwd root ## 修改 root 密码要选择对应账户## 输入新密码,再输入一次新密码 umount / ## 卸载根文件系统 reboot -f ## 重新引导 vCenter...

Bert详细学习及代码实现详解

BERT概述 BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为decoder是不能获要预测的信息的。在大型语料库(Wikipedia BookCorpus)上训练一个大型模型(12 层到 …...

Vue [Day7] 综合案例

核心概念回顾 state:提供数据 getters:提供与state相关的计算属性 mutations:提供方法,用于修改state actions:存放异步操作 modules:存模块 功能分析 https://www.npmjs.com/package/json-server#ge…...

基于R做宏基因组的进化树ClusterTree分析

写在前面 同上一篇的PCoA分析,这个也是基于公司结果基础上的再次分析,重新挑选样本,在公司结果提供的csv结果表上进行删减,本地重新分析作图 步骤 表格预处理 在公司给的ClusterTree的原始表格数据里选取要保留的样本&#xf…...

栈和队列修炼指南(基本操作+OJ练习)

栈和队列修炼指南 1. 栈 1. 1 概念及结构 栈:是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端称为栈顶,另一端为栈底。 栈中的数据元素遵守后进先出原则(LIFO)原则 压栈:栈的…...

伪类和伪元素有何区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 伪类(Pseudo-class)⭐ 伪元素(Pseudo-element)⭐ 区别总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前…...

自动测试框架airtest应用一:将XX读书书籍保存为PDF

一、Airtest的简介 Airtest是网易出品的一款基于图像识别和poco控件识别的一款UI自动化测试工具。Airtest的框架是网易团队自己开发的一个图像识别框架,这个框架的祖宗就是一种新颖的图形脚本语言Sikuli。Sikuli这个框架的原理是这样的,计算机用户不需要…...

ValueError:The following settings are not supported :{‘username‘: ‘neo4j“}

py2neo版本不同所导致的问题,下面我通过一段代码说明该问题。 import py2neoif py2neo.__version__ 4.3.0:graph Graph(http://localhost:7474, username config.neo4j_username, password config.neo4j_password) elif py2neo.__version__ 2021.2.3:graph G…...

360安全卫士右下角广告弹窗太多怎么彻底关闭?

360安全卫士右下角广告弹窗太多怎么彻底关闭? 1、卸载360安全卫士,选择继续卸载,并点击下一步; 2、选择广告弹窗太多,并点击下一步; 3、然后被告知升级极速版永久去广告,可以点击一键去广告。 …...

链表有无环以及确定入环口详解

142.环形链表 II 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测…...

chrome插件开发实例08- 使用Vue.js开发chrome插件

目录 背景 演示 功能介绍 插件下载 注意写法: 背景 将 下面的两个插件 改写成vue.js , elementui 实现chrome插件开发实例0...

PCL 计算外接圆的半径

目录 一、算法原理1、计算公式2、主要函数3、源码解析二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。爬虫自重。 一、算法原理 1、计算公式...

Matlab实现神经网络SOM算法(附上完整仿真源码)

神经网络SOM算法是一种基于自组织的无监督学习算法,其全称为Self-Organizing Map,可以用来对数据进行聚类和可视化。本文将介绍如何使用Matlab实现神经网络SOM算法。 文章目录 一、准备工作二、数据准备三、SOM算法实现四、聚类结果分析五、总结六、完整…...

【遍历】非递归法 二叉树的前中后序遍历

文章目录 非递归法前序遍历后序遍历中序遍历 递归法DFS 非递归法 通过栈Stack来模拟递归。 前序遍历 LeetCode 144 前序遍历:1 2 3 定义:存放答案的List、栈Stack 将root入栈出栈:node,为null则舍弃将node放入list将node.r…...

Python将tiff转换成png

文章目录 问题描述解决方案压缩并转换参考文献 问题描述 base64 的 image/tiff 无法在页面直接展示,将其转换为 image/png 解决方案 from io import BytesIOfrom PIL import Imagewith Image.open(a.tiff) as image:bytesIO BytesIO()image.save(bytesIO, format…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

C++中vector类型的介绍和使用

文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...

【Vue】scoped+组件通信+props校验

【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性&#xff0c; 令样式只作用于当前组件的标签 作用&#xff1a;防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…...