首页 文章

如何使用Terraform的文件配置器从本地计算机复制到VM?

提问于
浏览
0

我是Terraform的新手,到目前为止已经设法在Azure上运行并运行基本的VM(加上资源管理器修剪) . 我想到的下一个任务是让Terraform将本地计算机中的文件复制到新创建的实例中 . 理想情况下,我正在寻找一个解决方案,每次运行apply命令时都会复制文件 .

我觉得我非常接近,但到目前为止,我只是在申请时得到无尽的“仍在创造...”语句(文件为0kb,所以在几分钟之后放弃感觉是安全的) .

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

Network

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}"
}

VM

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}"
  }
}

File Provisioner

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"
  }

}

顺便说一句,如果我将不正确的登录详细信息传递给配置程序(即在创建VM后重新运行此命令并向配置程序提供不同的密码),行为是相同的 . 任何人都可以建议我哪里出错了?

2 回答

  • 0

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

    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" . 这有点意义,因为我之前没有明确指定使用该代理 . 然而,很可能我最终在配置中的其他地方改变了一些东西 . 对未来的人们抱歉对此没什么帮助 .

  • 0

    仅供参考,您可以通过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"
      }
    
    }
    

相关问题