Azure经典门户中的Automation功能提供了非常方便的计划任务功能,可以让很多定时任务在Azure中完成,而不需要额外用本地的机器去执行计划任务,大大节省了成本。但是Azure Automation中提供的库毕竟有限,那么如果我们需要用到的DLL库不在其中,如何将其导入到Automation的“资产”中并进行引用呢?请看下文:
首先说明一下本地DLL的打包和导入方法:
-
以Microsoft.WindowsAzure.StorageClient.dll为例,我们要在Automation里面导入这个模块,调用其中的方法和对象,首先第一步,创建一个名为Microsoft.WindowsAzure.StorageClient的文件夹,将Microsoft.WindowsAzure.StorageClient.dll放到这个文件夹下,然后用zip压缩一下,结构是这样的:
Microsoft.WindowsAzure.StorageClient.zip
└Microsoft.WindowsAzure.StorageClient(文件夹)
└Microsoft.WindowsAzure.StorageClient.dll
-
接着将压缩包上传到Automation的资产(Assets)中:
导入完成:
导入完成后,需要在Runbook脚本中添加下面一行语句,才能够正常加载模块中的对象以及方法:
Add-Type -Path "C:\Modules\User\Microsoft.WindowsAzure.StorageClient\Microsoft.WindowsAzure.StorageClient.dll";
我们以快照还原脚本为例,在Runbook中写入下面的脚本用来还原一个vhd的snapshot:
workflowTestRunbook
{
InlineScript {
$Cred =Get-AutomationPSCredential -Name"XXXXXXX";
Add-AzureAccount -Credential$Cred -EnvironmentAzureChinaCloud;
Select-AzureSubscription -SubscriptionName"XXXXXXXX";
Add-Type -Path"C:\Modules\User\Microsoft.WindowsAzure.StorageClient\Microsoft.WindowsAzure.StorageClient.dll";
$creds =New-Object Microsoft.WindowsAzure.StorageCredentialsAccountAndKey("XXXXXXXXX","XXXXXXX");
$blobname = "XXXXXXXXXXXXXXXX.vhd";
$StorageAccountName ="XXXXXXXXXXXXXXXXX";
$blobUri = "https://" +$StorageAccountName + ".blob.core.chinacloudapi.cn/vhds/"
$blobPath = "Restored" +$blobname
#get the storage account key
$key = (Get-AzureStorageKey-StorageAccountName$StorageAccountName).Primary
#generate credentials based on the key
$creds =New-Object Microsoft.WindowsAzure.StorageCredentialsAccountAndKey($StorageAccountName,$key)
#create an instance of the CloudBlobClient class
$blobClient =New-Object Microsoft.WindowsAzure.StorageClient.CloudBlobClient($blobUri,$creds)
#and grab a reference to our target blob
$blob =$blobClient.GetBlobReference($blobPath)
$BlobOptions =New-Object Microsoft.WindowsAzure.StorageClient.BlobRequestOptions
$BlobOptions.BlobListingDetails="Snapshots"
$BlobOptions.UseFlatBlobListing=$true
$BlobSnapshots =$Blob.Container.ListBlobs($BlobOptions);
#Get all snapshots of specified blob
$Snapshots =$BlobSnapshots |Where{$_.Name-eq $blobName-and$_.SnapshotTime-ne$null}
#Starting recover blob
$blob.CopyFromBlob($Snapshots[0]);
}
}
参考链接:http://stackoverflow.com/questions/33615654/adal-in-azure-automation-type-not-loading-intermittantly