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

时间:2018-10-25 05:21:45

标签: azure-cli azure-batch

在启动时,我需要将azure文件存储安装到Linux-Pool。我正在按照此处提供的说明来实现该目标:mounting Azure-File Storage to Batch具体在我的Azure CLI脚本中,在Pools启动命令下我要插入看起来像这样的东西

--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”目录,因此我的猜测是在池创建过程中没有发生挂载。我看到了一个与我面临的问题非常相似的问题:setting custom user identity for tasks,甚至Microsoft官方文档也详细讨论了这一问题:Run Tasks under User accounts in Batch,但都没有简要介绍了如何使用Azure CLI实现此目标。

为了安装特定的程序包以便可以挂载Azure文件存储,需要sudo特权,而我无法通过Azure-CLI做到这一点。为了重现错误,我建议您看一下:app to replicate the issue

我想要实现的是:

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

2)使用天蓝色的CLI以相同的自动用户和Admin Privileges运行任务

更新1: 我能够使用Azure CLI通过批处理装载Azure文件存储。我仍然无法使用在批处理节点上部署的应用程序的输出文件填充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%

部署在批处理节点上的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文件中的复制操作没有错误

请让我知道解决此问题的方法

1 个答案:

答案 0 :(得分:2)

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