Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为本地exec设置Terraform默认解释器_Terraform - Fatal编程技术网

为本地exec设置Terraform默认解释器

为本地exec设置Terraform默认解释器,terraform,Terraform,是否有方法覆盖localexecprovisioners中使用的默认地形解释器 我知道您可以通过解释器参数设置解释器,但我试图避免在每个资源上指定此参数 我真正想做的是覆盖“基于系统操作系统选择的合理默认值”,以便使脚本跨平台。具体地说,我想通过环境或命令行变量更改默认值,这样我就可以在Windows上使用Cygwin Bash来编写最初为Linux编写的脚本 这种能力存在吗 这在今天是不可能的。以下是跨平台示例代码,您可以在任何环境中使用(托管在my上) 首先是检测操作系统的代码段: loca

是否有方法覆盖
localexec
provisioners中使用的默认地形解释器

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

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

这种能力存在吗


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

首先是检测操作系统的代码段:

locals {
  # Directories start with "C:..." on Windows; All other OSs use "/" for root.
  is_windows = substr(pathexpand("~"), 0, 1) == "/" ? false : true
}
然后根据使用的操作系统选择解释器和命令:

resource“null\u资源”“cli\u命令”{
供应人“本地执行官”{
#确保windows始终使用PowerShell,linux/mac使用其默认shell。
解释器=local.is_windows?[“PowerShell”,“-Command”]:[]
#TODO:将以下命令替换为Windows和Linux命令变体
command=local.is_windows?“sleep 60”:“sleep 60”
}
触发器={
#TODO:用一个或多个指示(更改时)的触发器替换此伪代码
#命令应该重新执行。
“test_a”=resource.my_resource.sample
}
}

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

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

我使用了明智的默认方法,因为它对我很有效,但是您可以使用@aaronsteers所描述的
解释器
参数来做类似的事情。这是一个用于生成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
  } 
}

根据jen20的回复,目前似乎不可能。