多个 Runbook 在 AzureProfile.json 上被拒绝访问

Multiple runbooks get access denied on AzureProfile.json

我们已经在 Azure 自动化中设置了多个运行手册来备份数据库。

我们有 4 个 Runbook,一个对应我们希望备份的每个数据库。

这些 Runbook 中的每一个都调用一个子 Runbook (DBBackup。ps1),使用特定参数来识别要备份的数据库、生成的 blob 的文件名前缀等。

DBBackup.ps1 具有用于选择 Azure 帐户和订阅然后执行备份的代码。

我们有一个每天凌晨 1 点运行的单一计划,并且 4 个数据库运行手册链接到此计划。

有时一切正常。

我们最终得到的结果是,因为这些运行手册是 运行 并行的,有时当他们尝试设置帐户和订阅时,他们会收到以下错误:

The process cannot access the file 'C:\Users\Client\AppData\Roaming\Windows Azure Powershell\AzureProfile.json' because it is being used by another process. (The process cannot access the file 'C:\Users\Client\AppData\Roaming\Windows Azure Powershell\AzureProfile.json' because it is being used by another process.)

我不太确定在这里做什么,因为我认为 Runbook 会被隔离,因为它们 运行 作为单独的作业。

感谢任何帮助。

根据评论更新:

我意识到我可以将这一切包装在重试逻辑中。我想了解的是为什么我认为会相互隔离的四个独立作业正在尝试访问同一个本地文件。

作为我一夜之间结果的例子:

此列表中的第 2 个和第 4 个作业失败,因为 AzureProfile.json 被锁定。

当您 运行 在 Azure 上 运行 一本 Azure 自动化书籍(与混合工作者相比)时,会为 运行 该作业生成一个沙盒环境。出于保护目的,作业 运行 通常同时使用相同的沙箱环境。在这种情况下,似乎正在写入 AzureProfile.json 文件以存储您引用的订阅。由于您尝试为每本 运行 图书编写和更改订阅,因此会生成写入错误。要解决此问题,我建议您序列化 运行 书籍或同时创建多个 Azure 自动化帐户 运行 每个。


编辑:ASM cmdlet 有一个 Profile 参数作为 built-in 解决方法,但 ARM cmdlet 尚不支持。如果这对您有影响,我鼓励您在 GitHub (https://github.com/Azure/azure-powershell/issues/1257) 上对这个问题进行投票。同时,您可以使用下面的代码潜在地锁定沙箱,确保如果它们落在同一个沙箱中,线程就会被序列化。

$LockName = $pid
Write-Verbose "Using lock $lockName";
$Lock = New-Object System.Threading.Mutex($false, $LockName);
$Lock.WaitOne();
try
{

}
finally
{
    $Lock.ReleaseMutex();
    $Lock.Dispose();
}