快速入门:为 Ansible 创建 Azure 服务主体

在本快速入门中,将使用 AzureCLI 或 Azure PowerShell 创建 Azure 服务主体,并通过 Ansible 对 Azure 进行身份验证。

在本文中,学习如何:

  • 使用 Azure CLI 创建 Azure 服务主体
  • 使用 Azure PowerShell 创建 Azure 服务主体
  • 向 Azure 服务主体分配角色
  • 从服务主体获取密钥信息
  • 设置环境变量,以便 Ansible 可以检索服务主体的值
  • 测试服务主体

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。

创建 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-rba 命令的输出中提供的值。

注意

若要提高安全性,请将角色分配的作用域改为资源组而不是订阅。

获取 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
    }
}

后续步骤