2017-07-24 14 views
-1

我正在尝试使用terraform创建azure虚拟机。但无法从terraform执行自定义数据。 Customdata.bin文件在服务器上创建。 也试过预备资源,但没有运气。无法从terraform在azure虚拟机中执行自定义数据

main.tf文件蔚蓝的虚拟机资源的语法:

resource "azurerm_virtual_machine" "avmweb0" { 
    name     = "${var.env}-${var.bu}-${var.company_name}-media-vm" 
    location    = "${var.region}" 
    resource_group_name = "${module.network.resource-grp-name}" 
    network_interface_ids = ["${azurerm_network_interface.nicweb0.id}"] 
    vm_size    = "${var.vm_size}" 


    storage_image_reference { 
    publisher  = "${var.vm_publisher}" 
    offer   = "${var.vm_offer}" 
    sku    = "${var.vm_sku}" 
    version   = "${var.vm_version}" 

    } 

    storage_os_disk { 
    name    = "${var.env}-${var.bu}-${var.company_name}-media-osdisk" 
    caching   = "ReadWrite" 
    create_option  = "FromImage" 
    managed_disk_type = "Standard_LRS" 
    } 



    os_profile { 
    computer_name = "${var.env}-${var.vm_computer_name}" 
    admin_username = "${var.vm_admin_username}" 
    admin_password = "${var.vm_admin_password}" 
    custom_data = "${data.template_file.userdata.rendered}" 
    } 

    os_profile_windows_config{ 
    winrm { 
     protocol="http" 
    } 

    } 

    /* 
    connection { 
     type  = "winrm" 
     user  = "${var.vm_admin_username}" 
     password = "${var.vm_admin_password}" 
     host  = "${azurerm_public_ip.mediapubip.ip_address}" 
     port  = 5985 
     https = false 
     insecure = true 
     timeout  = "15m" 
     # cacert  = "" 
    } */ 

    /* provisioner "file" { 
    content  = "${data.template_file.userdata.rendered}" 
    destination = "C:\\AzureData\\initdata.ps1" 

    connection { 
     type  = "winrm" 
     user  = "${var.vm_admin_username}" 
     password = "${var.vm_admin_password}" 
    } 
    } 
    provisioner "remote-exec" { 


    inline = [ "powershell.exe -ExecutionPolicy unrestricted -NoProfile -NonInteractive -File \"C:\\AzureData\\initdata.ps1\""] 


    } */ 

    /* provisioner "file" { 
    content  = "${data.template_file.userdata.rendered}" 
    destination = "C:\\AzureData\\initdata.ps1" 
    } 

    provisioner "local-exec" { 
    command = "powershell.exe -ExecutionPolicy RemoteSigned -File \"C:\\AzureData\\initdata.ps1\" -NoProfile -NonInteractive " 
    } */ 

    tags { 
     Name   = "${var.env}-${var.bu}-${var.company_name}-media" 
     BussinessUnit = "${var.bu}" 
     Environment  = "${var.env}" 
     CompanyName  = "${var.company_name}" 
     Application  = "${var.appname}" 
    } 
} 

------------自定义数据文件--------------- ------------------

Set-ExecutionPolicy unrestricted 
netsh advfirewall firewall add rule name="http" dir=in action=allow protocol=TCP localport=80 

write-host "running init script" 
if(!(test-path -Path "c:\temp")) 
    {  
    New-Item -ItemType directory -Path "C:\temp" 
    write-host "created temp directory" 
    } 
$client = new-object System.Net.WebClient 
$client.DownloadFile("https://downloads.puppetlabs.com/windows/puppet5/puppet-agent-5.0.0-x64.msi","c:\temp\puppet.msi") 
cd "c:\temp" 
pwd 
echo "`nx.x.x.x puppet" | Out-File -FilePath "C:\Windows\System32\drivers\etc\hosts" -Append -Encoding ascii 
msiexec /qn /norestart /i "c:\temp\puppet.msi" 
if(test-path -path "C:\ProgramData\PuppetLabs\facter\facts.d") 
    { 
    echo "`nhello" | Out-File -FilePath "C:\ProgramData\PuppetLabs\facter\facts.d\facts.yaml" -Encoding ascii 
    echo "`nconsolename : ${consolename}" | Out-File -FilePath "C:\ProgramData\PuppetLabs\facter\facts.d\facts.yaml" -Append -Encoding ascii 
    echo "`nbu : ${bu}" | Out-File -FilePath "C:\ProgramData\PuppetLabs\facter\facts.d\facts.yaml" -Append -Encoding ascii 
    echo "`nenv : ${env}" | Out-File -FilePath "C:\ProgramData\PuppetLabs\facter\facts.d\facts.yaml" -Append -Encoding ascii    
    echo "`ncompany_name : ${company_name}" | Out-File -FilePath "C:\ProgramData\PuppetLabs\facter\facts.d\facts.yaml" -Append -Encoding ascii 
    echo "`napplication : ${application}" | Out-File -FilePath "C:\ProgramData\PuppetLabs\facter\facts.d\facts.yaml" -Append -Encoding ascii 
    echo "`nservertype : ${servertype}" | Out-File -FilePath "C:\ProgramData\PuppetLabs\facter\facts.d\facts.yaml" -Append -Encoding ascii 
} 

错误使用供应者资源时: 1个错误发生:

  • azurerm_virtual_machine.avmweb0: 1错误(s )发生了:

  • 未知错误后http://x.x.x.x:5985/wsman:拨打TCP XXXX:5985:connectex:连接尝试失败,因为连接的方没有正确一段时间后响应或已建立的连接失败,因为连接的主机未能响应。

Terraform不会在出现错误时自动回滚。 取而代之的是,您的Terraform状态文件已被部分更新,其中 已成功完成。请解决上述错误 并再次申请增量改变你的基础设施[0分[0米

代码:

resource "azurerm_virtual_machine_extension" "avmme0" { 
    name     = "${var.env}-${var.vm_computer_name}-config" 
    location    = "West US" 
    resource_group_name = "${module.network.resource-grp-name}" 
    virtual_machine_name = "${azurerm_virtual_machine.avmweb0.name}" 
    publisher   = "Microsoft.Compute" 
    type     = "CustomScriptExtension" 
    type_handler_version = "1.8" 

    settings = <<SETTINGS 
    { 
     "fileUris": ["https://raw.githubusercontent.com/saveshnshetty/devops/master/userdata.ps1"], 
     "commandToExecute": "powershell.exe -ExecutionPolicy unrestricted -NoProfile -NonInteractive -File userdata.ps1" 
    } 
SETTINGS 

    tags { 
     Name   = "${var.env}-${var.bu}-${var.company_name}-media" 
     BussinessUnit = "${var.bu}" 
     Environment  = "${var.env}" 
     CompanyName  = "${var.company_name}" 
     Application  = "${var.appname}" 
    } 
} 

错误: [0分[1mazurerm_virtual_machine_extension.avmme0:仍然创造...(25m20s经过)[0米[0米 [31mError施加计划:

1个错误发生:

  • azurerm_virtual_machine_extension.avmme0:1个错误发生:

  • azurerm_virtual_machine_extension.avmme0:compute.VirtualMachineExtensionsClient#CreateOrUpdate:失败发送请求:的StatusCode = 200 - 原始错误:具有状态 '失败' 终止长时间运行操作:代码=“VMAgentStatusCommunicationError”消息=“VM'dev-it-mactores-media-vm'尚未报告VM代理或扩展的状态。请验证虚拟机有一个正在运行的虚拟机代理,并能建立Azure存储的出站连接“

我能够从服务器上下载下面命令:$ 客户端=新对象System.Net。 Web客户端 $ client.DownloadFile( “https://raw.githubusercontent.com/saveshnshetty/devops/master/userdata.ps1”, “C:\ TEMP \ userdata.ps1”)

入站和出站规则为您开放,5985

Tf var file details : 
region     ="West US" 
storage_account_type ="" 
vm.size     ="Standard_DS1_v2" 
location    ="West US" 
appname     ="xxx" 
bu      ="it" 
company_name   ="xxxx" 
env      ="dev" 
tenant_id    ="" 
client_secret   ="" 
client_id    ="" 
storage_account_type ="Standard_LRS" 
vm_size     = "Standard_DS1_v2" 
vm_publisher   = "MicrosoftWindowsServer" 
vm_offer    = "WindowsServer" 
vm_sku     = "2012-R2-Datacenter" 
vm_version    = "latest" 
vm_computer_name  = "web-media" 
vm_admin_username  = "xxxx" 
vm_admin_password  = "xxxx" 
+1

那么问题是什么?有一段代码和配置,但没有错误或描述会发生什么以及应该发生什么。 – vonPryz

+0

当我在Azure虚拟机资源中只运行自定义数据脚本时,它不会从terraform端抛出任何错误。但是当我执行预配置资源时发生错误。 –

+0

请编辑问题并在问题本身中添加错误详细信息。不要将它们添加为评论。 – vonPryz

回答

2

的原因错误日志是你。不要在Azure NSG上打开5985端口,所以,哟您的脚本无法连接到Azure虚拟机。对于Azure虚拟机,我建议您可以使用Custom Script Extension而不是winrm您的虚拟机。

The Custom Script Extension downloads and executes scripts on Azure virtual machines. This extension is useful for post deployment configuration, software installation, or any other configuration/ management task.

Terraform还支持自定义脚本扩展。请参阅此link。根据您的情况,我建议您将自定义数据保存为ps1文件并将其上传到GitHub或Azure存储帐户。你可以参考我的answer。窗口自定义脚本扩展应使用如下:

resource "azurerm_virtual_machine_extension" "test" { 
    name     = "hostname" 
    location    = "West US" 
    resource_group_name = "${azurerm_resource_group.test.name}" 
    virtual_machine_name = "${azurerm_virtual_machine.test.name}" 
    publisher   = "Microsoft.Compute" 
    type     = "CustomScriptExtension" 
    type_handler_version = "1.8" 

    settings = <<SETTINGS 
    { 
     "fileUris": ["https://raw.githubusercontent.com/saveshnshetty/devops/master/userdata.ps1"], 
     "commandToExecute": "powershell.exe -ExecutionPolicy unrestricted -NoProfile -NonInteractive -File userdata.ps1" 
    } 
SETTINGS 

你可以检查我的vm.tf

+0

谢谢沃尔特!我尝试了自定义扩展脚本,并在自定义数据脚本中调用* .ps1文件,但没有运气! –

+0

你能分享你的错误日志吗? –

+0

@sarveshshetty这是您自己的VHD图像和Azure图像?我会在我的实验室进行测试。 –