2017-04-16 41 views
1

我是Terraform的新手。我有兩個Ubuntu虛擬機的子網。一個是VM A,它具有公共IP,另一個是VM B,具有私有IP並且沒有公共IP。是否有Terraform方式在B上配置文件和運行命令,而無需首先通過SSH連接到虛擬機A然後虛擬到BTerraform在Azure上配置私有VM

從我找到了,file供應方在Terraform需要connection塊,像這樣:

 # Example Azure VM provisioner block 
     provisioner "remote-exec" { 
     inline = [ 
      "rsync -Pav [email protected]:~/install.sh ~", 
      "rsync -Pav [email protected]:~/file.txt ~", 
      "sudo ~/install.sh" 
     ] 
     connection { 
      type  = "ssh" 
      user  = "${var.ssh_user_username}" 
      host  = "<something to put here>" 
      private_key = "${file("~/.ssh/azure_key_rsa")}" 
      timeout = "1m" 
      agent = false 
     } 
     } 

但因爲我不能直接連接到在Terraform私有IP,我不知道要爲host字段添加什麼內容才能使此置備程序成功。

+0

我不認爲有一種方法可以在Terraform中執行此操作。有一個[正在進行的問題](https://github.com/hashicorp/terraform/issues/8367)關於允許ssh隧道出於同樣的目的與一些解決辦法 – karysto

+0

我不確定我是否正確理解您的需求,基於我的理解你想ssh到你的虛擬機B然後執行'install.sh',對嗎?據我所知,你可以用'terraform'來完成。你可以使用'CustomScript'來執行'install.sh',這個腳本是由Azure執行的,你不需要ssh到VM。 Terraform也支持'CustomScript',你可以參考這個[示例](https://www.terraform.io/docs/providers/azurerm/r/virtual_machine_extension.html)。 –

+0

@ Walter-MSFT您是對的,我想知道是否有一種方法可以在Terraform內部沒有公共IP的專用網絡中直接配置虛擬機。這看起來確實需要什麼,你能否讓你的評論成爲答案? – karysto

回答

1

據我所知,你不能直接用terraform來做。 您可以使用Custom Script extension來執行您的install.sh,該腳本由Azure執行,您不需要ssh到VM。

「自定義腳本擴展」配置指定了諸如腳本位置和要運行的命令之類的內容。此配置可以存儲在配置文件中,在命令行中或在Azure資源管理器模板中指定。敏感數據可以存儲在受保護的配置中,該配置在虛擬機內進行加密並僅解密。根據你的情況,這似乎是你需要的。

Terraform還支持CustomScript,你可以參考這個example

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.OSTCExtensions" 
    type     = "CustomScriptForLinux" 
    type_handler_version = "1.2" 

    settings = <<SETTINGS 
    { 
     "commandToExecute": "hostname" 
    } 
SETTINGS