2017-04-16 42 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