为了账号安全,请及时绑定邮箱和手机立即绑定

Azure 函数 - 触发包含 Azure CLI 命令的 Python 脚本

Azure 函数 - 触发包含 Azure CLI 命令的 Python 脚本

三国纷争 2022-04-27 16:04:22
我有一个用于在 Azure 中预配基础架构的 python 脚本 - IaC。此脚本主要使用 Python SDK,但也运行多个 Azure CLI 命令 - 当我在 Python SDK 中找不到等效命令时,有时需要它。我的目标是使用 Azure Functions 按需触发此脚本。在本地测试 Azure 函数时,一切正常,因为我的机器上安装了 Azure CLI,但是,当我将其发布到 Azure 函数时,我会遇到以下错误:/bin/sh: 1: az: not found下面是我在 Azure 函数中触发的示例 python 函数(请注意,脚本的其余部分工作正常,所以我可以创建 RG、SQL 服务器等,问题只是az命令)。我想知道,我是否以及如何在 Azure Function 上安装 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)```
查看完整描述

2 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

我尝试使用 HttpTrigger 创建一个简单的 Azure 函数,以通过不同方式调用 Azure CLI 工具,但发布后从未在云上工作。

似乎唯一的解决方案是在将所需的包添加到文件中后,将该功能发布为带有--build-native-deps命令选项的docker 镜像,如下图所示,func azure functionapp publish <your function app name>azure-clirequirements.txt

//img1.sycdn.imooc.com//6268f91d00019cc709660251.jpg

恢复依赖项时出错。错误:无法安装 antlr4-python3-runtime-4.7.2 依赖项:不支持没有轮子的二进制依赖项。 使用 --build-native-deps 选项使用 Docker 容器自动构建和配置依赖项。更多信息,请访问https://aka.ms/func-python-publish


由于我本地没有 docker 工具,我没有成功运行func azure functionapp publish <your function app name> --build-native-deps.


同时,运行 Azure CLI 命令并不是使用 Azure CLI 功能的唯一方式。该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你可以从lib/python3.x/site-packages你的虚拟环境的路径中看到。


希望能帮助到你。


查看完整回答
反对 回复 2022-04-27
?
BIG阳

TA贡献1859条经验 获得超6个赞

谢谢,彼得,我最后使用了类似的东西并让它工作。我有这个函数,它将运行 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"])


查看完整回答
反对 回复 2022-04-27
  • 2 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信