DevOps的工作流程中所需要到各种各样的命令行工具,在 Azure 的环境中,不同的 DevOps 工具在运行之前,都必须先完成 Azuore 账号的登录认证。而且,最好是在非用户干预和交互的方式下,完成登录认证。在这种情况下就可以使用 Service Principal 的方式,来完成 Azure 账号的登录认证。本文介绍如何创建一个用于在命令行登录认证 Azure 的 Service Principal。
创建 Service Principal
首先你需要安装或者准备好 Azure CLI,然后使用 Azure CLI 命令行工具,创建一个 Service Principal 的命令如下:
|
|
参数说明:
--name
:Service Principal 的名称,这个名称可以随意指定,但是最好是有意义的名称,方便后续的管理。--role
:Service Principal 的角色,这里指定为Contributor
,表示这个 Service Principal 在 Azure 中的权限是Contributor
。--scopes
:Service Principal 的作用域,这里指定为/subscriptions/${SUBSCRIPTION}/resourceGroups/${RESOURCE_GROUP}
,表示这个 Service Principal 的作用域是${RESOURCE_GROUP}
资源组。${SUBSCRIPTION}
:是一个环境变量,用于指定 Azure 订阅 ID。${RESOURCE_GROUP}
:是一个环境变量,用于指定 Azure 资源组名称。
在上面的命令中,应该注意的是 --role
需要是权限合理的值。应该保持最小可用权限的原则,不要使用 Owner
这样的权限。如果你不知道应该使用什么权限,可以先使用 Contributor
权限,然后在后续的使用中,逐步降低权限。
在我最近的测试中,由于我需要在多个教程项目间切换不同的资源组,而且资源组都是短期的,用完了就用删除的资源组,删除整个资源组是彻底清除已用资源的一个好方法。因此我在 --scopes
这个参数中,最经常使用的 SP 作用范围是 –scopes /subscriptions/${SUBSCRIPTION} ,这样就可以在任何一个资源组中使用这个 SP 了。假如你需要在多个不同订阅之间工作,可以灵活的使用 ${SUBSCRIPTION} 这个环境变量,来指定不同的订阅 ID。
以上命令行的输出结果类似如下:
|
|
将 SP 的细节信息用于命令行变量
以上输出结果默认是 JSON 格式的,如果你需要将它直接用于命令行变量,可以使用 --query
参数,来指定输出的格式。例如,如果你需要将 appId
等的值,用于命令行变量,参考使用如下的命令:
|
|
以上命令中,使用了 jq
命令,来从 JSON 格式的输出中,提取出 appId
和 password
的值,并且分别用于命令行变量 SERVICE_PRINCIPAL
和 SERVICE_PRINCIPAL_SECRET
。这样的好处是,避免了手工的复制和粘贴,也避免了数据在命令行的泄露。但是,如果是用于测试目的的 SP,也可以将这三个变量的值,直接复制保持到一个安全的地方,方便后续的反复使用。
登录 Azure
使用以上准备好的 Service Principal 登录 Azure 的命令如下:
|
|
在以上三个变量都正确的情况下,运行完以上命令后,会输出当前登录的 Azure 账号的相关信息,类似如下:
|
|
这样,就完成了 Azure 账号的登录认证。
查看当前登录的 Azure 账号
如果不确定,当前是否已经登录,或者不确定在什么 Azure 的账号下,可使用以下命令,可以查看当前登录的 Azure 账号:
|
|
参考
❤️ Feature Photo by Miguel Á. Padriñán: https://www.pexels.com/photo/close-up-shot-of-keyboard-buttons-2882566/