Terraform Azurerm_virtual_machine_extension错误“不允许进行扩展操作”

时间:2019-09-30 19:03:53

标签: windows virtual-machine terraform powershell-remoting azure-rm

我已经编写了一个Terraform模板来创建Azure Windows VM。我需要将VM配置为启用PowerShell Remoting,以使发布管道能够执行Powershell脚本。创建虚拟机之后,我可以将RDP发送到虚拟机,并做所有需要启用Powershell远程处理的工作,但是,如果我可以编写所有脚本以使其可以在Release管道中执行,那将是理想的选择。有两点可以防止这种情况。

首先,这个问题的主题是,我必须运行“ WinRM quickconfig”。我的模板正常工作,以便在创建VM后对我执行RDP时,当我运行“ WinRM quickconfig”时会收到以下响应:

\

我想在Terraform中配置VM,因此设置了LocalAccountTokenFilterPolicy,因此不必RDP到VM来运行“ WinRM quickconfig”。经过一番研究,看来我可以使用azure_virtual_machine_extension资源来做到这一点。我将其添加到模板中:

\\

应用此方法时,出现错误:

Person.average(:age) # => 0.387e2
Person.average(:age).to_i # => 38
Person.average(:age).to_f # => 38.7
Person.average(:age).to_f.round # => 39

我找不到任何有关如何将allowExtensionOperations属性设置为true的Terraform文档。一时兴起,我尝试将属性“ allow_extension_operations”添加到azurerm_virtual_machine资源中的os_profile块中,但被拒绝为无效属性。我还尝试将其添加到os_profile_windows_config块中,并且在此也不有效。

我在Microsoft文档中找到有关osProfile.allowExtensionOperations属性的声明,该声明为:

  

“仅当虚拟机上没有扩展名时,才可以将其设置为False。”

https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.management.compute.models.osprofile.allowextensionoperations?view=azure-dotnet

这对我意味着默认情况下该属性为True,但实际上并没有这样说,并且肯定不是那样。 Terraform中是否可以将osProfile.alowExtensionOperations设置为true?

2 个答案:

答案 0 :(得分:0)

遇到使用Terraform添加扩展的同一问题,我创建了Windows 2016自定义映像,

提供商“ azurerm”版本=“ 2.0.0” Terraform 0.12.24

Terraform apply error: 
compute.VirtualMachineExtensionsClient#CreateOrUpdate: Failure sending request: StatusCode=0 
-- Original Error: autorest/azure: Service returned an error. 
Status=<nil> 
Code="OperationNotAllowed" 
Message="This operation cannot be performed when extension operations are disallowed. To allow, please ensure VM Agent is installed on the VM and the osProfile.allowExtensionOperations property is true."

答案 1 :(得分:0)

我遇到了同样的错误,可能的解决方案取决于这里的两件事。 您必须通过提供程序“ azurerm”版本=“ 2.5.0,并且还必须在虚拟机资源中传递os_profile_windows_config(请参见下文)参数。因此,terraform将考虑您正在传递的扩展名。这解决了我的错误。

 os_profile_windows_config {
provision_vm_agent = true
}