【问题标题】:how to loop through list(map(string)) in terraform?如何循环遍历 terraform 中的列表(地图(字符串))?
【发布时间】:2022-07-06 07:13:22
【问题描述】:

我正在通过 terraform 创建一个 google_compute_instance 资源。

我需要附加一个启动盘和一个附加磁盘。所以在当地人我这样声明

并传递必要的变量

locals
{
 boot_disk = [
    {
      source_image = var.bootSourceImage
      disk_size_gb = var.bootDiskSizeGb
      type    = var.bootDiskType
      auto_delete  = var.bootDiskAutoDelete
      boot         = "true"
      device_name="${var.machineName}-boot"
      disk_type="PERSISTENT"
    },
  ]

  add_disk= [
    {
      source_image = var.bootSourceImage
      disk_size_gb = var.disk1DiskSizeGb
     type=var.disk1DiskType
     device_name=var.disk1DiskName
     disk_type="PERSISTENT"
     auto_delete=var.disk1DiskAutoDelete
     boot="false"
    }
  ]
}
all_disks=concat(local.boot_disk,local.add_disk) //i concatenate them

我需要在创建的磁盘上附加一个策略,所以我使用这个块

    resource "google_compute_disk_resource_policy_attachment" "attached-disk" {
     //Here i need to loop through all_disk
 for_each=local.all_disk.boot=false?current_disk:[] //From the all_disks i need to filter if this not boot disk then get the value ex. all_disk.boot=false then return the disk to for_each

    }

    resource "google_compute_disk_resource_policy_attachment" "boot-disk" {
     //Here i need to loop through all_disk
 for_each=local.all_disk.boot=true?current_disk:[] //From the all_disks i need to filter if this is boot disk then get the value like all_disk.boot=true
    }

如何使用for_each遍历all_disks并根据启动值返回当前磁盘?

【问题讨论】:

    标签: terraform


    【解决方案1】:

    您可以使用for expressions 从另一个集合派生一个集合,其中包括使用可选的if 子句filtering elements 的可能性。

    在您的情况下,您的目标似乎是让您的“附加磁盘”资源每个元素都有一个实例,其中 boot 设置为 false,而您的“启动磁盘”资源具有所有剩余元素,其中boot 设置为 true。如果这是真的,那么我会建议以下两种表达方式:

    resource "google_compute_disk_resource_policy_attachment" "attached-disk" {
      for_each = {
        for k, v in local.all_disk : k => v
        if !v.boot
      }
    }
    
    resource "google_compute_disk_resource_policy_attachment" "boot-disk" {
      for_each = {
        for k, v in local.all_disk : k => v
        if v.boot
      }
    }
    

    这通过测试每个vif 表达式来工作,它们是映射local.all_disk 中的值。如果表达式的计算结果为 true,则该项目将包含在结果中,否则不会。


    请注意,您当前将boot 属性定义为字符串而不是布尔值。只要字符串恰好是 "true""false" 就可以工作,因为 Terraform 可以自动将这些字符串强制转换为布尔值,但是为了让未来的维护者更容易遵循您的配置(他们可能不太熟悉 Terraform 的自动转换规则)我通常建议使用最合适的类型而不是依赖自动转换,方法是将 boot 属性设置为 truefalse,这是 Terraform 语言中的两个实际布尔值。

    如果您确实使用"true""false",那么您需要小心测试这些表达式的方式。 !"true" 产生 false 因为 Terraform 知道一元 ! 的操作数始终是布尔值,但 "true" == true 将返回 false,因为不同类型的两个值永远不可能相等,而 == 运算符不向 Terraform 提供有关您可能打算进行何种自动类型转换的任何提示。

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 2023-01-24
      • 2017-07-23
      • 2019-08-24
      • 1970-01-01
      • 2021-04-02
      • 2016-01-24
      • 2023-03-12
      相关资源
      最近更新 更多