如何使用python运行Azure CLI命令?

时间:2018-07-26 19:15:40

标签: python azure azure-virtual-machine azure-powershell azure-cli

我想使用Azure CLI获取资源组中所有VM的列表。但是我想使用python脚本实现相同的功能。

例如,我将在Azure CLI中使用以下命令列出资源组中的VM:

“ az虚拟机列表-g MyResourceGroup”

但是,我希望python脚本执行相同的操作,而我只需要在python程序中合并CLI命令即可。

7 个答案:

答案 0 :(得分:2)

使用子流程解决方案是有问题的,因为子流程不会检查找到Azure CLI的PATH,例如在Windows上。使用“ cmd -c”将是Windows特定的解决方案,并且需要fork / ifse来获得其他Linux支持。

@ tom-sun的答案几乎是正确的,因为您可以重复使用Azure CLI python模块,因为CLI也是用Python编写的。问题是,.invoke()指令的返回总是返回错误代码。要获得完整的响应,必须在基础知识代码的参数列表中传递一个类似object的文件,以获取响应。默认情况下,它重定向到StdOut,这就是为什么您可以看到它的原因,例如在您的终端中,但您总是获得零。

我编写了一个小辅助函数,该函数在一个字符串中接受Azure CLI指令(我不喜欢列表中的许多参数,它读起来不太好-但这只是个人喜好,不要怪我) 。它使用一个临时文件作为输出目标,然后将其读回内存-这是基础Knack CLI代码所必需的;默认情况下,StdOut是标准管道。

这需要您为Python安装azure-cli: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代码。

答案 1 :(得分:1)

  

如何使用python运行Azure CLI命令?

根据此file。我们可以通过以下方式调用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

enter image description here

答案 2 :(得分:0)

由于您仍然没有删除此内容,因此我认为您仍在寻找一种方法。

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

答案 3 :(得分:0)

我认为您可以使用子进程并调用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)

答案 4 :(得分:0)

使用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']

有关使用子流程模块的更多信息,请参见this链接

答案 5 :(得分:0)

最近几天我一直在执行此操作。 @cbehrenberg提供的方法主要是我使用的方法,但是我发现无需使用临时文件就可以做到。而是直接从azure客户端捕获输出。认为这可能有用。

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))

答案 6 :(得分:0)

我的理解是,当前的建议是为此使用管理库。

<块引用>

SDK 的管理(或“管理平面”)库,其名称均以 azure-mgmt- 开头,可帮助您通过 Python 脚本创建、配置和管理 Azure 资源。所有 Azure 服务都有相应的管理库。
使用管理库,您可以编写配置和部署脚本来执行您可以通过 Azure 门户或 Azure CLI 执行的相同任务。

更多信息在这里:Provision and manage Azure resources with management libraries