我想使用Azure CLI获取资源组中所有VM的列表。但是我想使用python脚本实现相同的功能。
例如,我将在Azure CLI中使用以下命令列出资源组中的VM:
“ az虚拟机列表-g MyResourceGroup”
但是,我希望python脚本执行相同的操作,而我只需要在python程序中合并CLI命令即可。
答案 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
答案 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