Terraform Windows vs Linux问题

kiayqfof  于 2023-11-17  发布在  Linux
关注(0)|答案(1)|浏览(88)

所以这个问题有点复杂,但我需要在Azure中的一个非常具体的情况下使用它。我试图在Azure k8s vnet中创建一个APIM子网,但是我还没有从k8s terraform调用中找到一个返回值,它给了我ID/vnet的名称。相反,我使用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]
}

字符串
我在runpsver 6的变量中有一个token,所以当我在Linux机器上运行时,它会将powershell更改为token。现在,这开始变得有点奇怪。当我在windows机器上运行它时,这不是一个问题,但是当我从linux机器上运行它时,我得到以下错误:
找不到外部程序“Pullsh”
我尝试了许多不同的解决方法(比如使用完整的powershell管理单元路径/snap/bin/powershell,并将命令放在一个.ps1文件中),但都无济于事。
我对local-exec terraform命令使用相同的runPSVer 6切换,没有问题,但我需要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"
}

yx2lnoni

yx2lnoni1#

你能检查一下在终端中是否有PowerShell.exe工作吗?它应该会弹出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
  • PowerShell 7.0.3安装与snap install powershell -经典

我尝试了下面的测试代码,它工作。

variable 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"]


我以前错误地指责管理单元与我的问题,但管理单元现在确实工作。这并没有给给予任何线索在这里或针点的问题,你有。但可能是你尝试几件事只是为了确保,1.)问题“”在当前目录中,并看到Powershell提示确实出现。.不知道如果你已经检查了这一点,但有时路径中的其他字符可能会导致问题。2.)你能在导出路径=/snap/bin后运行一次tf吗?(在shell中执行,稍后退出,以便在测试后返回旧路径。或.导出正确路径)3.)如果使用完整路径,错误信息必须是不同其他“错误:找不到外部程序“的”..
这就是我的机器中的pushsh bin和sym链接的样子.

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:~$

相关问题