繁体   English   中英

Bash 重试 - Azure CLI

[英]Bash Retry - Azure CLI

我在美国西部有一个 Azure 存储帐户,启用了异地复制以与美国东部同步,我想根据需要使用 bash 脚本执行故障转移。

我已经定义了以下 function

_STORAGE_ACCOUNT_FAILOVER () {
    echo "Storage account failover is initiated.."

    az storage account failover --name $STORAGEACCOUNT --no-wait --yes

    echo "Storage account failover is completed successfully.."
}

在尝试执行上述 function 时,出现以下错误

ERROR: (ResourceCollectionRequestsThrottled) Operation 'Microsoft.Storage/storageAccounts/read' failed as server encountered too many requests. 
Please try after '17' seconds. Tracking Id is ''.

如果出现任何问题,我想实现重试逻辑吗? 如何实现重试逻辑?

就像是

    _STORAGE_ACCOUNT_FAILOVER () {
        echo "Storage account failover is initiated.."

performFailover:
        az storage account failover --name $STORAGEACCOUNT --no-wait --yes

if [ "$?" -ne 0 ]; then
    goto performFailover;
fi
    
        echo "Storage account failover is completed successfully.."
    }

或类似的东西

_STORAGE_ACCOUNT_FAILOVER () {
    echo "Storage account failover is initiated.."

    while true; do
      az storage account failover --name $STORAGEACCOUNT --no-wait --yes

      if [ "$?" -eq 0 ]; then
        break;
      fi

      sleep 30s
    done

    echo "Storage account failover is completed successfully.."
}

人类可读的错误信息有些问题; 你能以机器可读的形式获得请求的重试等待吗?

这是一个速写,假设az在超时时设置了一个非零退出代码。 (如果你幸运的话,它会有一个针对这个特定错误的唯一退出代码。)

_STORAGE_ACCOUNT_FAILOVER () {
    echo "$0: Storage account failover initiated" >&2
    while true; do
        if result=$(az storage account failover \
            --name "$STORAGEACCOUNT" \
            --no-wait --yes 2>&1 >/dev/null)
        then
            break
        else
            rc=$?
            case $result in
             *"Please try after '"*)
                seconds=${result#*Please try after \'}
                seconds=${seconds%%\'*}
                wait "$seconds"
                ;;
             *) echo "$0: $result" >&2
                exit $rc
                ;;
            esac
        fi
    done
    echo "$0: Storage account failover completed successfully" >&2
}

注意我们如何从az命令捕获标准错误并解析出超时消息,或者如果我们不能返回错误。 还要注意如何将所有诊断消息打印为标准错误,并以电报格式进行格式化,但始终在消息中使用脚本的名称,因此如果您有脚本调用脚本调用脚本等,您可以判断哪个脚本失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM