给出来自 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 配置需要根据操作系统进行分支。