azurerm_linux_virtual_machine 内的云初始化脚本中的错误处理

Error handling in cloud init scripts within azurerm_linux_virtual_machine

我使用 terraform 部署虚拟机时 运行 自定义 shell 脚本,这可能会引发错误。

我的问题是,你如何处理这些错误,因为不管脚本的 return 代码如何,terraform 总是报告部署成功,当 VM 不符合预期时会导致混淆要做。

这里是上下文的 terraform 文件片段:

data "template_file" "setup_script" {
  count    = var.agent_count
  template = file("scripts/setup.sh")
  vars = {
    POOL_NAME        = var.pool_name
    AGENT            = "agent-${count.index}"
    ORGANIZATION_URL = var.organization_url
    TOKEN            = var.token
    TERRAFORM_VERSION = var.terraform_version
    VSTS_AGENT_VERSION = var.vsts_agent_version
  }
}

resource "azurerm_linux_virtual_machine" "vmachine" {
  count               = length(module.network.network_interfaces)
  name                = "agent-${count.index}"
  resource_group_name = azurerm_resource_group.deployment-agents.name
  location            = azurerm_resource_group.deployment-agents.location
  size                = "Standard_B1ms"
  admin_username      = "adminuser"

  network_interface_ids = [
    module.network.network_interfaces[count.index].id,
  ]

  admin_ssh_key {
    username   = "adminuser"
    public_key = var.ssh_public_key
  }

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

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }

  boot_diagnostics {
    storage_account_uri = azurerm_storage_account.boot.primary_blob_endpoint
  }
  custom_data = base64encode(data.template_file.setup_script.*.rendered[count.index])
}

setup.sh shell 脚本:

# --- snip ----
apt-get install azure-cli
if [ $? -gt 0 ]; then
  echo "Cannot install azure cli!"
  exit 1
fi

# Test
exit 1

感谢您的帮助。

仅 Terraform return 关于自身的错误,而不是在 VM 内执行的脚本。您可以在虚拟机中找到错误信息。

要使用 shell 脚本通过 cloud-init 安装 Azure CLI,您需要在 shell 脚本的开头添加 #!/bin/bash,请参阅note:

并安装 Azure CLI,我认为您需要做的事情比您尝试的要多,请查看 install the Azure CLI in Ubuntu. Or use the existing shell script here.

的步骤

此处的重要部分是来自 Azure cloud-init docs 的“云初始化映像 部署不会失败 如果脚本失败”。 这意味着 Azure 认为部署成功,这也是 Terraform 将显示的内容。

为了使 Terraform 部署失败,您必须使用 cloud-init 来使用 cloud-init 本身安装 cli,这应该会导致部署失败:

data "template_cloudinit_config" "config" {
  gzip          = true
  base64_encode = true

  part {
    content_type = "text/cloud-config"
    content      = "packages: ['azure-cli']"
  }
}

有关在 docs.

中使用 cloud-init 可以做什么的更多示例