营销型网站三要素,国际公司英语翻译,wordpress微信小程序模板,南宁手机模板建站系列文章
Terraform 系列文章Grafana 系列文章
概述
前文 Grafana 系列 - Grafana Terraform Provider 基础 介绍了使用 Grafana Terraform Provider 创建 Datasource.
这几天碰到这么一个现实需求#xff1a;
使用 Terraform 批量创建日志数据源时, 有的数据源类型是 El…系列文章
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 elasticsearchname ${each.key}_esuid ${each.key}_esurl each.value.esdatabase_name [example.*-]YYYY.MM.DDjson_data_encoded jsonencode({esVersion 6.0.0interval DailyincludeFrozen falsemaxConcurrentShardRequests 256timeField timestamplogLevelField levellogMessageField 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-datasourcename ${each.key}_opensearchuid ${each.key}_opensearchurl each.value.esbasic_auth_enabled truebasic_auth_username readonlyjson_data_encoded jsonencode({database [example.*-]YYYY.MM.DDversion 6.8.0flavor elasticsearchinterval DailypplEnabled truemaxConcurrentShardRequests 256timeField timestamplogLevelField levellogMessageField 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_type 是 elasticsearch, 才把这个对象构造到 map 中.
之后, 对于不同的 DataSource type, 会有不同的参数, 如上文:
Opensearch 具有和 ES 不同的 type, Opensearch 加了认证Opensearch 里是 database 字段而不是 database_nameOpensearch 里额外还有 flavor 字段和 pplEnabled 字段.
解决方案二
如果您的原始数据, 或者构造后的 locals 是 list 而不是 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 CNAMEttl 1proxied true
}
关键点是: count var.cloudflare ? 1 : 0 条件表达式.
也很清晰明了.
完成
️参考文档
Terraform: Conditional creation of a resource based on a variable in .tfvars - Stack OverflowConditionally create resources when a for_each loop is involved - Terraform - HashiCorp Discuss 三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.