如何通过Azure CLI或ARM模板在ADLS Gen2存储账户创建Blob容器及目录
实现方案
可以通过Azure CLI完成ADLS Gen2存储账户的Blob容器和内部目录创建,且支持仅在路径不存在时执行操作,可直接集成到Azure Pipeline中。
前置说明
ADLS Gen2开启了层级命名空间,目录是原生资源,无需用空Blob模拟,直接使用az storage fs系列命令操作即可,所有操作默认是幂等的,结合判断逻辑可以完全满足仅不存在时创建的需求。
Azure CLI 脚本实现
Bash 版本(适配Linux代理)
# 可直接替换为Azure Pipeline变量,如$(storageAccountName) STORAGE_ACCOUNT_NAME="实际存储账户名" FILE_SYSTEM_NAME="目标容器名" TARGET_DIR_PATH="目标目录路径,示例:data/logs/2024" # 校验容器是否存在,不存在则创建 fs_exists=$(az storage fs exists --name $FILE_SYSTEM_NAME --account-name $STORAGE_ACCOUNT_NAME --query "exists" -o tsv) if [ "$fs_exists" = "false" ]; then az storage fs create --name $FILE_SYSTEM_NAME --account-name $STORAGE_ACCOUNT_NAME echo "容器${FILE_SYSTEM_NAME}创建完成" else echo "容器${FILE_SYSTEM_NAME}已存在,跳过创建" fi # 校验目录是否存在,不存在则递归创建 dir_exists=$(az storage fs directory exists --file-system $FILE_SYSTEM_NAME --name $TARGET_DIR_PATH --account-name $STORAGE_ACCOUNT_NAME --query "exists" -o tsv) if [ "$dir_exists" = "false" ]; then az storage fs directory create --file-system $FILE_SYSTEM_NAME --name $TARGET_DIR_PATH --account-name $STORAGE_ACCOUNT_NAME --recursive echo "目录${TARGET_DIR_PATH}创建完成" else echo "目录${TARGET_DIR_PATH}已存在,跳过创建" fi
PowerShell 版本(适配Windows代理)
$STORAGE_ACCOUNT_NAME = "实际存储账户名" $FILE_SYSTEM_NAME = "目标容器名" $TARGET_DIR_PATH = "目标目录路径,示例:data/logs/2024" # 校验容器是否存在 $fs_exists = az storage fs exists --name $FILE_SYSTEM_NAME --account-name $STORAGE_ACCOUNT_NAME --query "exists" -o tsv if ($fs_exists -eq "false") { az storage fs create --name $FILE_SYSTEM_NAME --account-name $STORAGE_ACCOUNT_NAME Write-Host "容器$FILE_SYSTEM_NAME创建完成" } else { Write-Host "容器$FILE_SYSTEM_NAME已存在,跳过创建" } # 校验目录是否存在 $dir_exists = az storage fs directory exists --file-system $FILE_SYSTEM_NAME --name $TARGET_DIR_PATH --account-name $STORAGE_ACCOUNT_NAME --query "exists" -o tsv if ($dir_exists -eq "false") { az storage fs directory create --file-system $FILE_SYSTEM_NAME --name $TARGET_DIR_PATH --account-name $STORAGE_ACCOUNT_NAME --recursive Write-Host "目录$TARGET_DIR_PATH创建完成" } else { Write-Host "目录$TARGET_DIR_PATH已存在,跳过创建" }
Azure Pipeline 集成配置
直接使用内置的Azure CLI任务即可,无需额外配置权限,任务会自动使用配置的Azure服务连接进行身份验证,示例YAML如下:
- task: AzureCLI@2 inputs: azureSubscription: '你的Azure服务连接名称' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | STORAGE_ACCOUNT_NAME="$(storageAccountName)" FILE_SYSTEM_NAME="$(containerName)" TARGET_DIR_PATH="$(targetDirPath)" fs_exists=$(az storage fs exists --name $FILE_SYSTEM_NAME --account-name $STORAGE_ACCOUNT_NAME --query "exists" -o tsv) if [ "$fs_exists" = "false" ]; then az storage fs create --name $FILE_SYSTEM_NAME --account-name $STORAGE_ACCOUNT_NAME fi dir_exists=$(az storage fs directory exists --file-system $FILE_SYSTEM_NAME --name $TARGET_DIR_PATH --account-name $STORAGE_ACCOUNT_NAME --query "exists" -o tsv) if [ "$dir_exists" = "false" ]; then az storage fs directory create --file-system $FILE_SYSTEM_NAME --name $TARGET_DIR_PATH --account-name $STORAGE_ACCOUNT_NAME --recursive fi displayName: '校验并创建ADLS Gen2容器和目录'
可选:ARM模板实现
ARM模板本身是幂等的,部署时如果资源已存在会直接跳过创建,无需手动编写判断逻辑,示例模板如下:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "storageAccountName": { "type": "string" }, "containerName": { "type": "string" }, "directoryPath": { "type": "string" } }, "resources": [ { "type": "Microsoft.Storage/storageAccounts/blobServices/containers", "apiVersion": "2023-01-01", "name": "[concat(parameters('storageAccountName'), '/default/', parameters('containerName'))]", "properties": {} }, { "type": "Microsoft.Storage/storageAccounts/blobServices/containers/directories", "apiVersion": "2023-01-01", "name": "[concat(parameters('storageAccountName'), '/default/', parameters('containerName'), '/', parameters('directoryPath'))]", "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', parameters('storageAccountName'), 'default', parameters('containerName'))]" ], "properties": {} } ] }
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

