在 Azure Stack Hub 上安裝 Azure CLI

您可以安裝 Azure CLI,以使用 Windows 或 Linux 機器來管理 Azure Stack Hub。 本文將逐步引導您完成安裝和設定 Azure CLI 的步驟。

安裝 Azure CLI

  1. 登入您的開發工作站並安裝 CLI。 Azure Stack Hub 需要有 Azure CLI 2.0 版或更新版本。

    重要

    由於 CVE 會影響 2.40.0 之前的 Azure CLI 版本,因此不再建議您在 Azure Stack Hub 中使用 Azure CLI 2.29.2 for AD FS。 您可以更新至 Azure CLI 2.40.0 或更高版本。 不過,AD FS 客戶可能會遇到與 Microsoft Graph 端點互動的 Azure CLI 命令問題。 這是因為 AD FS 不支援 Microsoft Graph。 如需 Microsoft Graph 問題的因應措施,請參閱 一般已知問題 一節。

  2. 您可以使用安裝 Azure CLI 一文中所述的步驟來安裝 CLI。

  3. 若要確認安裝是否成功,請開啟終端機或命令提示字元視窗,並執行下列命令:

    az --version
    

    您應該會看到 Azure CLI 的號碼和您電腦上安裝的其他相依程式庫。

    Azure Stack Hub Python 上的 Azure CLI 位置

  4. 記下 CLI 的 Python 位置。

新增憑證

匯出並匯入已中斷連線整合系統及 ASDK 的 Azure Stack Hub 憑證。 已連線的整合式系統會公開簽署憑證,因此不必進行此步驟。 如需指示,請參閱 在 Azure Stack 開發工具組上設定 Azure CLI 的憑證

使用 Azure CLI 連線

如果您使用的是Microsoft Entra識別碼作為身分識別管理服務,並在 Windows 電腦上使用 CLI,本節將逐步引導您設定 CLI。

連線至 Azure Stack Hub

  1. 如果您使用的是 ASDK,請信任 Azure Stack Hub CA 根憑證。 如需指示,請參閱信任憑證

  2. 執行 az cloud register 命令來註冊 Azure Stack Hub 環境。

  3. 註冊您的環境。 在執行 az cloud register 時使用下列參數:

    範例 描述
    環境名稱 AzureStackUser 針對使用者環境,請使用 AzureStackUser。 如果您是操作員,請指定 AzureStackAdmin
    Resource Manager 端點 https://management.contoso.onmicrosoft.com 在 ASDK 中的 ResourceManagerUrl 為:https://management.local.azurestack.external/;在整合式系統中的 ResourceManagerUrl 為:https://management.<region>.<fqdn>/。如果您有整合式系統端點的相關問題,請聯絡您的雲端操作員。
    儲存體端點 local.contoso.onmicrosoft.com local.azurestack.external 適用於 ASDK。 若為整合系統,請使用您系統的端點。
    Keyvault 尾碼 .vault.contoso.onmicrosoft.com .vault.local.azurestack.external 適用於 ASDK。 若為整合系統,請使用您系統的端點。
    端點 active directory 圖表資源識別碼 https://graph.windows.net/ Active Directory 資源識別碼。
    az cloud register `
        -n <environmentname> `
        --endpoint-resource-manager "https://management.<region>.<fqdn>" `
        --suffix-storage-endpoint "<fqdn>" `
        --suffix-keyvault-dns ".vault.<fqdn>" 
    

    您可以在 Azure CLI 參考文件中找到註冊命令的參考。

  4. 使用下列命令來設定作用中環境。

    az cloud set -n <environmentname>
    
  5. 將您的環境組態更新成使用 Azure Stack Hub 特定的 API 版本設定檔。 若要更新組態,請執行下列命令:

    az cloud update --profile 2020-09-01-hybrid
    
  6. 使用 az login 命令來登入 Azure Stack Hub 環境。

    您可以使用使用者認證,或雲端操作員提供的服務主體 (SPN),登入 Azure Stack Hub 環境。

    • 以「使用者」身分登入:

      您可以直接在 az login 命令內指定使用者名稱和密碼,或使用瀏覽器進行驗證。 如果您的帳戶已啟用多重要素驗證,則必須採用後者方式:

      az login -u "user@contoso.onmicrosoft.com" -p 'Password123!' --tenant contoso.onmicrosoft.com
      

      注意

      如果您的使用者帳戶已啟用多重要素驗證,請使用 az login 命令,而不需提供 -u 參數。 執行此命令可提供您一個 URL 以及必須用來進行驗證的代碼。

    • 使用服務主體來登入:

      在登入之前,請透過 Azure 入口網站或 CLI 建立服務主體,並為它指派角色。 現在,請使用下列命令登入:

      az login `
        --tenant <Azure Active Directory Tenant name. `
                  For example: myazurestack.onmicrosoft.com> `
      --service-principal `
        -u <Application Id of the Service Principal> `
        -p <Key generated for the Service Principal>
      
  7. 確認您的環境已正確設定,且為使用中的雲端。

        az cloud list --output table
    

    您應該會看到系統列出您的環境,且 IsActivetrue。 例如:

    IsActive    Name               Profile
    ----------  -----------------  -----------------
    False       AzureCloud         2020-09-01-hybrid
    False       AzureChinaCloud    latest
    False       AzureUSGovernment  latest
    False       AzureGermanCloud   latest
    True        AzureStackUser     2020-09-01-hybrid
    

測試連線

一切都已準備就緒後,請使用 CLI 在 Azure Stack Hub 中建立資源。 例如,您可以建立應用程式的資源群組並新增 VM。 若要建立名為 "MyResourceGroup" 的資源群組,請使用下列命令:

az group create -n MyResourceGroup -l local

如果資源群組成功建立,先前的命令會輸出新建立資源的下列內容:

{
  "id": "/subscriptions/84edee99-XXXX-4f5c-b646-5cdab9759a03/resourceGroups/RGCL11",
  "location": "local",
  "name": "RGCLI1",
  " properties ": {
    "provisioningState": "Succeeded"
  },
  "tags ": null
}

一般已知問題

大部分問題的一般修正是使用 az rest 使用目前 Azure Stack 內容的命令,針對與問題相關聯的命令進行 REST API 呼叫。 只要這些問題是由 Azure CLI 所造成,而不是 Azure Stack Hub 資源提供者或其他 Azure Stack Hub 服務,下列問題清單中的因應措施通常會針對其他 Azure CLI 問題進行調整。

Microsoft Graph 問題

這些是 Azure Stack Hub 的 Azure CLI 2.40.0 或更新版本已知 Microsoft Graph 問題。 這主要會影響 ADFS 環境,因為它不支援 Microsoft Graph。

  • az keyvault create 與 Microsoft Graph 互動。 以下是 ADFS 的範例因應措施。 主要是,因應措施會使用 Azure AD Graph 來擷取使用者資訊,例如 objectId ,而不是 Microsoft Graph。

    # First, sign into Azure CLI account you want to create the Key Vault from.
    # TODO: change the principal name to name of principal you want to create the key vault with.
    $principalNameLike = "CloudUser*"
    # TODO: change location to your preference.
    $location = "local"
    $aadGraph = az cloud show --query endpoints.activeDirectoryGraphResourceId --output tsv
    $tenantId = az account show --query tenantId --output tsv
    if ($aadGraph[-1] -ne '/')
    {
        $aadGraph += '/'
    }
    $userObject = az rest --method get --url "${aadGraph}${tenantId}/users?api-version=1.6" `
        | ConvertFrom-Json `
        | Select-Object -ExpandProperty value `
        | Where-Object {$_.userPrincipalName -like $principalNameLike}
    $body = '{
      "location": "' + $location + '",
      "properties": {
        "tenantId": "' + $tenantId + '",
        "sku": {
          "family": "A",
          "name": "standard"
        },
        "accessPolicies": [
          {
            "tenantId": "' + $tenantId + '",
            "objectId": "' + $userObject.objectId + '",
            "permissions": {
              "keys": [
                "get",
                "create",
                "delete",
                "list",
                "update",
                "import",
                "backup",
                "restore",
                "recover"
              ],
              "secrets": [
                "get",
                "list",
                "set",
                "delete",
                "backup",
                "restore",
                "recover"
              ],
              "certificates": [
                "get",
                "list",
                "delete",
                "create",
                "import",
                "update",
                "managecontacts",
                "getissuers",
                "listissuers",
                "setissuers",
                "deleteissuers",
                "manageissuers",
                "recover"
              ],
              "storage": [
                "get",
                "list",
                "delete",
                "set",
                "update",
                "regeneratekey",
                "setsas",
                "listsas",
                "getsas",
                "deletesas"
              ]
            }
          }
        ],
        "enabledForDeployment": true,
        "enabledForTemplateDeployment": true
      }
    }'
    $body | Out-File -FilePath (Join-Path -Path "." -ChildPath "body.json")
    $resourceGroupName = "testrg123"
    az group create -n $resourceGroupName -l $location
    $armEndpoint = az cloud show --query endpoints.resourceManager --output tsv
    if ($armEndpoint[-1] -ne '/')
    {
        $armEndpoint += '/'
    }
    $subscriptionId = az account show --query id --output tsv
    $keyVaultName = "testkv123"
    az rest --method put --url "${armEndpoint}subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.KeyVault/vaults/${keyVaultName}?api-version=2016-10-01" --body `@body.json
    # OPTIONAL: test access to the Key Vault.
    # az keyvault secret set --name MySecretName --vault-name $keyVaultName --value MySecret
    

    如需金鑰保存庫 REST API 的詳細資訊,請參閱 金鑰保存庫 REST API 參考

其他問題

以下是不限於特定版本或 Azure CLI 版本範圍的問題。

  • az role assignment create Azure CLI for Azure Stack Hub 目前不支援,因為舊的 API 問題。 Microsoft Entra識別碼或 ADFS 都需要下列因應措施。
    # First, sign into account with access to the resource that is being given access or a role to another user.
    # TODO: change the principal name to name of principal you want to assign the role to.
    $principalNameLike = "CloudUser*"
    # TODO: change role name to your preference.
    $roleName = "Owner"
    # TODO: change location to your preference.
    $location = "local"
    $aadGraph = az cloud show --query endpoints.activeDirectoryGraphResourceId --output tsv
    $tenantId = az account show --query tenantId --output tsv
    if ($aadGraph[-1] -ne '/')
    {
        $aadGraph += '/'
    }
    $userObject = az rest --method get --url "${aadGraph}${tenantId}/users?api-version=1.6" `
        | ConvertFrom-Json `
        | Select-Object -ExpandProperty value `
        | Where-Object {$_.userPrincipalName -like $principalNameLike}
    $roleDefinitionId = az role definition list --query "[?roleName=='${roleName}'].id" --output tsv
    $body = @{
        properties = @{
            roleDefinitionId = $roleDefinitionId
            principalId = $userObject.objectId
        }
    }
    $body | ConvertTo-Json | Out-File -FilePath (Join-Path -Path "." -ChildPath "body.json")
    $resourceGroupName = "testrg123"
    az group create -n $resourceGroupName -l $location
    $armEndpoint = az cloud show --query endpoints.resourceManager --output tsv
    if ($armEndpoint[-1] -ne '/')
    {
        $armEndpoint += '/'
    }
    $scope =  az group show --name $resourceGroupName --query id --output tsv
    $guid = (New-Guid).ToString()
    az rest --method put --url "${armEndpoint}${scope}/providers/Microsoft.Authorization/roleAssignments/${guid}?api-version=2015-07-01" --body `@body.json
    # OPTIONAL: test access to the resource group, or use the portal.
    # az login -u <assigned user name> -p <assigned user password> --tenant $tenantId
    # Test a resource creation command in the resource group:
    # az network dns zone create -g $resourceGroupName -n "www.mysite.com"
    
    如需角色指派 REST API 的詳細資訊, 請參閱角色指派一文

後續步驟