首页 > 解决方案 > terraform 中的 if 语句,使用 2 个不同的代码块

问题描述

我有这个代码块

  launchpad_tmpl = {
    apiVersion = "<Link for the API>"
    kind       = "mke"
    spec = {
      mke = {
        adminUsername = "admin"
        adminPassword = var.admin_password
        installFlags : [
          "--default-node-orchestrator=kubernetes",
          "--san=${module.masters.lb_dns_name}",
        ]
      }
      hosts = concat(local.managers, local.msrs, local.workers, local.windows_workers)
    }
  }
}

我还有另一个代码块

  launchpad_tmpl = {
    apiVersion = "<Some link for the API>"
    kind       = "mke"
    spec = {
      mke = {
        adminUsername = "admin"
        adminPassword = var.admin_password
        installFlags : [
          "--default-node-orchestrator=kubernetes",
          "--san=${module.masters.lb_dns_name}",
        ]
      }

      msr = {
      ...some_code
      }
      hosts = concat(local.managers, local.msrs, local.workers, local.windows_workers)
    }
  }
}

我想告诉 terraform 类似的东西

IF msr_count >= 1 - 使用第二个代码块运行 ELSE 使用第一个...

在 Terraform 中是否有可能,或者我需要在某个地方制作一个包装器?提前致谢。

更新:::

 Error: Inconsistent conditional result types

  on main.tf line 162, in output "mke_cluster":
 162:   value = yamlencode(var.msr_count > 0 ? local.msr_launchpad_tmpl : local.mke_launchpad_tmpl)
    |----------------
    | local.mke_launchpad_tmpl is object with 3 attributes
    | local.msr_launchpad_tmpl is object with 3 attributes
    | var.msr_count is 1

The true and false result expressions must have consistent types. The given
expressions are object and object, respectively.

这是这样放置时的输出:

 mke_launchpad_tmpl = {
    apiVersion = "API"
    kind       = "mke"
    spec = {
      mke = {
        adminUsername = "admin"
        adminPassword = var.admin_password
        installFlags : [
          "--default-node-orchestrator=kubernetes",
          "--san=${module.masters.lb_dns_name}",
        ]
      }
      hosts = concat(local.managers, local.msrs, local.workers, local.windows_workers)
    }
  }


  msr_launchpad_tmpl = {
    apiVersion = "API"
    kind       = "mke+msr"
    spec = {
      mke = {
        adminUsername = "admin"
        adminPassword = var.admin_password
        installFlags : [
          "--default-node-orchestrator=kubernetes",
          "--san=${module.masters.lb_dns_name}",
        ]
      }
      msr = {
        installFlags : [
          "--ucp-insecure-tls",
          "--dtr-external-url ${module.msrs.lb_dns_name}",
        ]
        }
    hosts = concat(local.managers, local.msrs, local.workers, local.windows_workers)
    }
  }
  launchpad_tmpl = var.msr_count > 0 ? local.msr_launchpad_tmpl : local.mke_launchpad_tmpl
}

output "mke_cluster" {
  value = yamlencode(local.launchpad_tmpl)
}

标签: if-statementterraform

解决方案


您可以使用条件表达式。同样为简单起见,您可以将两个备选方案创建为局部变量,这将简化表达式。

例如:

locals {

 mke_launchpad_tmpl = {
    apiVersion = "API"
    kind       = "mke"
    spec = {
      mke = {
        adminUsername = "admin"
        adminPassword = var.admin_password
        installFlags : [
          "--default-node-orchestrator=kubernetes",
          "--san=${module.masters.lb_dns_name}",
        ]
      }
      msr = {}
      hosts = concat(local.managers, local.msrs, local.workers, local.windows_workers)
    }
  }


  msr_launchpad_tmpl = {
    apiVersion = "API"
    kind       = "mke+msr"
    spec = {
      mke = {
        adminUsername = "admin"
        adminPassword = var.admin_password
        installFlags : [
          "--default-node-orchestrator=kubernetes",
          "--san=${module.masters.lb_dns_name}",
        ]
      }
      msr = {
        installFlags : [
          "--ucp-insecure-tls",
          "--dtr-external-url ${module.msrs.lb_dns_name}",
        ]
        }
    hosts = concat(local.managers, local.msrs, local.workers, local.windows_workers)
    }
  }

}

然后,在您的资源中:

launchpad_tmpl = var.msr_count > -1 ? local.second_launchpad_tmpl : local.first_launchpad_tmpl

推荐阅读