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 可以做什么的更多示例
我使用 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 可以做什么的更多示例