我正在使用Azure CLI对某些Azure VM执行运行状况检查。运行状况检查使用 bash 通过 Jenkins 阶段部署。阶段本身可能需要几个小时才能完成,在此期间,将执行多个 az"vm 运行命令",这些命令都需要正确的凭据。
我还有几个 Jenkins 管道,它们部署了不同的产品,并且应该能够并行运行。它们都具有相同的运行状况检查阶段。
当我执行"azlogin"以生成身份验证令牌和">az 帐户集"以设置订阅时,据我了解,此数据将写入配置文件 (~/.azure/azureProfile.json(。所以这很好,但是每当我在这个 Jenkins 容器上触发并行管道时,如果我使用不同的 Azure 订阅,配置文件自然会被不同的凭据覆盖,这会导致其他运行状况检查在下一次 vm 运行命令执行时失败,因为它正在寻找资源组, 存在于不同的订阅中。
我正在考虑在每个阶段运行中创建一个新的唯一 Linux 用户,然后在完成后将其删除,因此所有管道都将具有单独的配置文件。不过这有点棘手,因为这是一个使用 alpine 映像的 Jenkins docker 容器,我需要为每个管道创建用户,而不是在 dockerfile 中创建用户,这让我想到了另一个戏剧 - 给 Jenkins 用户足够的权限来创建和删除用户等等......
此外,由于会话凭据默认存储在 ~/.azure/accessTokens.json 和 azureProfile.json 文件中,理论上我可以为每个执行生成一个不同的目录,但我找不到一种方法来更改 Azure 文档中的这些默认文件/位置。
您认为解决此问题的最佳/更简单的方法是什么?
设置AZURE_CONFIG_DIR
环境变量可以完成此处所述的技巧。
我会尽量保持az login
原样,删除az account set
并为每个命令使用--subscription
参数。
可以看到~/.azure/azureProfile.json
包含每个订阅的 tenantId 和用户信息,~/.azure/accessTokens.json
包含所有令牌。
因此,如果每次都明确精确地进行订阅,则不会依赖于常见的用户上下文。
我有订阅xxxx-xxxx-xxxxx-xxxx
Account 1
,订阅yyyy-yyyy-yyyy-yyyy
Account 2
,我有:
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 用户下运行良好