我要使用Azure CLI获取我的资源组中所有VM的列表。但是我想使用python脚本来实现相同的功能。
例如,我将在Azure CLI中使用以下命令列出我的资源组中的VM:
“az vm list -g MyResourceGroup”
但是,我想让python脚本做同样的事情,我只需要在python程序中包含CLI命令。
发布于 2019-05-03 05:51:38
在过去的几天里,我一直在实现这一点。@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
然后以相同的方式调用:
from azhelper import az_cli
response = az_cli("vm list")
print("vm's: %s" % (response))
发布于 2018-07-27 13:32:01
如何使用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
发布于 2018-10-22 02:29:19
使用子进程解决方案是有问题的,因为子进程不检查Azure CLI所在的路径,例如在Windows上。使用"cmd“将是一个特定于-c的解决方案,并且需要一个分支if/else才能获得额外的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对象,但不知何故这不符合底层的技巧CLI代码。
https://stackoverflow.com/questions/51546073
复制相似问题