【问题标题】:Set Terraform default interpreter for local-exec为 local-exec 设置 Terraform 默认解释器
【发布时间】:2020-11-06 01:31:48
【问题描述】:

有没有办法覆盖local-exec 供应商中使用的默认 Terraform 解释器?

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

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

这样的能力存在吗?

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

【问题讨论】:

  • 根据jen20对terraform#7077的回复,目前看来是不可能的。

标签: terraform


【解决方案1】:

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

首先一个 sn-p 来检测操作系统:

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
  }
}

最后,一个没有额外 cmets 和触发器的简化视图:

resource "null_resource" "cli_command" {
  provisioner "local-exec" {
    interpreter = local.is_windows ? ["PowerShell", "-Command"] : []
    command     = "sleep 60"
  }
}
【解决方案2】:

我使用了合理的默认方法,因为它适用于我,但您可以使用@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
  } 
}

【讨论】:

    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 2016-02-23
    • 2020-07-07
    • 2013-11-09
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多