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

I a*_*m L 5 python azure azure-virtual-machine azure-powershell azure-cli

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

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

“ az vm列表-g MyResourceGroup”

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

joe*_*575 7

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

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
Run Code Online (Sandbox Code Playgroud)

然后以相同的方式调用:

from azhelper import az_cli

response = az_cli("vm list")
print("vm's: %s" % (response))
Run Code Online (Sandbox Code Playgroud)

  • 如果您想禁止输出到 stdout,请像这样调用 cli:`cli.invoke(args, out_file = open(os.devnull, 'w'))` (2认同)
  • @Sajal - 我收到了相同的错误消息,因为我们在参数的开头包含“az”。由于 CLI 自动调用“az”命令,因此我们不需要将其包含在 arg 列表中。 (2认同)

小智 6

使用子进程解决方案是有问题的,因为子进程不检查在 Windows 上找到 Azure CLI 的路径。使用“cmd -c”将是特定于 Windows 的解决方案,并且需要一个 fork if/else 以获得额外的 Linux 支持。

@tom-sun 的回答几乎是正确的,因为您可以重用 Azure CLI python 模块,因为 CLI 也是用 Python 编写的。问题是, .invoke() 指令的返回总是返回错误代码。要获得全身响应,您必须在底层 Knack 代码的参数列表上传递一个类似对象的文件来获得响应。默认情况下,这会重定向到 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]
Run Code Online (Sandbox Code Playgroud)

然后你可以这样调用:

from azhelper import *

code, response = az_cli("vm list")
print("vm's: %s" % (response))
Run Code Online (Sandbox Code Playgroud)

当然,您需要登录,请参阅@4c74356b41 答案。

如果有人找到更好的方法来处理响应而不是使用临时文件,我们将不胜感激!我尝试使用内存中的 StringIO 对象,但这在某种程度上不符合底层的 Knack CLI 代码。

  • 我必须使用 tempfile.TemporaryFile(mode = "r+") 和 code = get_default_cli().invoke(args, out_file=temp) 但所有其他位都工作得很好!谢谢。 (2认同)

Tom*_*SFT 5

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

根据此文件。我们可以通过以下方式调用Azure CLI:

from azure.cli.core import get_default_cli
get_default_cli().invoke(['vm', 'list', '-g', 'groupname'])
Run Code Online (Sandbox Code Playgroud)

注意:如果No module named 'azure.cli.command_modules'出现错误,请安装azure-cli

在此处输入图片说明


gen*_*egc 5

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

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

更多信息请参见:使用管理库配置和管理 Azure 资源


4c7*_*b41 3

既然你还没有删除这个,我假设你仍在寻找一种方法。

from subprocess import call   
call(["az", "vm", "list", "-g", "rgName"])
Run Code Online (Sandbox Code Playgroud)

您还需要首先使用以下内容进行静默身份验证:

az login --service-principal -u http://sample-cli-login -p Test1234 --tenant 54826b22-38d6-4fb2-bad9-b7b93a3e9c5a
Run Code Online (Sandbox Code Playgroud)