在GitLab CI中用Terraform执行SQL查询时遇psql未找到错误
问题:GitLab CI中Terraform local-exec调用psql提示找不到命令
场景与代码
VPC资源创建完成后,通过GitLab CI使用Terraform执行SQL查询,使用的null_resource脚本如下:
resource "null_resource" "db_setup" { triggers = { file = filesha1("${path.module}/test.sql") } provisioner "local-exec" { command = "psql -h '${aws_rds_cluster.rds_cluster}' -p 5432 -U '${rds_cluster.master_username}' -d dbaname -f 'test.sql' -W '${random_password}'" } }
报错信息
执行过程中触发以下错误:
Error: local-exec provisioner error with module.rds-db.null_resource.db_setup, on ../modules/rds-db/db.tf line 158, in resource "null_resource" "db_setup": provisioner "local-exec" { Error running command 'psql -V': exit status 127. Output: /bin/sh: psql:not found
已执行的流水线配置
在GitLab CI流水线中已安装psql并尝试配置路径:
- apk add postgresql postgresql-client - psql -V - apk add --update util-linux - whereis psql - export PATH=/usr/bin/psql:$PATH
解决办法
1. 修正PATH配置错误
当前PATH配置把/usr/bin/psql(可执行文件路径)加到了PATH里,这是错误的——PATH需要添加的是可执行文件所在的目录,而非文件本身。通过whereis psql可确认psql位于/usr/bin,所以正确的PATH配置应为:
export PATH=/usr/bin:$PATH
2. 直接使用psql绝对路径(更可靠)
如果PATH配置仍有问题,可在Terraform的local-exec命令中直接指定psql的绝对路径,彻底规避PATH依赖:
provisioner "local-exec" { command = "/usr/bin/psql -h '${aws_rds_cluster.rds_cluster}' -p 5432 -U '${rds_cluster.master_username}' -d dbaname -f 'test.sql' -W '${random_password}'" }
3. 检查流水线步骤顺序
确保安装psql、配置PATH的步骤在terraform apply执行之前,保证环境变量配置生效后再运行Terraform命令。
内容的提问来源于stack exchange,提问作者Shubham
相关产品推荐
相关产品推荐

