Packer构建Ubuntu 20.04模板后Terraform实例化出现DataSourceNone问题
问题修复方案
根因说明
错误日志中的DataSourceNone表示cloud-init启动时未识别到可用数据源,无法读取Terraform传入的guestinfo配置,核心原因有三点:
- Ubuntu 20.04及以上版本预装的cloud-init(v20.1+)已内置VMware数据源,你在Packer中手动安装的第三方
cloud-init-vmware-guestinfo工具已废弃,和系统内置组件冲突导致数据源检测失败 - cloud-init清理脚本错误提前创建了
/var/lib/cloud/instance软链接,导致cloud-init误判已经完成初始化,直接跳过数据源检测流程 - Terraform的
extra_config编码配置不匹配,你使用base64gzip压缩了数据,但编码字段填写的是base64,cloud-init无法正常解压解析配置内容
修复步骤
1. 移除Packer配置中的第三方数据源安装
删除Packer provisioners中的以下配置段:
{ "type": "shell", "inline": ["curl -sSL https://raw.githubusercontent.com/vmware/cloud-init-vmware-guestinfo/master/install.sh | sudo sh -"] }
2. 新增VMware数据源强制启用配置
在Packer的user-data配置中添加cloud-init配置,或通过Ansible写入/etc/cloud/cloud.cfg.d/99-vmware.cfg文件,内容如下:
datasource_list: [ VMware, None ] datasource: VMware: vmware_cust_file_max_wait: 20
3. 修正cloud-init清理脚本
替换原有清理脚本为以下内容,避免误触发初始化完成判断:
#!/bin/sh set -e chown -R root:root /etc/cloud/cloud.cfg.d/ # 完全清理cloud-init历史状态和日志 cloud-init clean --logs --seed # 重置机器ID truncate -s 0 /etc/machine-id rm -f /var/lib/dbus/machine-id ln -s /etc/machine-id /var/lib/dbus/machine-id # 清理临时文件 rm -rf /tmp/* /var/tmp/*
4. 修正Terraform编码配置
将extra_config中的编码字段修改为gzip+base64,匹配你使用的base64gzip压缩方式:
extra_config = { "guestinfo.metadata" = base64gzip(templatefile("${path.module}/templates/metadata.tmpl", { hostname = var.hostname })) "guestinfo.metadata.encoding" = "gzip+base64" "guestinfo.userdata" = base64gzip(templatefile("${path.module}/templates/userdata.tmpl", { hostname = var.hostname, domain = var.domain })) "guestinfo.userdata.encoding" = "gzip+base64" }
验证方式
重新通过Packer构建镜像后,使用Terraform部署实例,进入系统执行cloud-init query ds,返回VMware即代表数据源识别正常,查看/root目录可看到生成的hello和lol文件,说明用户配置已成功应用。
内容的提问来源于stack exchange,提问作者Armand
相关产品推荐
相关产品推荐

