Как запускать команды Azure CLI с помощью Python?

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

Например, я воспользуюсь следующей командой в Azure CLI, чтобы вывести список виртуальных машин в моей группе ресурсов:

"az vm list -g MyResourceGroup"

Но я хочу, чтобы сценарий python делал то же самое, где мне просто нужно включить команду CLI в программу python.

Просто любопытно: зачем пытаться вызывать команды CLI, если у вас уже есть доступный REST API управления, завернутый в SDK python? Интерфейс командной строки и различные SDK (включая python) построены на одном и том же REST API.

David Makogon 26.07.2018 21:23

его намного проще использовать cli, как LOT. мы использовали некоторые вызовы sdk и некоторые вызовы cli в нашем решении python. в основном из-за этого

4c74356b41 26.07.2018 21:26

ну, просто выполните стандартную команду оболочки, вот и все

4c74356b41 26.07.2018 21:26

Если вы хотите это сделать, вам нужен модуль subprocess. Прочтите введение, просмотрите примеры в «Замена старых функций», а затем используйте остальные в качестве справочника, чтобы помочь вам при необходимости конкретизировать детали.

abarnert 26.07.2018 21:28

Что ж, я могу получить всю необходимую информацию с помощью Python SDK и этих функций. Но я хотел использовать CLI для быстрой проверки. Так что мне не нужно заходить в программу и редактировать ее для небольших изменений. Но у меня есть несколько команд CLI, которые мне нужно запустить. Итак, я, хотя и использовал python для запуска этих команд CLI, было бы здорово.

I am L 26.07.2018 21:30

@ 4c74356b41 - в python sdk (list_resources()) определена функция для перечисления элементов в группе ресурсов. Если OP не делает что-то эзотерическое, все это встроено и не зависит от запущенных процессов оболочки.

David Makogon 26.07.2018 21:30

Кроме того, если вы пытаетесь вызвать объекты через PowerShell, и на вашем компьютере может быть cmd вместо PowerShell в качестве оболочки COMSPEC, это прямо не рассматривается ни в одном из примеров; вы хотите использовать shell=False и явно вызвать приглашение PowerShell as your command, passing your real command as the arguments. Basically the same way you'd do it from the cmd`.

abarnert 26.07.2018 21:31

Что ж, я не предлагаю использовать azure cli для этого конкретного вызова, но есть много случаев, когда использование cli намного проще, чем использование SDK, особенно когда вы ограничены во времени и знакомы с cli, но не с SDK. Я около года работал с Python SDK, мне это хорошо известно

4c74356b41 26.07.2018 21:38

Итак, как мне использовать Python для запуска Azure CLI?

I am L 26.07.2018 21:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
10
9
17 859
7

Ответы 7

поскольку вы все еще не удалили это, я предполагаю, что вы все еще ищете способ.

from subprocess import call   
call(["az", "vm", "list", "-g", "rgName"])

вам также нужно будет сначала выполнить автоматическую авторизацию с помощью чего-то вроде:

az login --service-principal -u http://sample-cli-login -p Test1234 --tenant 54826b22-38d6-4fb2-bad9-b7b93a3e9c5a

How to run Azure CLI commands using python?

Согласно этому файл. мы могли бы вызвать Azure CLI следующим образом:

from azure.cli.core import get_default_cli
get_default_cli().invoke(['vm', 'list', '-g', 'groupname'])

Примечание : Если вы получаете ошибку No module named 'azure.cli.command_modules', установите azure-cli

Я получаю указанную вами ошибку при упаковке приложения с помощью cx_freeze. Он отлично работает в формате .py. Есть мысли, почему упаковка ломается?

Vitalijs Arkulinskis 11.01.2021 02:14

Я думаю, вы можете использовать подпроцесс и вызвать z cli для получения вывода вместо использования get_default_cli. Ссылка Git Repo

import subprocess
import json

process = subprocess.Popen(['az','network', 'ddos-protection', 'list'], stdout=subprocess.PIPE)
out, err = process.communicate()
d = json.loads(out)
print(d)

Использование решения подпроцесса проблематично, поскольку подпроцесс не проверяет ПУТЬ, в котором находится Azure CLI, например. в Windows. Использование "cmd -c" было бы специфическим для Windows решением, и для дополнительной поддержки Linux потребуется вилка if / else.

Ответ @ tom-sun почти правильный, так как вы можете повторно использовать модули Python Azure CLI, поскольку CLI также написан на Python. Проблема в том, что возвращение инструкции .invoke () всегда возвращает код ошибки. Чтобы получить полный ответ тела, вы должны передать объект, подобный файлу, в списке аргументов базового кода Knack Code, чтобы получить ответ. По умолчанию это перенаправляет на StdOut, поэтому вы можете увидеть его, например. в вашем терминале, но вы всегда получаете ноль за успех.

Я написал небольшую вспомогательную функцию, которая принимает инструкции Azure CLI в одной строке (мне не нравится много аргументов в виде списка, он плохо читается - но это просто личное предпочтение, не вините меня). Он использует временный файл в качестве цели вывода, а затем он считывается обратно в память - это требуется, как правило, из базового кода CLI Knack; по умолчанию StdOut - это стандартный канал.

Требуется, чтобы у вас был установлен azure-cli для Python: pip install azure-cli

Файл azhelper.py:

from azure.cli.core import get_default_cli
import tempfile

def az_cli (args_str):
    temp = tempfile.TemporaryFile()
    args = args_str.split()
    code = get_default_cli().invoke(args, None, temp)
    temp.seek(0)
    data = temp.read().strip()
    temp.close()
    return [code, data]

Затем вы можете вызвать это так:

from azhelper import *

code, response = az_cli("vm list")
print("vm's: %s" % (response))

Конечно, вам нужно войти в систему, см. Ответ @ 4c74356b41.

Если кто-то найдет лучший способ справиться с ответом вместо временного файла, это будет очень полезно! Я пробовал использовать объект StringIO в памяти, но это почему-то не соответствует базовому коду Knack CLI.

Вместо этого используйте supprocess.Popen () и двоичный файл az. pipe json напрямую. Моя основная причина, по которой я не использую pypi azure-cli, заключается в том, что необходимо установить 335 МБ модулей, в то время как двоичный файл az (apt install azure-cli) занимает всего несколько секунд.

MortenB 01.04.2019 13:57

Мне нужно использовать tempfile.TemporaryFile (mode = "r +") и code = get_default_cli (). Invoke (args, out_file = temp) Но все остальные биты работают отлично !! Спасибо.

drWatson 11.10.2019 12:27

Используйте subprocess.run вместо subprocess.Popen

По умолчанию скрипт python будет ждать, пока программа не будет запущена из подпроцесса (в данном случае команда azure cli).

Например, давайте создадим приложение Azure AD.

import subprocess
import json

# create command you want to run on az cli as a string
create_app_command = "az ad sp create-for-rbac --skip-assignment --years 20 --name dummy_app"

# use 'shell = True' as Azure CLI installed on system is accessible from native shell
# using 'subprocess.PIPE' will return stderr and stdout to create_app object
create_app = subprocess.run(create_app_command, shell = True, stdout=subprocess.PIPE, stderr = subprocess.PIPE)

# reading output and error
create_app_stdout =  create_app.stdout.decode("utf-8")
create_app_stderr = create_app.stderr.decode("utf-8")

# now you can log error to a file 'logging.error(create_app_stderr)

# you can use stdout for further logic in code
# You get need to get appID and password for authentication somewhere later in code
ad_app_details = json.loads(create_app_stdout)
ad_app_appId = ad_app_details['appId']
ad_app_password = ad_app_details['password']

Для получения дополнительной информации об использовании модуля подпроцесса см. Ссылку это

Я занимаюсь этим последние пару дней. Метод, который предоставляет @cbehrenberg, в основном то, что я использовал, но я обнаружил, что вы можете сделать это без использования временного файла. Вместо этого перехватывайте вывод непосредственно из лазурного клиента. Думал, может быть полезно.

from azure.cli.core import get_default_cli

def az_cli (args_str):
    args = args_str.split()
    cli = get_default_cli()
    cli.invoke(args)
    if cli.result.result:
        return cli.result.result
    elif cli.result.error:
        raise cli.result.error
    return True

Затем вызывается таким же образом:

from azhelper import az_cli

response = az_cli("vm list")
print("vm's: %s" % (response))

Если вы хотите подавить вывод на стандартный вывод, вызовите cli следующим образом: cli.invoke(args, out_file = open(os.devnull, 'w'))

ChrisWue 30.10.2019 21:06

Когда я запускаю az ad sp list --display-name example-name --query "[].appId", я могу получить результат из z cli, но когда я вызываю это из скрипта Python, такого как run_az_cli('ad sp list --display-name example-name --query "[].appId"'), я не получаю никаких результатов. Это происходит, когда я включаю в строку --query "[] .appId". Почему-то cli не может получить результат, потому что я предполагаю, что библиотека не поддерживает что-то вроде --query "[] .appId"? Вы когда-нибудь пробовали что-нибудь подобное?

alpersilistre 28.04.2020 16:57

@alpersilistre Попробуйте удалить двойные кавычки вокруг вашего запроса - сегодня я столкнулся с этой проблемой. Причина, по которой двойные кавычки работают в оболочке, но не с функцией az_cli из этого ответа, заключается в том, что оболочка интерпретирует, а затем удаляет кавычки перед передачей аргументов в az cli. С другой стороны, функция python az_cli просто разделяется по пробелу, оставляя кавычки на месте.

Michi Werner 17.09.2020 23:39

Я получаю эту ошибку, когда запускаю это: CommandNotFoundError: 'az' is misspelled or not recognized by the system.

Sajal 18.01.2021 10:52

@Sajal - Я получал такое же сообщение об ошибке, потому что мы включаем "az" в начало аргументов. Поскольку интерфейс командной строки автоматически вызывает команду «z», нам не нужно включать ее в список аргументов.

adam 09.04.2021 10:46

Насколько я понимаю, в настоящее время рекомендуется использовать для этого библиотеки управления.

The SDK's management (or "management plane") libraries, the names of which all begin with azure-mgmt-, help you create, provision and otherwise manage Azure resources from Python scripts. All Azure services have corresponding management libraries.
With the management libraries, you can write configuration and deployment scripts to perform the same tasks that you can through the Azure portal or the Azure CLI.

Подробнее здесь: Предоставление ресурсов Azure и управление ими с помощью библиотек управления

Другие вопросы по теме