AWS自定义AMI实例Cloud-init无法获取数据源求助
问题:AWS自定义AMI启动实例后Cloud-Init用户数据未生效
问题现象
- 通过AWS控制台使用自定义AMI启动实例,系统初始化阶段需更新XML文件,但输入的用户数据未生效。
- 查看
ds-identify.log和cloud-init-generator.log发现Cloud-Init无法获取数据源,导致Cloud-Init被禁用。
关键日志信息
ds-identify.log
[up 1.17s] ds-identify policy loaded: mode=search report=false found=all maybe=all notfound=disabled no datasource_list found, using default: MAAS ConfigDrive NoCloud AltCloud Azure Bigstep CloudSigma CloudStack DigitalOcean AliYun Ec2 GCE OpenNebula OpenStack OVF SmartOS Scaleway Hetzner IBMCloud Oracle Exoscale RbxCloud DMI_PRODUCT_NAME=t3.small DMI_SYS_VENDOR=Amazon EC2 DMI_PRODUCT_SERIAL=ec2972df-81d1-c72e-f54d-0da7741efa46 DMI_PRODUCT_UUID=DF7229EC-D181-2EC7-F54D-0DA7741EFA46 PID_1_PRODUCT_NAME=unavailable DMI_CHASSIS_ASSET_TAG=Amazon EC2 FS_LABELS=any:scandir,any:scandir,any:scandir,any:scandir,var,config,deferred,logs,wk,boot,opt,root,notused,rescue ISO9660_DEVS= KERNEL_CMDLINE=BOOT_IMAGE=/vmlinuz-x.x.xx-x.xx..0.x86_64 ro root=LABEL=root quiet nmi_watchdog=2 fsck.repair=yes fips=1 elevator=noop rootdelay=300 console=ttyS0,115200n8 aws nvme_core.io_timeout=255 rootfstype=ext4 VIRT=kvm UNAME_KERNEL_NAME=Linux UNAME_KERNEL_RELEASE=x.x.xx-x.xx..0.x86_64 UNAME_KERNEL_VERSION=#1 SMP Thu Mar 21 13:43:44 UTC 2024 UNAME_MACHINE=x86_64 UNAME_NODENAME=mlos-tiny UNAME_OPERATING_SYSTEM=GNU/Linux DSNAME= DSLIST=MAAS ConfigDrive NoCloud AltCloud Azure Bigstep CloudSigma CloudStack DigitalOcean AliYun Ec2 GCE OpenNebula OpenStack OVF SmartOS Scaleway Hetzner IBMCloud Oracle Exoscale RbxCloud MODE=search ON_FOUND=all ON_MAYBE=all ON_NOTFOUND=disabled pid=734 ppid=722 is_container=false is_ds_enabled(IBMCloud) = true. ec2 platform is 'Unknown'. is_ds_enabled(IBMCloud) = true. No ds found [mode=search, notfound=disabled]. Disabled cloud-init [1] [up 1.44s] returning 1
cloud-init-generator.log
/usr/lib/systemd/system-generators/cloud-init-generator normal=/run/systemd/generator early=/run/systemd/generator.early late=/run/systemd/generator.late kernel command line (/proc/cmdline): BOOT_IMAGE=/vmlinuz-x.x.xx-x.xx.xx.x.x86_64 ro root=LABEL=root quiet nmi_watchdog=2 fsck.repair=yes fips=1 elevator=noop rootdelay=300 console=ttyS0,115200n8 aws nvme_core.io_timeout=255 rootfstype=ext4 kernel_cmdline found unset etc_file found unset default found enabled checking for datasource ds-identify rc=1 ds-identify _RET=notfound **cloud-init is enabled but no datasource found, disabling** already disabled: no change needed [no /run/systemd/generator.early/multi-user.target.wants/cloud-init.target] [root@ip-xx-xx-xx-xx cloud-init]#
当前配置信息
- Cloud-Init版本:
cloud-init-19.4-12 /etc/cloud/cloud.cfg配置:
users: - default disable_root: 0 ssh_pwauth: 0 mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2'] resize_rootfs_tmp: /dev ssh_deletekeys: 1 ssh_genkeytypes: ~ syslog_fix_perms: null disable_vmware_customization: false datasource_list: [Ec2] datasource: Ec2: metadata_urls: ["http://169.254.169.254:80"] max_wait: 120 timeout: 50 strict_id: false #/etc/hosts file will be replaced with the one in /etc/cloud/templates. manage_etc_hosts: true cloud_init_modules: - disk_setup - migrator - bootcmd - write-files - growpart - resizefs - set_hostname - update_hostname - update_etc_hosts - rsyslog - users-groups - ssh cloud_config_modules: - mounts - locale - set-passwords - rh_subscription - yum-add-repo - package-update-upgrade-install - timezone - puppet - chef - salt-minion - mcollective - runcmd cloud_final_modules: - rightscale_userdata - scripts-per-once - scripts-per-boot - scripts-per-instance - scripts-user - ssh-authkey-fingerprints - keys-to-console - phone-home - final-message - power-state-change system_info: default_user: name: centos lock_passwd: true gecos: Cloud User groups: [adm, systemd-journal] sudo: ["ALL=(ALL) NOPASSWD:ALL"] shell: /bin/bash distro: rhel paths: cloud_dir: /var/lib/cloud templates_dir: /etc/cloud/templates ssh_svcname: sshd # vim:syntax=yaml
测试用用户数据
Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud_final_modules: - [scripts-user, always] runcmd: - [ mkdir, /test-cloudinit ] write_files: - path: /test-cloudinit/cloud-init.txt content: Created by cloud-init --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash mkdir test-userscript touch /test-userscript/userscript.txt echo "Created by bash shell script" >> /test-userscript/userscript.txt --//--
解决方案
修复Cloud-Init配置加载问题
日志显示no datasource_list found,说明当前cloud.cfg的配置未被正确读取:- 确认文件权限:执行
chmod 644 /etc/cloud/cloud.cfg && chown root:root /etc/cloud/cloud.cfg - 验证YAML语法:执行
cloud-init devel schema --config-file /etc/cloud/cloud.cfg检查是否存在语法错误
- 确认文件权限:执行
解决EC2数据源识别问题
日志中ec2 platform is 'Unknown'是旧版本Cloud-Init的已知问题,可通过以下方式处理:- 在
/etc/cloud/cloud.cfg.d/目录下创建90_datasource.cfg文件,内容如下:datasource_list: [Ec2] datasource: Ec2: strict_id: false - 或在启动实例时,通过AWS控制台"高级详情"的"内核启动参数"添加
ds=Ec2
- 在
确保元数据访问正常
- 执行
curl http://169.254.169.254/latest/meta-data/instance-id,验证能否获取实例ID,若失败则检查安全组/网络ACL是否允许访问169.254.169.254 - 日志中显示启用了FIPS模式(
fips=1),可尝试临时关闭FIPS(修改内核参数fips=0)测试是否兼容
- 执行
更新Cloud-Init版本
19.4版本存在较多兼容性问题,建议更新到最新稳定版:- CentOS/RHEL系统执行
yum update cloud-init -y,更新后重新生成AMI测试
- CentOS/RHEL系统执行
修正用户数据格式
- shell脚本中的
mkdir test-userscript会在Cloud-Init执行目录创建,建议改为绝对路径mkdir /test-userscript - 检查用户数据是否存在多余空格或换行,避免解析失败
- shell脚本中的
验证步骤
修改配置后,手动触发Cloud-Init测试:
cloud-init clean cloud-init init cloud-init modules --mode config cloud-init modules --mode final
随后检查/test-cloudinit、/test-userscript目录是否创建,或查看/var/log/cloud-init.log确认执行情况
内容的提问来源于stack exchange,提问作者shiv chittora
相关产品推荐
相关产品推荐

