首页 > 解决方案 > Terraform 默认脚本路径

问题描述

我正在使用 cloud-init 在 Azure 中创建多个 VM,它们是并行创建的,当其中任何一个失败时,我可以在日志中看到:

错误:执行“/tmp/terraform_876543210.sh”时出错:进程以状态1退出

但我无法确定哪个 VM 出现故障,我需要对它们中的每一个进行 ssh 并检查脚本路径似乎是为配置Terraform定义的

有没有办法为 cloud-init 覆盖它,例如: /tmp/terraform_vmName_876543210.sh ?

我没有使用配置器而是 cloud-init,知道如何强制 terraform 覆盖 terraform sh 文件吗?

在我的脚本下面:

resource "azurerm_linux_virtual_machine" "example" {
  name                = "example-machine"
  resource_group_name = azurerm_resource_group.example.name
  location            = azurerm_resource_group.example.location
  size                = "Standard_F2"
  admin_username      = "adminuser"
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]

  admin_ssh_key {
    username   = "adminuser"
    public_key = file("~/.ssh/id_rsa.pub")
  }

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "16.04-LTS"
    version   = "latest"
  }
  
    custom_data = base64encode(templatefile(
    "my-cloud-init.tmpl", {
      var1 = "value1"
      var2 = "value2"
    })
  )
}

还有我的 cloud-init 脚本:

## template: jinja
#cloud-config

runcmd:
- sudo /tmp/bootstrap.sh

write_files:

- path: /tmp/bootstrap.sh
  permissions: 00700
  content: |
    #!/bin/sh -e
    echo hello

标签: terraformterraform-provider-azurecloud-init

解决方案


从您为 Terraform 找到的代码中,它显示:

DefaultUnixScriptPath 用作将文件复制到的路径,以便在 Unix 上远程执行(如果未另外提供)。

这是远程执行的配置。source而对于 SSH 的远程执行,可以destinationprovisioner "file".

但它用于设置远程 VM 中的路径,而不是您执行 Terraform 的本地计算机。您可以像这样覆盖文件名:

provisioner "file" {
  source      = "conf/myapp.conf"
  destination = "/etc/terraform_$(var.vmName).conf"

  ...
}

推荐阅读