Как запустить сценарий Python в Azure DevOps с учетными данными Azure Resource Manager?

У меня есть сценарий Python, который я хочу запустить в контексте Azure Resource Manager в рамках задачи конвейера Azure DevOps, чтобы иметь доступ к ресурсам Azure (например, к Azure CLI или задачам Azure PowerShell).

Как передать в скрипт учетные данные конечной точки службы Azure RM, хранящиеся в Azure DevOps - как ServicePrincipal / Secret или OAuth Token?


person Kai Walter    schedule 11.11.2018    source источник


Ответы (2)


Зависит от того, что вы называете сценарием python, но в любом случае в Azure DevOps нет встроенной поддержки для аутентификации python sdk (или вашего настраиваемого сценария python), но вы можете передать учетные данные из переменных build \ release в свой сценарий или попробовать и вытащите это из Azure Cli (я думаю, что он хранит данные где-то в /home/.azure/.

person 4c74356b41    schedule 11.11.2018
comment
Хорошая подсказка. Спасибо. Я пытаюсь выполнить Azure CLI задачу, пакетный встроенный скрипт Windows python "$(Build.SourcesDirectory)\anyscript.py" "%USERPROFILE%\.azure\accessTokens.json" и проанализирую файл в скрипте PY. По-прежнему возникают проблемы, потому что авторизация для конечной точки управления не работает, но это может быть не связанной проблемой. - person Kai Walter; 11.11.2018
comment
это не связанная с этим проблема :) - person 4c74356b41; 11.11.2018
comment
Странно - я получаю requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://management.azure.com/subscriptions/... с токеном, хранящимся в CLI. Придется проверить размах. - person Kai Walter; 11.11.2018
comment
вам следует задать для этого новый вопрос и подумать о том, чтобы принять этот в качестве ответа;) - person 4c74356b41; 11.11.2018
comment
еще нет ;-) accessTokens.json содержит 56-значный accessToken, а не токен OAuth / Bearer, который мне нужен - person Kai Walter; 11.11.2018
comment
вам нужно использовать Azure cli step, а не только bash step. Я вижу действительные токены в этом файле после авторизации. как только я удалю файл, мне нужно будет повторно войти. как только я вхожу в систему, он заполняется токеном - person 4c74356b41; 11.11.2018
comment
Я использую шаг Azure CLI, но содержимое файла имеет формат [{"servicePrincipalId": "xxxx", "servicePrincipalTenant": "yyyy", "accessToken": "zzzz"}] - person Kai Walter; 12.11.2018
comment
в этом случае вам, вероятно, нужно вернуться к обработке аутентификации в скрипте - person 4c74356b41; 12.11.2018
comment
Задача Azure CLI входит в систему с участником-службой, поэтому формат accessToken.json отличается при входе в систему с помощью обычного пользователя. - person Kai Walter; 13.11.2018

на основе подсказки, данной 4c74356b41 выше, и с некоторым анализом Azure CLI Я создал эту функцию, которая позволяет извлекать токен OAuth через ADAL из Service Princial, вошедшего в Azure DevOps - задача Azure CLI

import os
import json
import adal

_SERVICE_PRINCIPAL_ID = 'servicePrincipalId'
_SERVICE_PRINCIPAL_TENANT = 'servicePrincipalTenant'
_TOKEN_ENTRY_TOKEN_TYPE = 'tokenType'
_ACCESS_TOKEN = 'accessToken'

def get_config_dir():
    return os.getenv('AZURE_CONFIG_DIR', None) or os.path.expanduser(os.path.join('~', '.azure'))

def getOAuthTokenFromCLI():
    token_file = (os.environ.get('AZURE_ACCESS_TOKEN_FILE', None)
              or os.path.join(get_config_dir(), 'accessTokens.json'))

    with open(token_file) as f:
        tokenEntry = json.load(f)[0] # just assume first entry

    tenantID = tokenEntry[_SERVICE_PRINCIPAL_TENANT]
    appId = tokenEntry[_SERVICE_PRINCIPAL_ID]
    appPassword = tokenEntry[_ACCESS_TOKEN]
    authURL = "https://login.windows.net/" + tenantID
    resource = "https://management.azure.com/"
    context = adal.AuthenticationContext(authURL, validate_authority=tenantID, api_version=None)
    token = context.acquire_token_with_client_credentials(resource,appId,appPassword)
    return token[_TOKEN_ENTRY_TOKEN_TYPE] + " " + token[_ACCESS_TOKEN]
person Kai Walter    schedule 13.11.2018
comment
Как получить этот _ACCESS_TOKEN? Могу ли я использовать ADAL с такими учетными данными приложения AAD для аутентификации в лазурном DevOps? - person AnjanaDyna; 13.06.2019
comment
@AnjanaDyna - я не уверен, но полагаю, что когда дело доходит до Azure DevOps, обойтись без PAT / токена личного доступа невозможно. - person Kai Walter; 15.06.2019
comment
Вы знаете, как добавить нового пользователя в azure DevOps? Используете клиентскую библиотеку Python или REST API? Я задал этот вопрос здесь: stackoverflow.com/questions/56591886/ Но пока не получил ответа. - person AnjanaDyna; 18.06.2019
comment
@AnjanaDyna - я бы использовал этот REST API: docs.microsoft.com/en-us/rest/api/azure/devops/ - person Kai Walter; 22.06.2019