Terraform:如何在操作系统上检测和分支?

Terraform:如何在操作系统上检测和分支?

给出来自 Terraform 的这段伪代码:

resource "null_resource" {
    provisioner "local-exec" {
        command = "echo hello"
        interpreter = local.os == "Windows" ? ["PowerShell", "-Command"] : ["bash"]
}

我如何让它在 Windows 上的 Powershell 和 Linux 上的 bash 中运行?

答案1

您可以检查 terraform 项目运行的路径。在 Windows 上,它将类似于 ,C:/Users/而在 Linux 上,标准路径将是/home/xxx

locals {
  is_linux = length(regexall("/home/", lower(abspath(path.root)))) > 0
}

resource "local_file" "connect_sh" {
  count           = local.is_linux ? 1 : 0
  filename        = "connect.sh"
  file_permission = "0744"
  content         = <<-EOF
#!/bin/bash
ssh -i ${local.vars["key_file"]} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ServerAliveInterval=120 -o ServerAliveCountMax=2 ec2-user@${data.aws_eip.this.public_ip}
EOF
}

resource "local_file" "connect_bat" {
  count           = local.is_linux ? 0 : 1
  filename        = "connect.bat"
  #file_permission = "0744"
  content         = <<-EOF
@ssh -i ${local.vars["key_file"]} -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -o ServerAliveInterval=120 -o ServerAliveCountMax=2 ec2-user@${data.aws_eip.this.public_ip}
EOF
}

答案2

local-exec使用本质上会吸收运行 Terraform 的平台的详细信息,这就是为什么它应该被视为最后的手段的原因之一。

Terraform 不包含任何内置的模块检测主机操作系统的方法。自定义 Terraform 提供程序可能会提供返回该信息的数据源,尽管如果有人要编写 Terraform 提供程序,那么编写一个来执行此配置程序将直接运行的任何操作可能更合适,从而避免 Terraform 配置需要根据操作系统进行分支。

相关内容