问题:
在 Terragrunt 存储库中使用
TFENV_AUTO_INSTALL
环境变量时,许多不同 Terraform 版本的并发安装会触发竞争条件。
这会导致错误,其中 tfenv 尝试在并行管道作业中同时安装多个版本的 Terraform,从而导致权限被拒绝的问题。
我的代码仓库:
dev-account01
├── eu-west-1
│ ├── iam_roles
│ │ ├── .terraform-version
│ │ ├── main.tf
│ ├── networking
│ │ ├── .terraform-version
│ │ ├── main.tf
对于每个模块都有不同的
terrform version
1.6.2 和 1.5.5
PS:在我的实际设置中,我有更多的区域、更多的模块和更多的帐户。
错误信息:
/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
可重现场景:
TFENV_AUTO_INSTALL
。预期行为:
TFENV_AUTO_INSTALL
应优雅或按顺序处理并发安装,避免竞争条件和权限被拒绝错误。
或者有什么方法可以序列化每个帐户中我的 terraform 模块中存在的不同 terraform 版本的安装?
您可能会考虑使用包装器脚本来序列化 Terraform 版本安装,确保一次仅安装一个版本 (
tfenv install
),避免竞争条件和权限问题。
在管道中执行 Terragrunt 命令之前
运行此脚本 (
tfenv_serial_install.sh
)。
#!/bin/bash
# Wrapper script for tfenv to install Terraform versions serially
# Lock file to synchronize tfenv installations
LOCK_FILE="/tmp/tfenv-install.lock"
# Function to install Terraform version
install_tf_version() {
version=$1
(
flock -x 200
tfenv install "$version"
) 200>$LOCK_FILE
}
# Extract Terraform versions from .terraform-version files and install them serially
for tf_version_file in $(find . -name ".terraform-version"); do
version=$(cat "$tf_version_file")
install_tf_version "$version"
done