在本快速入门中,你将使用 AzureCLI 或 Azure PowerShell 创建 Azure 服务主体,并通过 Ansible 向 Azure 进行身份验证。
在这篇文章中,你将学会如何:
- 使用 Azure CLI 创建 Azure 服务主体
- 使用 Azure PowerShell 创建 Azure 服务主体
- 将角色分配给 Azure 服务主体
- 从服务主体获取密钥信息
- 设置环境变量,以便 Ansible 可以检索服务主体值
- 测试服务主体
先决条件
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建 一个免费帐户 。
安装 Ansible:执行以下选项之一:
- 在 Linux 虚拟机上安装和 配置 Ansible
- 配置 Azure Cloud Shell
创建 Azure 服务主体
Azure 服务主体提供一个专用帐户,用于使用 Ansible 管理 Azure 资源。
运行以下代码以创建 Azure 服务主体:
az ad sp create-for-rbac --name ansible \
--role Contributor \
--scopes /subscriptions/<subscription_id>
注释
将输出中的密码存储在安全位置。
将角色分配给 Azure 服务主体
默认情况下,服务主体无权管理 Azure 中的资源。
运行以下命令,将 参与者 角色分配给服务主体:
az role assignment create --assignee <appID> \
--role Contributor \
--scope /subscriptions/<subscription_id>
将 <appID> 替换为从 az ad sp create-for-rbac 命令输出中提供的值。
注释
若要提高安全性,请将角色分配的范围更改为资源组而不是订阅。
获取 Azure 服务主体信息
若要使用服务主体向 Azure 进行身份验证,需要以下信息:
- 订阅ID (SubscriptionID)
- 服务主体 ApplicationId
- 服务主体密码
- TenantID
运行以下命令以获取服务主体信息:
az account show --query '{tenantId:tenantId,subscriptionid:id}';
az ad sp list --display-name ansible --query '{clientId:[0].appId}'
使用服务主体向 Azure 进行身份验证
运行以下命令以填充 Ansible 服务器上的所需环境变量:
export AZURE_SUBSCRIPTION_ID=<SubscriptionID>
export AZURE_CLIENT_ID=<ApplicationId>
export AZURE_SECRET=<Password>
export AZURE_TENANT=<TenantID>
将<SubscriptionID>、<ApplicationId>替换为你的服务主体帐户的<Password>和<TenantID>的值。
测试服务主体权限
运行以下命令以创建新的 Azure 资源组:
ansible localhost -m azure_rm_resourcegroup -a "name=<resource_group_name> location=<resource_group_location>"
替换 <resource_group_name> 和 <resource_group_location> 为新的资源组值。
[WARNING]: No inventory was parsed, only implicit localhost is available
localhost | CHANGED => {
"changed": true,
"contains_resources": false,
"state": {
"id": "/subscriptions/<subscriptionID>/resourceGroups/azcli-test",
"location": "eastus",
"name": "azcli-test",
"provisioning_state": "Succeeded",
"tags": null
}
}
运行以下命令以删除 Azure 资源组:
ansible localhost -m azure_rm_resourcegroup -a "name=<resource_group_name> state=absent force_delete_nonempty=yes"
将 <resource_group_name> 替换为资源组的名称。
[WARNING]: No inventory was parsed, only implicit localhost is available
localhost | CHANGED => {
"changed": true,
"contains_resources": false,
"state": {
"id": "/subscriptions/subscriptionID>/resourceGroups/azcli-test",
"location": "eastus",
"name": "azcli-test",
"provisioning_state": "Succeeded",
"status": "Deleted",
"tags": null
}
}