代码之家  ›  专栏  ›  技术社区  ›  Saifeddine Rajhi

Terraform版本的tfenv安装中的并发控制

  •  0
  • Saifeddine Rajhi  · 技术社区  · 2 年前

    描述

    我目前面临一个问题,我的Terraform基础设施设置使用亚特兰蒂斯和Terragrunt。当Terragrunt试图创建多个工作空间时,问题就出现了,每个工作空间都需要不同版本的Terraform。为了解决这个问题,Terragrunt利用 tfenv install 以并行安装必要的Terraform版本。

    但是,这种并发执行会在安装过程中导致与权限相关的错误,从而导致以下问题:

    /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 GitHub存储库中创建了一个问题 here .

    为了缓解这个问题,我正在探索为 tfenv安装 确保 序列化安装 Terraform版本。

    该脚本应确保即使多个工作区并行执行,Terraform版本的任何安装都是按顺序完成的。这是为了防止在同时尝试多个安装时可能出现的争用情况。

    我如何看待流量:

    1. 亚特兰蒂斯称之为“tfenv包装器”

    2. 包装器检查是否存在锁:

      a.如果没有锁,则此调用获取锁并进行到步骤3。

      b.如果存在锁,则此调用将等待该锁变为可用,并进行到步骤4。

    3. 带有锁的调用安装所需版本的tfenv并释放锁。

    4. 不带锁的调用会检查活动锁安装的版本。如果它与所需版本匹配,则可以安全退出。如果没有,则等待锁变为可用,并进入步骤3。

    我已经起草了一个剧本,但它似乎没有正确地解决这个问题。这是我创建的脚本:

    #!/bin/bash
    
    LOCK_FILE="/tmp/tfenv-wrapper.lock"
    PROCESS_COUNTER_FILE="/tmp/tfenv-process-counter"
    MAX_CONCURRENT_PROCESSES=2
    
    # Function to acquire a lock
    function acquire_lock() {
        exec 100>"$LOCK_FILE"
        flock -x 100
    }
    
    # Function to release the lock
    function release_lock() {
        flock -u 100
    }
    
    # Function to get the current process count
    function get_process_count() {
        pgrep -f "tfenv install" | grep -v $$ | wc -l
    
    }
    
    # Function to update the process count
    function update_process_count() {
        get_process_count > "$PROCESS_COUNTER_FILE"
    }
    
    # Set up the EXIT trap to release the lock and remove the lock file on script exit
    trap 'release_lock' EXIT
    
    # Infinite loop to keep the script running
    while true; do
        # Acquire the lock
        acquire_lock
        echo "Lock acquired."
    
        # Read the number of running processes from the counter file
        num_processes=$(get_process_count)
        echo "Number of tfenv processes: $num_processes"
    
        # If the number of running processes exceeds the limit, wait
        while [ "$num_processes" -ge "$MAX_CONCURRENT_PROCESSES" ]; do
            echo "Maximum number of concurrent 'tfenv' processes reached. Waiting for processes to complete."
            sleep 2
            num_processes=$(get_process_count)
        done
    
        # Increment the process counter
        ((num_processes++))
        update_process_count
    
        # Release the lock
        release_lock
        echo "Released lock."
    
        # Wait for any 'tfenv' process launched outside this script to complete
        while [ "$(get_process_count)" -gt 0 ]; do
            sleep 2
        done
    
        # Acquire the lock again before decrementing the counter
        acquire_lock
        echo "Lock acquired."
    
        # Decrement the process counter
        ((num_processes--))
        update_process_count
    
        # Release the lock
        release_lock
        echo "Released lock."
    done
    
    

    因此,只要有“锁”,这个脚本就应该一直运行,并等待“锁”空闲,然后安装它需要的版本(如果“以前”有锁的进程还没有安装)

    如果有任何见解、建议或替代解决方案来控制的并发性,我将不胜感激 tfenv安装 命令,并避免与权限相关的错误。非常感谢。

    0 回复  |  直到 2 年前