Terraform windows 与 linux 问题

Terraform windows vs linux issue

所以这个问题有点令人费解,但我需要它来处理 azure 中的一个非常具体的案例。我正在尝试在 azure k8s vnet 中创建 APIM 子网,但我无法从 k8s terraform 调用中找到 return 值,该值为 vnet 提供了 ID/name 。相反,我使用 powershell 命令查询 Azure 并获取新 vnet 的名称。我在我的 windows 盒子上本地处理这段代码,它工作正常:

data "external" "cluster_vnet_name" {
    program = [var.runPSVer6 == true ? "pwsh" : "powershell","Select-AzSubscription '${var.subscriptionName}' |out-null; Get-AzVirtualNetwork -ResourceGroupName '${module.kubernetes-service.k8ResourceGroup}' | Select Name | convertto-json}"]

    depends_on = [module.kubernetes-service]
}

我的 运行psver6 变量中有一个 toogle,所以当我在 linux 机器上 运行 时,它会将 powershell 更改为 pwsh。现在,这开始变得有点奇怪了。当我在我的 windows 机器上 运行 这个时,这不是问题,但是当我从 linux 盒子 运行 这个时,我得到以下错误:

can't find external program "pwsh"

我尝试了多种不同的解决方法(例如使用完整的 powershell 管理单元路径 /snap/bin/powershell 并将命令放在 .ps1 文件中)但无济于事。每次它都会抛出找不到 pwsh 作为外部程序的错误。

我使用相同的 运行PSVer6 切换 local-exec terraform 命令没有问题,但我需要 Vnet 的名称作为响应。

有人知道我在这里遗漏了什么吗?

9 月 30 日后添加

所以我尝试了另一种触发命令的方法:

variable "runPSVer6" {
        type    = bool
        default = true
}

variable "subscriptionName" {
        type    = string
}

variable "ResourceGroup" {
        type    = string
}


data "external" "runpwsh" {
        program = [var.runPSVer6 == true ? "pwsh" : "powershell", "test.ps1"]

        query = {
                subscriptionName = var.subscriptionName
                ResourceGroup = var.ResourceGroup
        }
}

output "vnet" {
        value = data.external.runpwsh.result.name
}

这似乎允许命令执行,但它不会撤回 json 响应的结果(即使我确认我确实收到了响应)。

这就是我的 .ps1:

Param($subscriptionName,$ResourceGroup)
$subscription = Select-AzSubscription $subscriptionName
$name = (Get-AzVirtualNetwork -ResourceGroupName $ResourceGroup | Select Name).Name
Write-Output "{`n`t""name"":""$name""`n}"

当我不在输出中使用 .name 时,这就是我得到的:

data.external.runpwsh: Refreshing state...
 
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:
 
vnet = {   "name" = "" }

这是 .ps1:

的输出
{
        "name":"vnettest"
}

您能检查一下 pwsh 是否在终端中运行吗?它应该调出 powershell 提示...

pwsh 的路径必须添加到 PATH 中。/usr/bin 在我的 PATH 中,如下所示。

ubuntu@myhost:~$ whereis pwsh
pwsh: /usr/bin/pwsh
ubuntu@myhost:~$

ubuntu@myhost:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin


ubuntu@myhost:~$ pwsh
PowerShell 7.0.3
Copyright (c) Microsoft Corporation. All rights reserved.

https://aka.ms/powershell
Type 'help' to get help.

PS /home/ubuntu>
PS /home/ubuntu> exit
ubuntu@myhost:~$ 

============ 2020 年 9 月 29 日之后添加。

我在 Ubuntu 20 时再次尝试。 Terraform 13 从主站点下载为 Zip 使用 snap install powershell --classic

安装的 PowerShell 7.0.3

我尝试了以下有效的测试代码。

varriable runPSVer6 {}
default = true
}

data "external" "testps" {
program = [var.runPSVer6 == true ? "pwsh" : "powershell","/tmp/testScript.ps1"]
}

output "ps_out" {
value = data.external.testps.result
}

输出就像...

Outputs:

ps_out = {
  "name" = "My Resource Name"
  "region" = "West Europe"
}

/tmp/testScript.ps1 代码是简单的输出语句...

Write-Output '{ "name" : "My Resource Name", "region" : "West Europe" }'

我试图清空路径变量,只是为了看看我是否收到您提到的错误消息。果然如我所料..

ubuntu@ip-172-31-53-128:~$ ./terraform apply
data.external.test_ps: Refreshing state...

Error: can't find external program "pwsh"

  on main.tf line 5, in data "external" "test_ps":
   5: data "external" "test_ps" {

但是当我使用完整路径时,它又起作用了。 (即使 /snap/bin/powershell 有效)

program = [var.runPSVer6 == true ? "/snap/bin/pwsh" : "powershell","/tmp/testScript.ps1"]

我之前错误地将我的问题归咎于 snap,但现在 snap 确实起作用了。 这不会在此处提供任何线索或 pin-point 您遇到的问题。但也许你会尝试一些事情来确定, 1.) 在当前目录中发出“pwsh”并看到 Powershell 提示确实出现了。不确定你是否已经检查过这个,但有时路径中的其他一些字符可能会导致问题。 2.) 你可以在导出 PATH=/snap/bin 之后 运行 tf 一次吗...(在 shell 中执行并稍后退出以便你回到旧路径。或者导出正确的测试后的路径) 3.) 如果你使用完整路径,错误信息一定与其他“错误:找不到外部程序”pwsh“...你能交叉检查是否有差异错误信息

这就是 pwsh bin 和 sym link 在我的机器中的样子...

ubuntu@ip-172-31-53-128:~$ /usr/bin/ls -lt /snap/bin/pwsh
lrwxrwxrwx 1 root root 10 Sep 29 15:40 /snap/bin/pwsh -> powershell
ubuntu@ip-172-31-53-128:~$
ubuntu@ip-172-31-53-128:~$ /usr/bin/ls -lt /snap/bin/powershell
lrwxrwxrwx 1 root root 13 Sep 29 15:40 /snap/bin/powershell -> /usr/bin/snap
ubuntu@ip-172-31-53-128:~$