并发az登录执行

时间:2019-10-13 13:52:17

标签: bash azure docker jenkins azure-cli

我正在使用Azure CLI在某些Azure VM上执行运行状况检查。使用bash在Jenkins阶段部署运行状况检查。该阶段本身可能需要花费几个小时才能完成,在此期间,将执行多个都需要适当凭据的az'vm run-commands'。

我还有几个Jenkins管道,这些管道部署了不同的产品,并且应该能够并行运行。它们都具有相同的健康检查阶段。

据我所知,当我执行“ az登录”以生成身份验证令牌并执行“ az帐户设置”以设置订阅时,将写入此数据到配置文件(〜/ .azure / azureProfile.json )。所以这一切都很好,但是只要我在这个Jenkins容器上触发并行管道,如果我使用其他Azure订阅,配置文件自然就会被不同的凭据覆盖,这将导致其他运行状况检查在获取时失败到下一个vm run命令执行,因为它正在寻找存在于不同预订中的资源组。

我当时正在考虑在每个阶段的运行过程中潜在地创建一个新的唯一Linux用户,然后在完成后将其删除,因此所有管道都将具有单独的配置文件。但是,这有点棘手,因为这是一个使用高山图像的Jenkins docker容器,我需要使用每个管道而不是在dockerfile中创建用户,这使我陷入了另一场困境-使Jenkins用户足够创建和删除用户的权限等等...

此外,由于默认情况下会话凭据存储在〜/ .azure / accessTokens.json和azureProfile.json文件中,因此从理论上讲,我可以为每次执行生成一个不同的目录,但是我找不到改变方法这些默认文件/位置在Azure文档中。

您认为解决此问题的最佳/简便方法是什么?

2 个答案:

答案 0 :(得分:0)

我会尝试保持az login不变,删除az account set并为每个命令使用--subscription参数。

您会看到~/.azure/azureProfile.json包含每个订阅的tenantId和用户信息,而~/.azure/accessTokens.json包含所有令牌。

因此,如果您每次明确订阅都精确,则将不会依赖于公共用户上下文。

我有Account 1个用于订阅xxxx-xxxx-xxxxx-xxxx,有Account 2个用于订阅yyyy-yyyy-yyyy-yyyy,我知道:

az login # Account 1
az login # Account 2
az group list --subscription "xxxx-xxxx-xxxxx-xxxx"
az group list --subscription "yyyy-yyyy-yyyy-yyyy"

,并且在相同的unix用户下效果很好

答案 1 :(得分:0)

设置AZURE_CONFIG_DIR环境变量可以实现here所描述的技巧。