Terragrunt环境中TFENV_AUTO_INSTALL并发安装Terraform的竞态问题
Terragrunt+tfenv并发安装Terraform版本的竞态条件问题及解决方法
问题描述
在Terragrunt仓库中使用TFENV_AUTO_INSTALL环境变量时,多版本Terraform的并发安装会触发竞态条件,导致tfenv在并行流水线作业中安装多个Terraform版本时出现权限拒绝错误。
仓库结构示例
dev-account01 ├── eu-west-1 │ ├── iam_roles │ │ ├── .terraform-version │ │ ├── main.tf │ ├── networking │ │ ├── .terraform-version │ │ ├── main.tf
各模块使用不同的Terraform版本:1.6.2和1.5.5,实际环境包含更多区域、模块及账号。
错误信息
/home/user/.tfenv/lib/tfenv-exec.sh: line 43: /home/user/.tfenv/versions/1.6.2/terraform: Permission denied /home/user/.tfenv/lib/tfenv-exec.sh: line 43: exec: /home/user/.tfenv/versions/1.6.2/terraform: cannot execute: Permission denied
可复现场景
- 在Terragrunt仓库中启用
TFENV_AUTO_INSTALL; - 触发包含多个作业/计划的流水线,尝试安装多个未使用过的Terraform版本。
期望行为
TFENV_AUTO_INSTALL应能优雅处理并发安装或按顺序执行,避免竞态条件与权限拒绝错误。或提供序列化各账户Terraform模块版本安装的方法。
解决方案示例脚本
#!/bin/bash LOCK_FILE="/tmp/tfenv-wrapper.lock" MAX_CONCURRENT_PROCESSES=1 # 获取锁 function acquire_lock() { while true; do exec 202>"$LOCK_FILE" flock -n 202 && break echo "已有脚本实例在运行,等待其完成..." sleep 5 done } # 释放锁 function release_lock() { flock -u 202 rm -f "$LOCK_FILE" } # 检查正在运行的tfenv install进程数 function check_tfenv_processes() { pgrep -f "tfenv install" | grep -v $$ | wc -l } # 主循环 while true; do # 获取锁 acquire_lock # 检查进程数 num_processes=$(check_tfenv_processes) # 若进程数达到上限则等待 while [ "$num_processes" -ge "$MAX_CONCURRENT_PROCESSES" ]; do echo "已达到'tfenv install'最大并发数,等待进程完成..." sleep 5 num_processes=$(check_tfenv_processes) done # 此处添加实际业务逻辑 echo "脚本正在运行..." # 释放锁 release_lock done
当前工作空间
atlantis-git-test-0:/$ ls -l /atlantis-data/repos/orga/infra-test/4 total 24 drwx--S--- 5 atlantis atlantis 4096 Jan 8 10:00 default drwx--S--- 5 atlantis atlantis 4096 Jan 8 10:00 environments_eks-dev-1_09_eks drwx--S--- 5 atlantis atlantis 4096 Jan 8 10:00 environments_eks-dev-1_11_r53_zones drwx--S--- 5 atlantis atlantis 4096 Jan 8 10:00 environments_eks-dev-1_13_irsa drwx--S--- 5 atlantis atlantis 4096 Jan 8 10:00 environments_eks-dev-1_15_vault drwx--S--- 5 atlantis atlantis 4096 Jan 8 10:00 environments_eks-staging-1_11_r53_zones
内容的提问来源于stack exchange,提问作者Saifeddine Rajhi
相关产品推荐
相关产品推荐

