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

这篇具有很好参考价值的文章主要介绍了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 是 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_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 : 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

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.文章来源地址https://www.toymoban.com/news/detail-641844.html

到了这里,关于Terraform 系列-批量创建资源时如何根据某个字段判断是否创建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • <MyBatis>查询sq,根据某个字段,入参传list循环判断

    实现类: Mapper类: Mybatis层: 重点关注: 根据:北京,西安,上海,过滤数据:

    2024年02月11日
    浏览(46)
  • list根据对象中某个字段属性去重Java流实现

    在Java的流(Stream)中,你可以使用distinct方法来实现根据对象中某个字段属性去重的功能。要实现这个功能,你需要重写对象的hashCode和equals方法,以确保相同字段属性的对象被认为是相等的。以下是一个示例代码: 在上面的代码中,YourObject是你自定义的对象类型,你需要根据

    2024年02月10日
    浏览(38)
  • Java中使用流将两个集合根据某个字段进行过滤去重?

    要是需要GPT Plus账号的小伙伴可以联系我~ 在Java中,您可以使用流(Stream)来过滤和去重两个集合。下面是一个示例代码,展示如何根据对象的某个字段进行过滤和去重操作: 在这个示例中,我们创建了一个 Person 类表示人员信息,包含 name 和 age 两个字段。我们使用流的 filte

    2024年02月12日
    浏览(30)
  • java 操作elasticsearch 6.8.0 根据某个条件批量删除数据

    注: 连接es以及依赖相关内容请自行配置,只提供方法。 依赖如下 代码如下

    2024年01月21日
    浏览(30)
  • mybatis-plus 根据指定字段 批量 删除/修改

    mybatis-plus 提供了根据id批量更新和修改的方法,这个大家都不陌生 但是当表没有id的时候怎么办) 这个就不说了,就是因为不想手写SQL 所以才有这篇博客 mybatis plus 的 executeBatch 参考 mybatis plus 的updateBatchById 方法. 调用处: 接口 重写方法 实现 这种写法其实批量的效率还是比较慢的

    2024年02月13日
    浏览(24)
  • linux中根据文件的创建时间批量删除文件

    在Ubuntu上,你可以使用`find`命令来根据时间批量删除图片。以下是具体的步骤: 1. 打开终端(Terminal)。 2. 使用以下命令进入你希望删除文件的目录: 将`/path/to/directory`替换为实际存放文件的目录路径。 3. 使用以下命令找到符合条件的文件: 上述命令会列出 当前目录及其子

    2024年02月10日
    浏览(23)
  • 【SQL开发实战技巧】系列(三十二):数仓报表场景☞对表中某个字段内的值去重

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月12日
    浏览(39)
  • ZABBIX根据IP列表,主机描述,或IP子网批量创建主机的维护任务

    有时候被ZABBIX监控的主机可能需要关机重启等维护操作,为了在此期间不触发告警,需要创建主机的维护任务,以免出现误告警 ZABBIX本身有这个API可供调用(不同版本细节略有不同,本次用的ZABBIX6.*),实现批量化建立主机的维护任务 无论哪种方式(IP列表,主机描述,或IP子网)创建维护

    2024年01月17日
    浏览(38)
  • sql server 如何设置数据库某个字段值不能重复?

    在 SQL Server 中,可以通过以下两种方式设置数据库某个字段值不能重复: 唯一约束(Unique Constraint):唯一约束是在表级别上定义的约束,用于确保某个列的值在表中是唯一的。可以通过以下 SQL 语句来创建唯一约束: 唯一索引(Unique Index):唯一索引也用于确保某个列的值

    2024年02月13日
    浏览(39)
  • Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?

    这是来自社区的一个真实企业场景问题。 https://elasticsearch.cn/question/13135 如下所示, 希望在查出的结果后, 对结果进行后处理,对tags列表,根据depth进行排序。 Elasticsearch 能支持的排序方式罗列如下: 包含但不限于: 基于特定字段的排序 基于Nested对象字段的排序 基于特定

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包