Terraform使用cloud-init无法为EC2实例部署多个文件求助
问题原因与解决方法
错误分析
多Part覆盖问题:第一个配置拆分了两个
part块,且均为text/cloud-config类型。cloud-init处理这类配置时,后续Part中的同名配置项(如write_files)会直接覆盖前面的内容,最终仅保留最后一个Part定义的文件。单数组元素重复键冲突:第二个配置将两个文件的参数写在同一个数组对象内,YAML语法不允许同一对象中重复定义相同键(如
content、path),解析时只会保留最后一组键值对,导致仅第二个文件生效。
正确配置
将所有文件定义放在同一个write_files数组的独立对象中,使用单个part块:
data "cloudinit_config" "userdata" { gzip = true base64_encode = true part { content_type = "text/cloud-config" content = yamlencode({ write_files = [ { content = data.aws_ssm_parameter.certificate.value path = "/root/certificate.pem.crt" owner = "root:root" permissions = "0644" }, { content = data.aws_ssm_parameter.config.value path = "/root/configuration.conf" owner = "root:root" permissions = "0644" } ] }) } } resource "aws_instance" "ec2_ubuntu" { ... user_data_base64 = data.cloudinit_config.userdata.rendered ... }
原理说明
cloud-init的write_files是数组类型配置项,每个数组元素对应一个待写入的文件。将所有文件定义放在同一write_files数组中,cloud-init会依次处理每个对象,完成多文件的写入操作。
内容的提问来源于stack exchange,提问作者Murad
相关产品推荐
相关产品推荐

