【问题标题】:Error handling in cloud init scripts within azurerm_linux_virtual_machineazurerm_linux_virtual_machine 中的云初始化脚本中的错误处理
【发布时间】:2021-01-26 10:33:29
【问题描述】:

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

我的问题是,您如何处理这些错误,因为无论脚本的返回码如何,terraform 总是报告部署成功,这会在 VM 没有执行应有的操作时导致混乱。

这里是用于上下文的 terraform 文件的 sn-p:

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

感谢您的帮助。

【问题讨论】:

    标签: azure azure-virtual-machine terraform-provider-azure cloud-init


    【解决方案1】:

    Terraform 仅返回有关自身的错误,而不是在 VM 内执行的脚本。您可以在 VM 中找到错误消息。

    而要通过带有 shell 脚本的 cloud-init 安装 Azure CLI,您需要在 shell 脚本的开头添加#!/bin/bash,参见note

    并安装 Azure CLI,我认为你需要做的事情比你尝试的要多,看看install the Azure CLI in Ubuntu 的步骤。或者使用现有的shell脚本here

    【讨论】:

    • "Terraform 只返回关于自身的错误,而不是在 VM 内部执行的脚本。您可以在 VM 内部找到错误消息。" - 这就是我遇到的问题,我想要一个解决方案,让 terraform 意识到 cloud-init 脚本失败,猜想这是不可能的。无论如何,谢谢!
    • @Patrick 是的,同意你的看法。 cloud-init 还将错误消息放入 VM 内的日志中。Azure 不关心脚本是否成功执行。 Azure 只关心部署是否成功。
    【解决方案2】:

    这里的重要部分是来自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 可以完成的操作的更多示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 2017-07-18
      • 1970-01-01
      相关资源
      最近更新 更多