Terraform 在 Azure 上预配私有 VM

Terraform provision private VM on Azure

我是 Terraform 的新手。我有一个包含两个 Ubuntu VM 的子网。一个是 VM A,有 public IP,另一个是 VM B,有私有 IP,没有 public IP。是否有一种 Terraform 方法可以在 B 上配置文件和 运行 命令,而无需先通过 SSH 进入 VM A,然后再进入 VM B

根据我的发现,Terraform 中的 file 供应商需要一个 connection 块,如下所示:

      # Example Azure VM provisioner block
      provisioner "remote-exec" {
        inline = [
          "rsync -Pav user@A:~/install.sh ~",
          "rsync -Pav user@A:~/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 字段中输入什么才能使此供应商成功。

据我所知,您无法直接使用 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