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:~$
所以这个问题有点令人费解,但我需要它来处理 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:~$