Я хочу использовать Azure CLI, чтобы получить список всех виртуальных машин в моей группе ресурсов. Но я хочу реализовать то же самое с помощью скрипта Python.
Например, я воспользуюсь следующей командой в Azure CLI, чтобы вывести список виртуальных машин в моей группе ресурсов:
"az vm list -g MyResourceGroup"
Но я хочу, чтобы сценарий python делал то же самое, где мне просто нужно включить команду CLI в программу python.
его намного проще использовать cli, как LOT. мы использовали некоторые вызовы sdk и некоторые вызовы cli в нашем решении python. в основном из-за этого
ну, просто выполните стандартную команду оболочки, вот и все
Если вы хотите это сделать, вам нужен модуль subprocess. Прочтите введение, просмотрите примеры в «Замена старых функций», а затем используйте остальные в качестве справочника, чтобы помочь вам при необходимости конкретизировать детали.
Что ж, я могу получить всю необходимую информацию с помощью Python SDK и этих функций. Но я хотел использовать CLI для быстрой проверки. Так что мне не нужно заходить в программу и редактировать ее для небольших изменений. Но у меня есть несколько команд CLI, которые мне нужно запустить. Итак, я, хотя и использовал python для запуска этих команд CLI, было бы здорово.
@ 4c74356b41 - в python sdk (list_resources()) определена функция для перечисления элементов в группе ресурсов. Если OP не делает что-то эзотерическое, все это встроено и не зависит от запущенных процессов оболочки.
Кроме того, если вы пытаетесь вызвать объекты через 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`.
Что ж, я не предлагаю использовать azure cli для этого конкретного вызова, но есть много случаев, когда использование cli намного проще, чем использование SDK, особенно когда вы ограничены во времени и знакомы с cli, но не с SDK. Я около года работал с Python SDK, мне это хорошо известно
Итак, как мне использовать Python для запуска Azure CLI?






поскольку вы все еще не удалили это, я предполагаю, что вы все еще ищете способ.
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. Есть мысли, почему упаковка ломается?
Я думаю, вы можете использовать подпроцесс и вызвать 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) занимает всего несколько секунд.
Мне нужно использовать tempfile.TemporaryFile (mode = "r +") и code = get_default_cli (). Invoke (args, out_file = temp) Но все остальные биты работают отлично !! Спасибо.
Используйте 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'))
Когда я запускаю 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 Попробуйте удалить двойные кавычки вокруг вашего запроса - сегодня я столкнулся с этой проблемой. Причина, по которой двойные кавычки работают в оболочке, но не с функцией az_cli из этого ответа, заключается в том, что оболочка интерпретирует, а затем удаляет кавычки перед передачей аргументов в az cli. С другой стороны, функция python az_cli просто разделяется по пробелу, оставляя кавычки на месте.
Я получаю эту ошибку, когда запускаю это: CommandNotFoundError: 'az' is misspelled or not recognized by the system.
@Sajal - Я получал такое же сообщение об ошибке, потому что мы включаем "az" в начало аргументов. Поскольку интерфейс командной строки автоматически вызывает команду «z», нам не нужно включать ее в список аргументов.
Насколько я понимаю, в настоящее время рекомендуется использовать для этого библиотеки управления.
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 и управление ими с помощью библиотек управления
Просто любопытно: зачем пытаться вызывать команды CLI, если у вас уже есть доступный REST API управления, завернутый в SDK python? Интерфейс командной строки и различные SDK (включая python) построены на одном и том же REST API.