AWS EC2实例启动时cloud-init中runcmd未执行问题排查
cloud-init runcmd未执行的常见原因及排查
YAML语法/格式错误:这是最容易踩的坑。cloud-init依赖严格的YAML格式,
runcmd必须是数组结构,缩进要和其他模块保持统一。比如:
错误写法:runcmd: touch /tmp/test.txt正确写法:
runcmd: - touch /tmp/test.txt - aws route53 change-resource-record-sets --hosted-zone-id ZONEID --change-batch file:///tmp/change_dns.json检查要点:每个命令前必须加破折号,缩进用空格(别混用制表符),且层级和其他模块(如
users、write_files)一致。模块执行配置异常:查看
/etc/cloud/cloud.cfg中的cloud_config_modules列表,确认runcmd是否被包含在内。如果配置文件中移除了这个模块,或者把它放到了不会触发的阶段,就会导致不执行。键名拼写错误:比如误把
runcmd写成run_cmd或commands,cloud-init识别不到这个模块,自然不会执行其中的命令。cloud-init执行阶段限制:cloud-init默认仅在实例首次启动时完整执行配置。如果是重启实例,除非提前执行
cloud-init clean或修改了preserve_hostname等参数,否则runcmd不会重复触发。不过你这里users和write_files都成功了,这条可以优先排除。
排查小技巧:
- 查看
/var/log/cloud-init.log(不是cloud-init-output.log),里面会详细记录每个模块的加载、识别和执行状态,能直接看到runcmd是否被cloud-init处理。 - 用本地工具(比如
yamllint命令)校验你的cloud-config内容,快速定位YAML语法问题。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

