Terraform File Provisioner问题:文件未写入指定路径求助
Terraform文件复制问题排查与解决
问题原因
- 目标路径的
scripts是普通文件而非目录:当指定destination = "/home/ec2-user/scripts/set_aws_profile.sh"时,如果EC2实例上的/home/ec2-user/scripts是一个文件,SSH传输工具无法在文件下创建子文件,会直接将内容写入到scripts文件中,而非预期的子文件。 - 目标目录不存在:Terraform的
fileprovisioner默认不会自动创建目标路径的上级目录,若/home/ec2-user/scripts目录不存在,部分场景下会将整个路径当作文件名,导致内容写入到scripts文件。
解决方法
1. 预处理:确保目标目录存在并清理异常文件
在file provisioner之前添加remote-exec provisioner,先删除可能存在的同名文件,再创建目标目录:
provisioner "remote-exec" { inline = [ "rm -f /home/ec2-user/scripts", "mkdir -p /home/ec2-user/scripts" ] connection { type = "ssh" user = "ec2-user" host = aws_instance.deployer_server.public_ip private_key = tls_private_key.deployer.private_key_openssh } }
2. 修正后的完整代码
resource "null_resource" "copy-set-aws-profile-script" { # 预处理:清理异常文件并创建目标目录 provisioner "remote-exec" { inline = [ "rm -f /home/ec2-user/scripts", "mkdir -p /home/ec2-user/scripts" ] connection { type = "ssh" user = "ec2-user" host = aws_instance.deployer_server.public_ip private_key = tls_private_key.deployer.private_key_openssh } } # 复制本地文件到目标路径 provisioner "file" { source = "${path.module}/scripts/set_aws_profile.sh" destination = "/home/ec2-user/scripts/set_aws_profile.sh" connection { type = "ssh" user = "ec2-user" host = aws_instance.deployer_server.public_ip private_key = tls_private_key.deployer.private_key_openssh } } depends_on = [ aws_instance.deployer_server, aws_key_pair.endava_deployer_ssh_key, ] }
3. 验证步骤
执行terraform apply后,通过SSH登录EC2实例,执行以下命令验证:
# 检查scripts是否为目录 ls -ld /home/ec2-user/scripts # 检查目标文件是否存在且内容正确 cat /home/ec2-user/scripts/set_aws_profile.sh
内容的提问来源于stack exchange,提问作者mlorand66
相关产品推荐
相关产品推荐

