快速入门:为 Ansible 创建 Azure 服务主体
在本快速入门中,将使用 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
- 服务主体应用程序 ID
- 服务主体密码
- 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
}
}