Установка Azure CLI в Azure Stack Hub

Вы можете установить Azure CLI для управления Azure Stack Hub с помощью компьютеров Windows или Linux. В этой статье описаны шаги по установке и настройке Azure CLI.

Установка Azure CLI

  1. Войдите на рабочую станцию разработки и установите CLI. Для работы с Azure Stack Hub требуется Azure CLI версии 2.0 или выше.

    Важно!

    Из-за cve , влияющего на версии Azure CLI до 2.40.0, больше не рекомендуется использовать Azure CLI 2.29.2 для AD FS в Azure Stack Hub. Вы можете выполнить обновление до Azure CLI 2.40.0 или более поздней версии. Однако клиенты AD FS могут столкнуться с проблемами с командами Azure CLI, которые взаимодействуют с конечными точками Microsoft Graph. Это связано с тем, что Microsoft Graph не поддерживается для AD FS. Обходные пути для проблем с Microsoft Graph см. в разделе Общие известные проблемы .

  2. Вы можете установить CLI, выполнив действия, описанные в статье Установка Azure CLI.

  3. Чтобы проверить успешность установки, откройте окно терминала или командной строки и выполните следующую команду:

    az --version
    

    Отобразятся номера версий Azure CLI и зависимых библиотек, установленных на этом компьютере.

    Использование Azure CLI в расположении Python в Azure Stack Hub

  4. Запишите расположение Python в интерфейсе командной строки.

Добавление сертификата

Экспортируйте и импортируйте сертификат Azure Stack Hub для отключенных интегрированных систем и ASDK. Для подключенных интегрированных систем сертификат подписывается публично, и этот шаг не является обязательным. Инструкции см. в статье Настройка сертификатов для Azure CLI в Пакете средств разработки Azure Stack.

Подключение с помощью Azure CLI

В этом разделе описывается настройка интерфейса командной строки, если вы используете идентификатор Microsoft Entra в качестве службы управления удостоверениями и используете CLI на компьютере с Windows.

Подключение к Azure Stack Hub

  1. Если вы используете ASDK, доверяйте корневому сертификату ЦС Azure Stack Hub. Инструкции см. в разделе Доверие сертификату.

  2. Зарегистрируйте среду Azure Stack Hub, выполнив команду az cloud register.

  3. Зарегистрируйте среду. При выполнении команды az cloud register используйте следующие параметры:

    Значение Пример Описание
    Имя среды AzureStackUser Используйте AzureStackUser для пользовательской среды. Если вы оператор, укажите AzureStackAdmin.
    Конечная точка Resource Manager https://management.contoso.onmicrosoft.com ResourceManagerUrl в ASDK: https://management.local.azurestack.external/ResourceManagerUrl в интегрированных системах: https://management.<region>.<fqdn>/ Если у вас есть вопрос о конечной точке интегрированной системы, обратитесь к оператору облака.
    конечную точку службы хранилища; local.contoso.onmicrosoft.com local.azurestack.external используется для ASDK. Для интегрированной системы нужно использовать соответствующую конечную точку.
    Суффикс хранилища ключей .vault.contoso.onmicrosoft.com .vault.local.azurestack.external используется для ASDK. Для интегрированной системы нужно использовать соответствующую конечную точку.
    Идентификатор ресурса graph конечной точки 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>" 
    

    Справочник по команде register можно найти в справочной документации по Azure CLI.

  4. Следующие команды позволяют выбрать активную среду:

    az cloud set -n <environmentname>
    
  5. Укажите в конфигурации среды версию API, специально предназначенную для Azure Stack Hub. Чтобы изменить эту конфигурацию, выполните следующую команду:

    az cloud update --profile 2020-09-01-hybrid
    
  6. Войдите в среду Azure Stack Hub с помощью команды az login.

    Вы можете войти в среду Azure Stack Hub, используя свои учетные данные пользователя или субъект-службу (SPN), предоставленный оператором облака.

    • Войдите от имени пользователя.

      Вы можете указать имя пользователя и пароль непосредственно в команде 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
    

Проверка подключения

Завершив настройку, вы можете приступить к созданию ресурсов в Azure Stack Hub с помощью CLI. Например, можно создать группу ресурсов для приложения и добавить виртуальную машину. Используйте команду ниже, чтобы создать группу ресурсов с именем 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 CLI, а не поставщиками ресурсов Azure Stack Hub или другими службами Azure Stack Hub.

Проблемы с Microsoft Graph

Ниже приведены известные проблемы Microsoft Graph для Azure CLI 2.40.0 или более поздней версии для Azure Stack Hub. Это в первую очередь влияет на среды 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
    

    Дополнительные сведения о Key Vault REST API см. в справочнике по REST API Key Vault.

Другие проблемы

Ниже приведены проблемы, не ограничивающиеся конкретными версиями или диапазонами версий Azure CLI.

  • az role assignment create в настоящее время не поддерживается Azure CLI для 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 назначения ролей см. в статье о назначениях ролей.

Следующие шаги