2017-07-24 15 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圖像?我會在我的實驗室進行測試。 –