【发布时间】:2020-09-28 10:48:11
【问题描述】:
所以这个问题有点令人费解,但对于 azure 中的一个非常具体的情况,我需要这个。我正在尝试在 azure k8s vnet 中创建一个 APIM 子网,但我无法从 k8s terraform 调用中找到返回值,该调用为我提供了 vnet 的 ID/名称。相反,我使用 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]
}
我的变量中有一个用于 runpsver6 的工具,所以当我在 linux 机器上运行时,它会将 powershell 更改为 pwsh。现在,这是开始变得有点奇怪了。当我在我的 windows 机器上运行它时,这不是问题,但是当我从 linux 机器上运行它时,我收到以下错误:
找不到外部程序“pwsh”
我尝试了许多不同的解决方法(例如使用完整的 powershell 管理单元路径 /snap/bin/powershell 并将命令放在 .ps1 文件中)均无济于事。每次它都会抛出找不到 pwsh 作为外部程序的错误。
我对 local-exec terraform 命令使用相同的 runPSVer6 切换,没有问题,但我需要 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}"
当我在 out 中不使用 .name 时,这就是我得到的:
data.external.runpwsh: Refreshing state...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
vnet = { "name" = "" }
这是 .ps1 的输出:
{
"name":"vnettest"
}
【问题讨论】:
标签: linux powershell terraform ubuntu-16.04