【问题标题】:How can I use Terraform's file provisioner to copy from my local machine onto a VM?如何使用 Terraform 的文件配置器从本地计算机复制到 VM?
【发布时间】:2018-07-12 01:56:41
【问题描述】:

我是 Terraform 的新手,到目前为止,我已经成功地在 Azure 上启动并运行了一个基本的 VM(加上资源管理器)。我想到的下一个任务是让 Terraform 将一个文件从我的本地机器复制到新创建的实例中。理想情况下,我追求的是每次运行应用命令时都会复制文件的解决方案。

我觉得我已经很接近了,但到目前为止,一旦我申请,我就会收到无休止的“仍在创建...”语句(文件为 0kb,所以几分钟后放弃是安全的)。

到目前为止,这就是我所拥有的(基于此代码):https://stackoverflow.com/a/37866044/4941009

网络

resource "azurerm_public_ip" "pub-ip" {
    name = "PublicIp"
    location = "${var.location}"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    public_ip_address_allocation = "Dynamic"
    domain_name_label = "${var.hostname}"
}

虚拟机

resource "azurerm_virtual_machine" "vm" {
  name                  = "${var.hostname}"
  location              = "${var.location}"
  resource_group_name   = "${azurerm_resource_group.rg.name}"
  vm_size               = "${var.vm_size}"
  network_interface_ids = ["${azurerm_network_interface.nic.id}"]

  storage_image_reference {
    publisher = "${var.image_publisher}"
    offer     = "${var.image_offer}"
    sku       = "${var.image_sku}"
    version   = "${var.image_version}"
  }

  storage_os_disk {
    name          = "${var.hostname}osdisk1"
    vhd_uri       = "${azurerm_storage_account.stor.primary_blob_endpoint}${azurerm_storage_container.cont.name}/${var.hostname}osdisk.vhd"
    os_type       = "${var.os_type}"
    caching       = "ReadWrite"
    create_option = "FromImage"
  }

  os_profile {
    computer_name  = "${var.hostname}"
    admin_username = "${var.admin_username}"
    admin_password = "${var.admin_password}"
  }

  os_profile_windows_config {
    provision_vm_agent = true
  }

  boot_diagnostics {
    enabled     = true
    storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}"
  }

  tags {
      environment = "${var.environment}"
  }
}

文件配置器

resource "null_resource" "copy-test-file" {

  connection {
    type     = "ssh"
    host     = "${azurerm_virtual_machine.vm.ip_address}"
    user     = "${var.admin_username}"
    password = "${var.admin_password}"
  }

  provisioner "file" {
    source      = "test.txt"
    destination = "/tmp/test.txt"
  }

}

顺便说一句,如果我将不正确的登录详细信息传递给供应商(即在虚拟机创建后重新运行并向供应商提供不同的密码),行为是相同的。谁能建议我哪里出错了?

【问题讨论】:

  • 听起来像个虫子……
  • terraform 用于创建基础架构。我觉得如果你想配置你的机器,你应该查看ansible。
  • 是的,我的意思是我同意 Terraform 不是最好的配置,但我只需要复制一个文件,感觉为此使用完全不同的产品可能有点矫枉过正。另外,最好用一个脚本来整理整个事情。
  • 在启用调试的情况下运行时日志会说什么?我的意思是,像这样运行:TF_LOG=DEBUG terraform apply
  • 对于其他遇到此问题的人,我发布了一个不需要使用文件配置器的解决方法:stackoverflow.com/questions/58631004

标签: azure terraform


【解决方案1】:

我最终得到了这个工作。老实说,我有点忘记了这个问题,所以我不记得我的确切问题是什么,但下面的示例似乎适用于我的实例:

resource "null_resource" remoteExecProvisionerWFolder {

  provisioner "file" {
    source      = "test.txt"
    destination = "/tmp/test.txt"
  }

  connection {
    host     = "${azurerm_virtual_machine.vm.ip_address}"
    type     = "ssh"
    user     = "${var.admin_username}"
    password = "${var.admin_password}"
    agent    = "false"
  }
}

所以看起来这里唯一的区别是添加了agent = "false"。这是有道理的,因为 Windows 只有一个 SSH 身份验证代理,而且我之前可能没有明确指定使用该代理。然而,很可能我最终在配置的其他地方进行了更改。很抱歉未来的人在这方面没有太多帮助。

【讨论】:

    【解决方案2】:

    仅供参考,您可以通过 winrm 类型连接的 windows 实例

    resource "null_resource" "provision_web" {
    
      connection {
        host     = "${azurerm_virtual_machine.vm.ip_address}"
        type     = "winrm"
        user     = "alex"
        password = "alexiscool1!"
      }
    
      provisioner "file" {
        source      = "path/to/folder"
        destination = "C:/path/to/destination"
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2020-08-23
      • 1970-01-01
      • 2018-06-26
      相关资源
      最近更新 更多