Azure Batch:使用 Azure CLI 在池创建期间提升用户权限

Azure Batch :Elevating the user privileges during Pool Creation using Azure CLI

我需要将 azure 文件存储挂载到 Linux-池旋转时-up.I 我按照此处给出的说明来实现:mounting Azure-File Storage to Batch 特别是在我的池启动命令下的 Azure CLI 脚本我正在插入看起来像这样的东西

--start-task-command-line="apt-get update && apt-get install cifs-utils && mkdir -p {} && mount -t cifs {} {} -o vers=3.0,username={},password={},dir_mode=0777,file_mode=0777,serverino".format(_COMPUTE_NODE_MOUNT_POINT, _STORAGE_ACCOUNT_SHARE_ENDPOINT, _COMPUTE_NODE_MOUNT_POINT, _STORAGE_ACCOUNT_NAME, _STORAGE_ACCOUNT_KEY)

但是当我 运行 批处理默认使用的自动用户的任务时,我在 stderr.txt 文件中收到一个错误,提示它无法创建“/mnt/MyAzureFileshare" 目录,所以我的猜测是在池创建期间没有发生挂载 process.I 看到了一个与我面临的问题非常相似的问题: and even the official Microsoft documentation goes over this in detail:Run Tasks under User accounts in Batch 但是 none 其中有一个了解如何使用 Azure CLI 实现这一目标。

为了安装特定的包以便安装 Azure 文件存储需要 sudo 权限,我无法通过 Azure-CLI 执行此操作。为了重新创建错误,我建议您看一下:app to replicate the issue

我要实现的是:

1) 创建一个安装了 Azure 文件存储的池,并使用 Azure CLI 将自动用户的权限提升到管理员级别

2) 运行 使用 azure CLI

具有管理员权限的相同自动用户的任务

更新 1: 我能够使用 Azure CLI 通过 Batch 安装 Azure 文件存储。我仍然无法使用我在 Batch Nodes.I 上部署的应用程序的输出文件填充 Azure 文件存储 stderr.txt 文件中没有错误。 stderr.txt 文件的输出是:

WARNING: In "login" auth mode, the following arguments are ignored: --account-key

Alive[################################################################]  100.0000%
Finished[#############################################################]  100.0000%

pdf--->png:   0%|          | 0/1 [00:00<?, ?it/s]
pdf--->png: 100%|##########| 1/1 [00:00<00:00,  1.16it/s]WARNING: In "login" auth mode, the following arguments are ignored: --account-key
WARNING: uploading /mnt/batch/tasks/workitems/pdf-processing-job-2018-10-29-15-36-15/job-1/mytask-0/wd/png_files-2018-10-29-15-39-25/akronbeaconjournal_20180108_AkronBeaconJournal_0___page---0.png

Alive[################################################################]  100.0000%
Finished[#############################################################]  100.0000%

部署在 Batch 节点上的 Python 应用程序是:

import os
import fitz
import subprocess
import argparse
import time
from tqdm import tqdm
import sentry_sdk
import sys
import datetime

def azure_active_directory_login(azure_username,azure_password,azure_tenant):
    try:
        azure_login_output=subprocess.check_output(["az","login","--service-principal","--username",azure_username,"--password",azure_password,"--tenant",azure_tenant])
    except subprocess.CalledProcessError:
        sentry_sdk.capture_message("Invalid Azure Login Credentials")
        sys.exit("Invalid Azure Login Credentials")

def download_from_azure_blob(azure_storage_account,azure_storage_account_key,input_azure_container,file_to_process,pdf_docs_path):
    file_to_download=os.path.join(input_azure_container,file_to_process)
    try:
        subprocess.check_output(["az","storage","blob","download","--container-name",input_azure_container,"--file",os.path.join(pdf_docs_path,file_to_process),"--name",file_to_process,"--account-key",azure_storage_account_key,\
        "--account-name",azure_storage_account,"--auth-mode","login"])
    except subprocess.CalledProcessError:
        sentry_sdk.capture_message("unable to download the pdf file")
        sys.exit("unable to download the pdf file")

def pdf_to_png(input_folder_path,output_folder_path):
    pdf_files=[x for x in os.listdir(input_folder_path) if x.endswith((".pdf",".PDF"))]
    pdf_files.sort()
    for pdf in tqdm(pdf_files,desc="pdf--->png"):
        doc=fitz.open(os.path.join(input_folder_path,pdf))
        page_count=doc.pageCount
        for f in range(page_count):
            page=doc.loadPage(f)
            pix = page.getPixmap()
            if pdf.endswith(".pdf"):
                png_filename=pdf.split(".pdf")[0]+"___"+"page---"+str(f)+".png"
                pix.writePNG(os.path.join(output_folder_path,png_filename))
            elif pdf.endswith(".PDF"):
                png_filename=pdf.split(".PDF")[0]+"___"+"page---"+str(f)+".png"
                pix.writePNG(os.path.join(output_folder_path,png_filename))


def upload_to_azure_blob(azure_storage_account,azure_storage_account_key,output_azure_container,png_docs_path):
    try:
        subprocess.check_output(["az","storage","blob","upload-batch","--destination",output_azure_container,"--source",png_docs_path,"--account-key",azure_storage_account_key,\
        "--account-name",azure_storage_account,"--auth-mode","login"])
    except subprocess.CalledProcessError:
        sentry_sdk.capture_message("Unable to upload file to the container")

def upload_to_fileshare(png_docs_path):
    try:
        subprocess.check_output(["cp","-r",png_docs_path,"/mnt/MyAzureFileShare/"])
    except subprocess.CalledProcessError:
        sentry_sdk.capture_message("unable to upload to azure file share ")

if __name__=="__main__":
    #Credentials 
    sentry_sdk.init("<Sentry Creds>")
    azure_username=<azure_username>
    azure_password=<azure_password>
    azure_tenant=<azure_tenant>
    azure_storage_account=<azure_storage_account>
    azure_storage_account_key=<azure_account_key>
    try:
        parser = argparse.ArgumentParser()
        parser.add_argument("input_azure_container",type=str,help="Location to download files from")
        parser.add_argument("output_azure_container",type=str,help="Location to upload files to")
        parser.add_argument("file_to_process",type=str,help="file link in azure blob storage")
        args = parser.parse_args()
        timestamp = time.time()
        timestamp_humanreadable= datetime.datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d-%H-%M-%S')
        task_working_dir=os.getcwd()
        file_to_process=args.file_to_process
        input_azure_container=args.input_azure_container
        output_azure_container=args.output_azure_container
        pdf_docs_path=os.path.join(task_working_dir,"pdf_files"+"-"+timestamp_humanreadable)
        png_docs_path=os.path.join(task_working_dir,"png_files"+"-"+timestamp_humanreadable)
        os.mkdir(pdf_docs_path)
        os.mkdir(png_docs_path)
    except Exception as e:
        sentry_sdk.capture_exception(e)
    azure_active_directory_login(azure_username,azure_password,azure_tenant)
    download_from_azure_blob(azure_storage_account,azure_storage_account_key,input_azure_container,file_to_process,pdf_docs_path)
    pdf_to_png(pdf_docs_path,png_docs_path)
    upload_to_azure_blob(azure_storage_account,azure_storage_account_key,output_azure_container,png_docs_path)
    upload_to_fileshare(png_docs_path)

上面 python 应用程序中的 upload_to_fileshare() 应该启动上传,但在我的情况下没有任何反应,stderr.txt 文件中的复制操作也没有错误

请告诉我解决此问题的方法

运行 提升的参数看起来不像是通过 CLI 的命令行参数公开的。但是,您可以为格式化为 REST API 对象的 --json 参数指定一个 JSON 文件以获取所有功能。