我有一个用于在Azure-IaC中配置基础结构的python脚本。该脚本主要使用Python SDK,但也运行多个Azure CLI命令-有时在Python SDK中找不到等效命令时需要使用该脚本。
我的目标是使用Azure Functions按需触发此脚本。在本地测试Azure函数时,一切正常,因为我在计算机上安装了Azure CLI,但是,当我将其发布到Azure函数时,我将遇到以下错误:/bin/sh: 1: az: not found
以下是我在Azure函数中触发的示例python函数(请注意,脚本的其余部分工作正常,因此我可以创建RG,SQL Server等,问题仅是az
命令)。我想知道,是否以及如何在Azure功能上安装Azure CLI以便能够运行CLI命令?
这是导致错误的python函数:
# Loging to AZ
call("az login --service-principal -u '%s' -p '%s' --tenant '%s'" % (client_id, client_secret, tenant_id), shell=True)
b2c_id = check_output("az resource show -g '<rg_name>' -n '<b2c_name>' --resource-type 'Microsoft.AzureActiveDirectory/b2cDirectories' --query id --output tsv", shell=True)
print("The B2C ID is: %s" % b2c_id)```
答案 0 :(得分:1)
我试图用HttpTrigger创建一个简单的Azure函数,以通过不同的方式调用Azure CLI工具,但是发布后再也无法在云上运行。
似乎唯一的解决方案是在将所需的软件包--build-native-deps
添加到func azure functionapp publish <your function app name>
文件中之后,使用命令azure-cli
的{{1}}选项将该功能发布为docker image。如下图所示,
还原依赖关系时出错。错误:无法安装antlr4-python3-runtime-4.7.2依赖关系:不支持不带轮子的二进制依赖关系。 使用--build-native-deps选项可使用Docker容器自动构建和配置依赖项。有关更多信息,请访问https://aka.ms/func-python-publish
由于我的本地没有docker工具,所以我没有成功运行requirements.txt
。
同时,运行Azure CLI命令不是使用Azure CLI功能的唯一方法。 func azure functionapp publish <your function app name> --build-native-deps
命令只是一个可运行的脚本文件,而不是二进制执行文件。在我回顾了az
和az
软件包的一些源代码之后,我认为您可以直接通过azure-cli
导入该软件包,并使用它执行与下面的代码相同的操作。>
from azure.cli.core import get_default_cli
该代码是通过引用from azure.cli.core import get_default_cli
az_cli = get_default_cli()
exit_code = az_cli.invoke(args)
sys.exit(exit_code)
软件包azure/cli/__main__.py
的源代码编写的,您可以从虚拟环境的azure-cli
路径中看到它。
希望有帮助。
答案 1 :(得分:0)
谢谢,彼得,我最终使用了类似的方法并使它正常工作。我有此函数,它将在需要时运行AZ CLI命令并返回结果(例如,例如,如果我需要运行cli命令但还存储输出,例如,如果我想知道服务的对象ID是什么,原则是,我可以得到如下例所示的结果:
def az_cli (args):
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
现在,我可以这样拨打电话了(client_id
是ServicePrincipal ID):
ob_id = az_cli(['ad', 'sp', 'show', '--id', client_id])
print(ob_id["objectId"])