terraform - Azure 上的 Terraform:使用变量作为参数从本地文件执行 Windows VM 的 powershell 脚本
问题描述
背景
我使用 Azure Cloud Shell 中的 Terraform 部署 Windows Server VM。我有一个tf
成功部署 VM 的文件,但我无法运行 PowerShell 脚本。
要求
- 我需要 VM 运行一个部署后的 PowerShell 脚本,将其提升为域控制器。
- PS 脚本需要位于运行 Terraform 的 Azure Cloud Shell 的本地,以避免使用存储帐户。
- 我需要能够为从资源/数据派生的 PS 脚本指定参数(例如,
tf
文件前面定义的密码)
这就是我尝试做的事情:
resource "azurerm_virtual_machine_extension" "dcpromo_script" {
name = "dcpromo_script"
virtual_machine_id = azurerm_windows_virtual_machine.vm.id
publisher = "Microsoft.Azure.Extensions"
type = "CustomScript"
type_handler_version = "2.0"
protected_settings = <<PROT
{
"script": "${base64encode(file("dcpromo.ps1"))}"
}
PROT
}
dcpromo.ps1 用于故障排除的简化内容:
"hello"
但是我收到以下错误消息:
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
azurerm_virtual_machine_extension.dcpromo_script: Creating...
azurerm_virtual_machine_extension.dcpromo_script: Still creating... [10s elapsed]
azurerm_virtual_machine_extension.dcpromo_script: Still creating... [20s elapsed]
azurerm_virtual_machine_extension.dcpromo_script: Still creating... [30s elapsed]
azurerm_virtual_machine_extension.dcpromo_script: Still creating... [40s elapsed]
azurerm_virtual_machine_extension.dcpromo_script: Still creating... [50s elapsed]
azurerm_virtual_machine_extension.dcpromo_script: Still creating... [1m0s elapsed]
Error: Code="VMExtensionProvisioningError" Message="VM has reported a failure when processing extension 'dcpromo_script'. Error message: \"Extension '' of Handler 'Microsoft.Azure.Extensions.CustomScript' version '1.0' faulted due to exception during extension processing\"\r\n\r\nMore information on troubleshooting is available at https://aka.ms/VMExtensionCSELinuxTroubleshoot "
on windows_server.tf line 77, in resource "azurerm_virtual_machine_extension" "dcpromo_script":
77: resource "azurerm_virtual_machine_extension" "dcpromo_script" {
谁能帮助解释我做错了什么?提前致谢
解决方案
这解决了我的问题:https ://stackoverflow.com/a/60276573/1630260
这就是我使用变量作为参数的方式:
${azurerm_windows_virtual_machine.vm.admin_password}
完整线路:
"commandToExecute": "powershell -command \"[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('${base64encode(data.template_file.tf.rendered)}')) | Out-File -filepath dcpromo.ps1\" && powershell -ExecutionPolicy Unrestricted -File dcpromo.ps1 ${azurerm_windows_virtual_machine.vm.admin_password} domain.com"
推荐阅读
- git - 防止文件被其他分支跟踪
- python - QtGui.QDialog : 'module' 对象没有属性 'QDialog' | Python2.7
- jackson - 使用 RestTemplate.postForObject(.....) 将 rest 服务的字符串响应的 xml 列表自动映射到相应的 java 对象
- python - python错误不确定是错误还是代码问题
- c++ - 如何减少 Lambda 过多的堆栈使用
- javascript - AngularJS 中的语音识别解决方案
- c - 使用 C 预处理器实现 if-else
- solr - 使用 solr 端点创建 CloudSolrClient
- java - 返回值分配问题(对于原始数据类型)
- java-8 - 在 java 8 中将 Collection(java.util.Collection) 转换为 Observable(io.reactivex.Observable)