Как запускать команды Azure CLI с использованием python?
Я хочу использовать Azure CLI, чтобы получить список всех виртуальных машин в моей группе ресурсов. Но я хочу реализовать то же самое с помощью скрипта Python.
Например, я буду использовать следующую команду в интерфейсе командной строки Azure для отображения виртуальных машин в моей группе ресурсов:
"az vm list -g MyResourceGroup"
Но я хочу, чтобы скрипт python делал то же самое, где мне просто нужно включить команду CLI в программу python.
7 ответов
Я осуществлял это за последние пару дней. Метод, который предоставляет @cbehrenberg - это в основном то, что я использовал, но я обнаружил, что вы можете сделать это без использования временного файла. Вместо этого ловите вывод непосредственно из лазурного клиента. Думал, что это может быть полезно.
from azure.cli.core import get_default_cli
import tempfile
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))
Как запускать команды Azure CLI с использованием python?
По этому файлу. мы могли бы вызвать интерфейс командной строки Azure следующим образом:
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
Использование решения для подпроцесса проблематично, так как подпроцесс не проверяет PATH, где находится CLI Azure, например, в Windows. Использование "cmd -c" было бы специфичным для Windows решением и нуждается в форке if / else для дополнительной поддержки Linux.
Ответ @ tom-sun почти верен, так как вы можете повторно использовать модули Python Azure CLI, поскольку CLI также написан на Python. Проблема в том, что при возврате инструкции.invoke() всегда возвращается код ошибки. Чтобы получить полный ответ тела, вы должны передать файл, подобный объекту, в список аргументов базового Knack Code, чтобы получить ответ. По умолчанию это перенаправляет на StdOut, поэтому вы можете видеть это, например, в своем терминале, но вы всегда получаете ноль за успех.
Я написал небольшую вспомогательную функцию, которая принимает инструкции CLI Azure в одной строке (мне не нравятся многие аргументы в виде списка, он не очень хорошо читается - но это всего лишь личное предпочтение, не вините меня). Он использует временный файл в качестве выходного целевого объекта и затем читает его обратно в память - это требуется на самом деле из базового кода Knack CLI; по умолчанию 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.
Насколько я понимаю, в настоящее время рекомендуется использовать для этого библиотеки управления.
Библиотеки управления (или «плоскость управления») пакета SDK, имена которых начинаются с azure-mgmt-, помогают создавать, подготавливать и иным образом управлять ресурсами Azure из сценариев Python. Все службы Azure имеют соответствующие библиотеки управления.
С помощью библиотек управления вы можете писать сценарии конфигурации и развертывания для выполнения тех же задач, что и через портал Azure или Azure CLI.
Подробнее здесь: подготовка ресурсов Azure и управление ими с помощью библиотек управления.
Я думаю, что вы можете использовать подпроцесс и вызвать az 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)
Так как вы все еще не удалили это, я предполагаю, что вы все еще ищете способ.
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
Использование 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=sbuprocess.PIPE, stderr = sbuprocess.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
# let's get you 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']
Для получения дополнительной информации об использовании модуля подпроцесса см. Эту ссылку