使用 azurerm_virtual_machine_extension 时未执行 PowerShell 脚本

Posted

技术标签:

【中文标题】使用 azurerm_virtual_machine_extension 时未执行 PowerShell 脚本【英文标题】:PowerShell Script is not executing when using azurerm_virtual_machine_extension 【发布时间】:2018-08-14 08:11:48 【问题描述】:

我正在尝试在我的 terraform 执行中使用以下内容:

resource "azurerm_virtual_machine_extension" "vmex" 
    name = "myVM"
    location = "eastus"
    resource_group_name   = "$azurerm_resource_group.rg.name"
    virtual_machine_name = "$azurerm_virtual_machine.vm.name"
    publisher = "Microsoft.Compute"
    type = "CustomScriptExtension"
    type_handler_version = "1.9"
    settings = <<SETTINGS
    
        "fileUris": [
            "https://example.com/scripts/test.ps1"
        ],
        "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File 'test.ps1'"
    
    SETTINGS

当它执行时,我得到以下输出:

错误:应用计划时出错:

发生了 1 个错误:

azurerm_virtual_machine_extension.vmex:发生 1 个错误:

azurerm_virtual_machine_extension.vmex:长时间运行的操作以状态“失败”终止:代码=“VMExtensionProvisioningError”消息=“处理扩展“myVM”时VM 报告失败。错误消息:“已完成执行命令” 。”

Terraform 在遇到错误时不会自动回滚。 相反,您的 Terraform 状态文件已部分更新为 任何成功完成的资源。请解决错误 并再次申请以逐步更改您的基础架构。

当我 RDP 进入 VM 时,我可以看到该文件已正确下载到它应该在的位置,但是,似乎 commandToExecute 从未执行过。

如果我直接从下载文件夹运行脚本,它会成功完成。

任何人都可以就如何解决这个问题提供任何建议吗?

注意:我尝试了各种尝试引用文件的组合,但所有组合似乎都有相同的结果。

更新:按照 cmets 中的建议检查日志后,尝试运行此 sn-p 时的错误是:

"message": "处理 -File ''test.ps1'' 失败,因为该文件没有 '.ps1' 扩展名。请指定有效的 Windows PowerShell 脚本文件名,然后重试。"

【问题讨论】:

【参考方案1】:

我有这样的问题,在我的情况下是与脚本和参数的内容有关。但是因为它可能是许多其他的东西,你需要检索一些额外的数据。

尝试了解扩展程序本身是否有更多信息。转到您的 Azure 帐户并按照以下路径操作:主页 > 虚拟机 > [your_virtual_machine]。在显示所有选项的刀片中,选择扩展以查看您的扩展及其状态(应该是“配置失败”。单击该扩展。您将看到有关它的一些信息。检查状态和详细状态。

详细状态是一个链接,它将向您显示一个 JSON,其中可以包含有关正在发生的事情的重要信息。可能它会包含来自您的 PS1 脚本的错误输出。

如果这有帮助,请告诉我,如果这些信息还不够,请在此处发布,这样我可以获得更多信息,我将能够检查并尝试提供帮助。

问候, 劳尔。

编辑:因此,在检查了我们的代码示例之间的差异之后,单引号最终导致了您的问题。很高兴您发现了问题。

【讨论】:

我已经按照你的建议做了,我可以找到它的错误信息:"message": "Processing -File ''test.ps1'' failed because the file does not have a '.ps1' extension. Specify a valid Windows PowerShell script file name, and then try again." 有什么想法吗?谢谢 我发现与我的工作代码示例的唯一区别是:(1)使用整个可执行文件名称“powershell.exe”(2)不带单引号的文件名(3)我仍在使用type_handler_version 1.8。 (1)和(2)应该不是问题。用 (3) 试试看 好的,谢谢,我会尝试逐一排除。 Raul,如果我从文件名中删除单引号,看起来一切正常。真的不确定为什么会有所不同,因为文档建议应该使用它们,但是......如果您想将此信息添加到您的答案中,我将标记为已接受。再次感谢!【参考方案2】:

根本原因在于commandToExecute 你不能使用单引号。您可以删除单引号或使用双引号(但您需要使用\)。如下:

"commandToExecute": "powershell -ExecutionPolicy Unrestricted -File \"test.ps1\""

【讨论】:

我检查了自定义脚本日志,似乎 Azure 代理执行命令'powershell -ExecutionPolicy Unrestricted -NoProfile -NonInteractive -File 'helloworld.ps1'',你不能再次使用单引号。 imgur.com/a/p4NbD 另外,这不是 terraform 问题。如果你使用 Azure arm 模板,你会得到同样的错误日志。 同意。我已向此处发送 PR:github.com/MicrosoftDocs/azure-docs/pull/5387 以更正文档中显示的示例。 我会反馈给 Azure,这个official document 有这个问题。 "commandToExecute": "powershell.exe . . . -File './scripts/myscript.ps1'"这是错误的。 我同意,这份文件是错误的,那是我为了更正该文件而发送的 PR。【参考方案3】:

您应该连接到 VM(通过 RDP、Powershell 远程或其他方式)并查看 C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension 文件夹中的日志。

我假设你有 Custom Script Extension for Windows 的内容。

【讨论】:

谢谢,我根据 Raul 的回答找到了日志,但是,它并没有说明问题。你有什么想法?谢谢! 我有一些工作样本,但不在这台电脑上;我明天可以检查

以上是关于使用 azurerm_virtual_machine_extension 时未执行 PowerShell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份