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
相关产品推荐
相关产品推荐

