【问题标题】:Migrate local bash script with Azure CLI commands to Azure Powershell task in Azure DevOps使用 Azure CLI 命令将本地 bash 脚本迁移到 Azure DevOps 中的 Azure Powershell 任务
【发布时间】:2019-08-21 10:16:04
【问题描述】:

我目前有一个 bash 脚本,它运行一些 az 命令来清理存储帐户容器并将目录的内容上传到其中:

az storage blob delete-batch --account-name $ACCOUNT_NAME --source $web
az storage blob upload-batch --account-name $ACCOUNT_NAME -s $SOURCE_PATH -d $web

我想在 Azure DevOps Services 上运行的 Powershell Azure 任务中重复使用该功能,因为除了存储清理和上传之外,该脚本还有很多其他内容。

迁移它的最佳方法是什么?一直在查看 Powershell Azure 模块文档,但我找不到与 blob delete-batchblob upload-batch 对应的适当版本。

虽然直接调用 az 命令,但为此我必须登录,所以我需要一种方法在执行这些行之前将服务主体详细信息从 Powershell Azure 任务传递到 az login 命令。

欢迎任何想法。提前谢谢

【问题讨论】:

标签: azure-devops azure-powershell azure-cli


【解决方案1】:

使用 Azure PowerShell 通过服务主体登录 Azure

您可以使用以下脚本

$appId = "your application id "
$password = "your application secret"
$secpasswd = ConvertTo-SecureString $password -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ($appId, $secpasswd)

Add-AzureRmAccount -Credential $mycreds -Tenant "your tenat id" -ServicePrincipal

我可以使用 Azure CLI 命令“az storage blob upload-batch”上传一个 Azure 存储的本地目录。如何使用 Azure 实现它 PowerShell

Azure PowerShell 不提供这样的命令。它只提供命令Set-AzureStorageBlobContent 以允许客户将文件上传到 Azure 存储。所以你需要用命令编写一个脚本来实现如何将目录上传到 Azure 存储。例如

$StorageAccountKey=" "
$sourceFileRootDirectory=" "
$StorageAccountName=" "
$ContainerName=" "
$ctx = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
$container = Get-AzureStorageContainer -Name $ContainerName -Context $ctx

 if ($container) {
        $filesToUpload = Get-ChildItem $sourceFileRootDirectory -Recurse -File

        foreach ($x in $filesToUpload) {
            $blobName = ($x.fullname.Substring($sourceFileRootDirectory.Length + 1)).Replace("\", "/")

            Set-AzureStorageBlobContent -File $x.fullname -Container $container.Name -Blob $blobName -Context $ctx -Force:$Force 
        }
}

我可以使用 Azure CLI 命令“az storage blob delete-batch”来清理 一个容器。如何使用 Azure 实现它 PowerShell Azure PowerShell 不提供可用于直接删除一个容器中的所有 blob 的命令。所以我们需要编写一个脚本来实现它。现在,我们有两个选择

  1. 删除容器并创建一个同名的新容器
$StorageAccountKey=" "
$StorageAccountName=" "
$ContainerName=" "
$context = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
        Remove-AzureStorageContainer -Name $ContainerName -Context $context
        New-AzureStorageContainer -Name $ContainerName -Context $context
  1. 获取容器中的所有 blob,然后将其删除
$StorageAccountKey=" "
$StorageAccountName=" "
$ContainerName=" "
$Token = $null
$Total = 0
$MaxCount=5000
$context = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
do
 { 
     $Blobs = Get-AzureStorageBlob -Container $ContainerName -MaxCount $MaxCount  -ContinuationToken $Token -Context $context
     if($Blobs.Length -le 0) { Break;}
     $Token = $Blobs[$blobs.Count -1].ContinuationToken;

     foreach($blob in $blobs){
        Remove-AzStorageBlob -Blob $blob.Name -Container $ContainerName -Context $context

     }


 }
 While ($Token -ne $null)  

【讨论】:

  • 我会接受这个答案,因为它满足所有要求。不幸的是,我认为真的没有办法使用 Azure Powershell 批量上传或删除 blob。但是,我正在使用 AzCopy 命令测试此任务,以至少获得更好的上传性能。感谢@Jim Xu 的帮助
【解决方案2】:

为什么不在 Azure DevOps 中使用 Azure CLI 任务,该任务使用服务连接进行身份验证部分?请参阅文档here

【讨论】:

  • 因为我不想重写 Powershell 脚本中的其他步骤以完全使用 Az CLI 任务,正如我在最初的问题中提到的那样
  • 您可以将正在处理的脚本拆分为 A 部分 (PS)、B 部分 (CLI) 和 C 部分 (PS) ??
  • 如果没有其他更好的方法来解决这个问题......是的。重构为多个步骤是下一个方法
猜你喜欢
  • 2021-04-05
  • 1970-01-01
  • 2019-11-18
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
相关资源
最近更新 更多