You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform配置文件中调用Cloudinit文件不生效问题排查

Cloudinit配置在Azure VM中未生效的排查与修复

问题现象

通过Terraform部署Azure Linux虚拟机时,已配置Cloudinit文件创建ansible用户并赋予sudo权限,但执行terraform apply后虚拟机创建成功,却未看到Cloudinit的任何配置变更。

提供的配置文件

Cloudinit模板文件(sshPass.tpl)

users:
- name: ansible
  gecos: Ansible
  sudo: ALL=(ALL) NOPASSWD:ALL
  groups: [users, admin]
  shell: /bin/bash
  ssh_authorized_keys:
    - ssh-rsa AAAAB3NzaC1.......

Terraform主配置(main.tf)

data "template_file" "users_data" {
  template = file("./sshPass.tpl")
}

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

  part {
  content_type = "text/cloud-config"
  content      = data.template_file.users_data.rendered
}

resource "azurerm_linux_virtual_machine" "poc-vm" {
    name                  = var.vm_name
    resource_group_name   = azurerm_resource_group.poc_rg.name
    location              = azurerm_resource_group.poc_rg.location
    size                  = var.virtual_machine_size
    admin_username        = var.vm_username
    network_interface_ids = [azurerm_network_interface.poc_nic_1.id]

    admin_ssh_key {
      username   = var.vm_username
      public_key = tls_private_key.poc_key.public_key_openssh
    }

    os_disk {
      caching              = var.disk_caching
      storage_account_type = var.storage_type
    }

    source_image_reference {
     publisher = var.image_publisher
     offer     = var.image_offer
     sku       = var.image_sku
     version   = var.image_version
    }

    user_data = data.template_cloudinit_config.config.rendered
}

排查与修复步骤

1. 查看Cloudinit执行日志

登录虚拟机,检查Cloudinit的运行日志,定位错误原因:

cat /var/log/cloud-init.log
cat /var/log/cloud-init-output.log

常见问题包括配置格式错误、权限不足、网络问题导致资源拉取失败等。

2. 修正Terraform配置语法错误

你的main.tf中data "template_cloudinit_config" "config"块缺失闭合大括号,会导致Terraform无法正确渲染user_data。修正后的配置:

data "template_file" "users_data" {
  template = file("./sshPass.tpl")
}

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

  part {
    content_type = "text/cloud-config"
    content      = data.template_file.users_data.rendered
  }
}

resource "azurerm_linux_virtual_machine" "poc-vm" {
    name                  = var.vm_name
    resource_group_name   = azurerm_resource_group.poc_rg.name
    location              = azurerm_resource_group.poc_rg.location
    size                  = var.virtual_machine_size
    admin_username        = var.vm_username
    network_interface_ids = [azurerm_network_interface.poc_nic_1.id]

    admin_ssh_key {
      username   = var.vm_username
      public_key = tls_private_key.poc_key.public_key_openssh
    }

    os_disk {
      caching              = var.disk_caching
      storage_account_type = var.storage_type
    }

    source_image_reference {
     publisher = var.image_publisher
     offer     = var.image_offer
     sku       = var.image_sku
     version   = var.image_version
    }

    user_data = data.template_cloudinit_config.config.rendered
}

3. 简化Cloudinit配置(可选)

如果模板文件无需变量替换,可直接用file函数读取,省去template_file环节:

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

  part {
    content_type = "text/cloud-config"
    content      = file("./sshPass.tpl")
  }
}

4. 验证user_data传递是否正确

部署完成后,在Azure门户查看虚拟机的用户数据:

  • 进入虚拟机详情页 → 配置 → 用户数据
  • 解码base64内容,确认是否与你的Cloudinit配置一致

5. 重新部署虚拟机

Cloudinit仅在虚拟机首次启动时执行,若之前已部署过该虚拟机,需销毁后重新创建:

terraform destroy -auto-approve
terraform apply -auto-approve

内容的提问来源于stack exchange,提问作者Abdul Majeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:35:45