【问题标题】:Terraform windows vs linux issueTerraform windows vs linux问题
【发布时间】: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


    【解决方案1】:

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

    这就是我机器中 pwsh 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:~$
    

    【讨论】:

    • 我正在使用管理单元,所以它的路径是 /snap/bin/pwsh,它是路径变量 (/snap/bin) 的一部分。即使我将完整路径放入 pwsh 它仍然失败。当我使用 local-exec 时,它可以工作,但我需要返回响应,因此 local-exec 不会削减它。它仅对命令的 terraform 数据版本失败。
    • 哦,我明白了。我在 Ubuntu 18 上,我的设置不是很快。我记得在 Ubuntu 20 中使用 snap 时遇到了 fork 权限问题,我将其保留原样。抱歉,目前对此没有其他想法。
    • 我认为您可能部分正确,但我认为更多的是关于 terraform 的运行方式。当它运行 local-exec 时,我认为它是作为连接用户执行的,但是当它运行 data 命令时,它作为不同的用户运行(从技术上讲,它不存在...... UID 1000)。该用户不会有相同的配置文件设置。我正在尝试一些东西,如果它有效,我会发布解决方案。
    • 您正在尝试将输入值作为参数检索。但我猜它是以 JSON 形式出现的...stackoverflow.com/questions/53148252/… 请参阅此链接..
    • 但是如果输出与 convertTo-json 有问题,那么您可以坚持使用您的代码进行输出,但我猜应该使用 convertFrom-json 处理输入
    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    相关资源
    最近更新 更多