Terraform 系列-批量创建资源时如何根据某个字段判断是否创建
系列文章
概述
前文 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 是 url
envs = { for env in local.user_data : env.env_name =>
{
prometheus = env.prom_url
# 利用 ${} 构造新的 url
jaeger = "${env.jaeger_url}/trace/"
es = env.es_url
es_type = env.es_type
}
}
}
resource "grafana_data_source" "elasticsearch" {
for_each = {
for env_name, env_info in local.envs : env_name => env_info
if env_info.es_type == "elasticsearch"
}
type = "elasticsearch"
name = "${each.key}_es"
uid = "${each.key}_es"
url = each.value.es
database_name = "[example.*-]YYYY.MM.DD"
json_data_encoded = jsonencode({
esVersion = "6.0.0"
interval = "Daily"
includeFrozen = false
maxConcurrentShardRequests = 256
timeField = "@timestamp"
logLevelField = "level"
logMessageField = "message"
})
}
resource "grafana_data_source" "opensearch" {
for_each = {
for env_name, env_info in local.envs : env_name => env_info
if env_info.es_type == "opensearch"
}
type = "grafana-opensearch-datasource"
name = "${each.key}_opensearch"
uid = "${each.key}_opensearch"
url = each.value.es
basic_auth_enabled = true
basic_auth_username = "readonly"
json_data_encoded = jsonencode({
database = "[example.*-]YYYY.MM.DD"
version = "6.8.0"
flavor = "elasticsearch"
interval = "Daily"
pplEnabled = true
maxConcurrentShardRequests = 256
timeField = "@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_info
if env_info.es_type == "elasticsearch"
}
还是很直白易懂的, 就不详细说明了. 如果 es_type 是 elasticsearch, 才把这个对象构造到 map 中.
之后, 对于不同的 DataSource type, 会有不同的参数, 如上文:
- Opensearch 具有和 ES 不同的
type, Opensearch 加了认证 - Opensearch 里是
database字段而不是database_name - Opensearch 里额外还有
flavor字段和pplEnabled字段.
解决方案二
如果您的原始数据, 或者构造后的 locals 是 list 而不是 map.
那么也可以使用: count + condition ? true_val : false_val 条件表达式完成同样的功能.
示例如下:
通过 var.cloudflare 的值是 true 还是 false 来判断.
resource "cloudflare_record" "record" {
count = var.cloudflare ? 1 : 0
zone_id = "${data.cloudflare_zones.domain.zones[0].id}"
name = "${var.subdomain}"
value = "${var.origin_server}"
type = "CNAME"
ttl = 1
proxied = 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
Terraform 系列-批量创建资源时如何根据某个字段判断是否创建的更多相关文章
- MySQL 创建表时,设置时间字段自己主动插入当前时间
MySQL 创建表时,设置时间字段自己主动插入当前时间 DROP TABLE IF EXISTS `CONTENT`; CREATE TABLE `CONTENT` ( `ID` char(20) N ...
- 如何在调用Marketing Cloud contact创建API时增加对扩展字段的支持
需求:扩展字段"微信ID"是我创建出来的extension field,我想用Marketing Cloud提供的contact creation API,在创建contact时也 ...
- mysql 约束条件 auto_increment 自动增长 创建表时设置自增字段
auto_increment mysql) )auto_increment; Query OK, rows affected (0.01 sec) mysql> show create tabl ...
- C# 创建文件时,文件夹不存在,如何自动创建文件夹
c# 创建文件时怎么创建文件夹?strhtml=......StreamWriter sw=new StreamWriter("D:/test/1.aspx",false);sw. ...
- Terraform 系列-Terraform 简介
系列文章 Terraform 系列文章 前言 最近在使用 Terraform 来置备 OCI 的 Always Free Tier, 发现它非常好用.总结学习下:Terraform 的基础知识. 什么 ...
- Terraform 系列-Terraform Cloud 比 Terraform OSS 有哪些增强?
系列文章 Terraform 系列文章 前言 最近在使用 Terraform Cloud 来置备 OCI 的 Always Free Tier, 发现它非常好用,相比 Terraform OSS, 用 ...
- kubernetes系列08—service资源详解
本文收录在容器技术学习系列文章总目录 1.认识service 1.1 为什么要使用service Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结 ...
- kubernetes系列06—kubernetes资源清单定义入门
本文收录在容器技术学习系列文章总目录 1.认识kubernetes资源 1.1 常用资源/对象 workload工作负载型资源:pod,ReplicaSet,Deployment,StatefulSe ...
- Terraform 系列-什么是 IaC?
系列文章 Terraform 系列文章 前言 聊到 Terraform, 必然绕不开 IaC 这个概念?那么,什么是 IaC? 基本概念 基础架构即代码 (Infrastructure as Code ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
随机推荐
- centos 添加 公钥,root不用输入密码 ssh-keygen
centos 添加 公钥,root不用输入密码 ssh-keygen -t rsa -C "yourEmail" 一通回车后,生成 C:\Users\Reciter/.ssh/id ...
- C#实现FTP服务端和客户端
目录 简介 FTP客户端 系统客户端 客户端软件 自定义客户端 FTP服务端 系统服务端 服务端软件 自定义服务端 附件 简介 FTP是FileTransferProtocol(文件传输协议)的英文简 ...
- 使用gradle打包springboot项目
这边整理下自己项目使用gradle打jar包的坎坷经历,使用的方式是命令行的方式 首先配置build.gradle跟我一样 plugins { id 'java' id 'org.springfram ...
- Java加密技术(二)——对称加密算法DES&AES
desdesedejavaaes 接下来我们介绍对称加密算法,最常用的莫过于DES数据加密算法. DES DES-Data Encryption Standard,即数据加密算法.是IBM公司 ...
- [TM4]TM4C123G使用笔记
[TM4]TM4C123G使用笔记 TI的板子真让人头大甚至重装了两遍KEIL5 如何用keil5新建工程可以参考如下博客: https://blog.csdn.net/D_XingGuang/art ...
- 深度学习论文翻译解析(二十一):High-Performance Large-Scale Image Recognition Without Normalization
论文标题:High-Performance Large-Scale Image Recognition Without Normalization 论文作者:Andrew Brock Soham De ...
- 【Leetcode】63. 不同路径 II
题目(链接) 一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 "Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为 ...
- 记录-css实现交融文字效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 CSS是有魔法的,我们今天来实现一个CSS的动画效果,只需要几行代码就可以搞定. 第一步.我们要将一行文字从中间展开 <!DOCTY ...
- 记一次 .NET某半导体CIM系统 崩溃分析
一:背景 1. 讲故事 前些天有一位朋友在公众号上找到我,说他们的WinForm程序部署在20多台机器上,只有两台机器上的程序会出现崩溃的情况,自己找了好久也没分析出来,让我帮忙看下怎么回事,就喜欢这 ...
- APP备案通知
截至2024年4月1日前,所以已上市APP均需备案,未备案的可以登陆云擎官网进行备案. 关于工信部开展在中华人民共和国境内从事互联网信息服务的APP主办者,应当依法履行备案手续,未履行备案手续的,不得 ...