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 編寫.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38131.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38131.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38131.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MongoDB 數據庫詳細介紹

MongoDB 數據庫詳細介紹 MongoDB(來自“Humongous”,意為巨大的)是一個開源、高性能、無模式(NoSQL)、文檔導向的分布式數據庫。它以其靈活性、可擴展性和強大的查詢功能而聞名于世。MongoDB 使用 JSON 格式的文檔來存…

主從同步介紹、主從同步原理、主從同步結構、構建思路、配置一主一從、配置一主多從、讀寫分離介紹、工作原理、配置mycat服務、添加數據源、創建集群、指定主機角

Top NSD DBA DAY07 案例1:MySQL一主一從案例2:配置一主多從結構案例3:數據讀寫分離 1 案例1:MySQL一主一從 1.1 問題 數據庫服務器192.168.88.53配置為主數據庫服務器數據庫服務器192.168.88.54配置為從數據庫服務器客戶端192…

網絡編程(8.14)TCP并發服務器模型

作業: 1. 多線程中的newfd,能否修改成全局,不行,為什么? 2. 多線程中分支線程的newfd能否不另存,直接用指針間接訪問主線程中的newfd,不行,為什么? 多線程并發服務器模型原代碼&…

排查docker無法啟動問題

查看Linux系統操作日志(最后200行就可以排查): tail -200f /var/log/messages

數據分析--帆軟報表--大數據大屏

進入國企公司學習有一段時間了,崗位是數據分析方向------ 母前使用的是帆軟工具進行的開發。 可以進行大數據大屏 也可使嵌入到手機端。 下面是例子

Python-OpenCV中的圖像處理-GrabCut算法交互式前景提取

Python-OpenCV中的圖像處理-GrabCut算法交互式前景提取 Python-OpenCV中的圖像處理-GrabCut算法交互式前景提取 Python-OpenCV中的圖像處理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…

數據庫連接池

什么是數據庫連接池 使用數據庫連接池的好處是減少了連接的創建和關閉的開銷,提高了數據庫訪問的性能和效率。 為什么我們要使用數據庫連接池 我們使用數據庫連接池的主要原因是為了提高應用程序訪問數據庫的性能和效率。使用數據庫連接池的好處: 連接重用&…

【Apple】Logic Pro導入7.1.4.wav并自動分析多聲道

Step1: 創建空項目 Step2: 選中下圖“使用麥克風或...”這一項,底下要創建的軌道數填1就行。 點擊創建之后: Step3: 拖動文件、拖動文件、拖動文件到項目中,并選中復選框“所有所選文件都源自一個項目(將創建一個智能速度多軌道集…

[NLP]LLM 訓練時GPU顯存耗用量估計

以LLM中最常見的Adam fp16混合精度訓練為例,分析其顯存占用有以下四個部分: GPT-2含有1.5B個參數,如果用fp16格式,只需要1.5G*2Byte3GB顯存, 但是模型狀態實際上需要耗費1.5B*1624GB. 比如說有一個模型參數量是1M,在…

什么是前端框架?怎么學習? - 易智編譯EaseEditing

前端框架是一種用于開發Web應用程序界面的工具集合,它提供了一系列預定義的代碼和結構,以簡化開發過程并提高效率。 前端框架通常包括HTML、CSS和JavaScript的庫和工具,用于構建交互式、動態和響應式的用戶界面。 學習前端框架可以讓您更高效…

nginx的負載均衡

nginx的負載均衡 文章目錄 nginx的負載均衡1.以多臺虛擬機作服務器1.1 在不同的虛擬機上安裝httpd服務1.2 在不同虛擬機所構建的服務端的默認路徑下創建不同標識的文件1.3 使用windows本機的瀏覽器分別訪問3臺服務器的地址 2.在新的一臺虛擬機上配置nginx實現反向代理以及負載均…

使用element UI 的el-upload上傳圖片并攜帶參數的用法

直接看代碼&#xff1a;前端實現 <div class"upload"><el-uploadclass"upload-demo"name"upload_name":data"{user_name:user_name}"action"http://localhost:8000/api/deal_pest_Image":show-file-list"fal…

vb+sql汽車配件管理系統設計與實現

摘 要 目前汽車配件銷售企業大多數在其連鎖店的管理還是手工進行,隨著汽車配件行業的迅速發展,手工管理的種種弊端暴露無疑,給銷售企業的發展帶來了不必要的麻煩。為了規范企業內部管理,提高企業業務管理水平,更好的為客戶服務,應采用計算機來管理汽車配件的進銷存業務。…

【Sklearn】基于樸素貝葉斯算法的數據分類預測(Excel可直接替換數據)

【Sklearn】基于樸素貝葉斯算法的數據分類預測(Excel可直接替換數據) 1.模型原理2.模型參數3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果1.模型原理 模型原理: 樸素貝葉斯分類是基于貝葉斯定理的一種分類方法。它假設特征之間相互獨立(樸素性),從而簡化計算過…

01|Java中常見錯誤或不清楚

補充&#xff1a;length vs length() vs size() 1 java中的length屬性是針對數組說的,比如說你聲明了一個數組,想知道這個數組的長度則用到了length這個屬性. 2 java中的length()方法是針對字符串String說的,如果想看這個字符串的長度則用到length()這個方法. 3.java中的siz…

【Vue-Router】命名視圖

命名視圖 同時 (同級) 展示多個視圖&#xff0c;而不是嵌套展示&#xff0c;例如創建一個布局&#xff0c;有 sidebar (側導航) 和 main (主內容) 兩個視圖&#xff0c;這個時候命名視圖就派上用場了。 可以在界面中擁有多個單獨命名的視圖&#xff0c;而不是只有一個單獨的出…

Python獲取、修改主機名稱和IP地址實踐

Python獲取、修改主機名稱和IP地址的方法有多種&#xff0c;內置socket模塊、執行系統命令、第三方模塊等等&#xff0c;本文只是完成功能的一次成功的實踐。 1. 獲取、修改主機名稱 本案例使用python的socket模塊獲取、修改主機名稱&#xff0c;socket模塊是一個用于實現網絡…

UML-A 卷-知識考卷

UML-A 卷-知識考卷 UML有多少種圖&#xff0c;請列出每種圖的名字&#xff1a; 常用的幾種UML圖&#xff1a; 類圖&#xff08;Class Diagram&#xff09;&#xff1a;類圖是描述類、接口、關聯關系和繼承關系的圖形化表示。它展示了系統中各個類之間的靜態結構和關系。時序…

TFRecords詳解

內容目錄 TFRecords 是什么序列化(Serialization)tf.data 圖像序列化&#xff08;Serializing Images)tf.Example函數封裝 小結 TFRecords 是什么 TPU擁有八個核心&#xff0c;充當八個獨立的工作單元。我們可以通過將數據集分成多個文件或分片&#xff08;shards&#xff09;…

2023年7月京東洗衣機行業品牌銷售排行榜(京東數據分析軟件)

2023年上半年&#xff0c;洗衣機市場表現平淡&#xff0c;同環比來看出貨量都有一定程度的下滑。7月份&#xff0c;洗衣機市場仍未改變這一下滑態勢。 根據鯨參謀電商數據分析平臺的相關數據顯示&#xff0c;7月份&#xff0c;京東平臺洗衣機的銷量為109萬&#xff0c;環比下降…