为local-exec设置Terraform默认解释器

时间:2018-10-03 13:59:34

标签: terraform

是否有一种方法可以覆盖local-exec设置程序中使用的默认Terraform解释器?

我知道您可以通过interpreter参数来设置解释器,但是我试图避免在每个单独的资源上都指定它。

我真正想做的是覆盖“明智的默认值...基于系统OS选择”,以使脚本跨平台。具体来说,我想通过环境或命令行变量更改默认值,以便可以将Windows上的Cygwin Bash用于最初为Linux制作的脚本。

这样的能力存在吗?

https://www.terraform.io/docs/provisioners/local-exec.html

2 个答案:

答案 0 :(得分:2)

今天不可能。这是跨平台的示例代码,您可以在任何环境中使用(托管在我的gist上)。

首先是一个片段,以检测操作系统:

locals {
  # Directories start with "C:..." on Windows; All other OSs use "/" for root.
  is_windows = substr(pathexpand("~"), 0, 1) == "/" ? false : true
}

然后根据所使用的操作系统选择解释器和命令:

resource "null_resource" "cli_command" {
  provisioner "local-exec" {
    # Ensure windows always uses PowerShell, linux/mac use their default shell.
    interpreter = local.is_windows ? ["PowerShell", "-Command"] : []

    # TODO: Replace the below with the Windows and Linux command variants
    command     = local.is_windows ? "sleep 60" : "sleep 60"
  }
  triggers = {
    # TODO: Replace this psuedocode with one or more triggers that indicate (when changed)
    #       that the command should be re-executed.
    "test_a" = resource.my_resource.sample
  }
}

最后,一个简化的视图,没有多余的注释和触发器:

resource "null_resource" "cli_command" {
  provisioner "local-exec" {
    interpreter = local.is_windows ? ["PowerShell", "-Command"] : []
    command     = "sleep 60"
  }
}

答案 1 :(得分:0)

我使用了明智的默认方法,因为它对我有用,但是您可以使用@aaronsteers描述的interpreter参数来做类似的事情。这是一个脚本,用于生成ssh密钥并根据执行位置在Bash或Powershell上应用适当的权限:

locals {
  is_windows = substr(pathexpand("~"), 0, 1) == "/" ? false : true
  key_file   = pathexpand("~/.ssh/${var.ssh_key_name}.pem")
}

locals {
  bash       = "chmod 400 ${local.key_file}"
  powershell = "icacls ${local.key_file} /inheritancelevel:r /grant:r ${var.os_username}:R"
}

resource "tls_private_key" "rsa_key" {
  algorithm = "RSA"
  rsa_bits  = 4096
}

resource "aws_key_pair" "key_pair" {
  key_name   = var.ssh_key_name
  public_key = tls_private_key.rsa_key.public_key_openssh
}

resource "local_file" "my_key_file" {
  content     = tls_private_key.rsa_key.private_key_pem
  filename    = local.key_file

  provisioner "local-exec" {
    command = local.is_windows ? local.powershell : local.bash
  } 
}