无法在自定义Azure DSC模块中找到类型[CloudFileDirectory]错误相关的程序集

时间:2016-11-02 08:47:41

标签: powershell azure dsc azure-automation

我已经创建了一个自定义模块作为PowerShell类,大致遵循Writing a custom DSC resource with PowerShell classes提供的说明。目的是连接到Azure文件存储并下载一些文件。我使用Azure自动化DSC作为我的拉服务器。

首先我要说的是,在运行PowerShell ISE时,代码可以实现。我将它上传到Azure时出了问题 - 我收到错误Unable to find type [CloudFileDirectory]。此类型说明符来自通过模块Azure.Storage引用的程序集,该模块肯定在我的自动化资产列表中。

在我的psm1文件的顶部,我有

Using namespace Microsoft.WindowsAzure.Storage.File

[DscResource()]
class tAzureStorageFileSync
{
    ...
    # Create the search context
    [CloudFileDirectory] GetBlobRoot()
    {
        ...
    }
    ...
}

我不确定这种情况下是否支持此Using,所以让我们称之为问题1

到目前为止,我已尝试过:

  • RequiredModules = @( "Azure.Storage" )添加到psd1文件
  • RequiredAssemblies = @( "Microsoft.WindowsAzure.Storage.dll" )添加到psd1文件
  • 将实际的Microsoft.WindowsAzure.Storage.dll文件发送到我上传的模块zip的根目录中(对其有一种可怕的气味)

当我使用New-AzureRmAutomationModule将模块部署到Azure时,它上传并处理得很好。 Extracting activities...步骤有效并且没有错误。

但是,当我编译配置时,编译过程因我提到的Unable to find type错误而失败。

我已考虑在Import-Module Azure.Storage声明之上添加class,但我之前从未见过其他地方。

问题2 我是否可以使用与Azure DSC使用的过程类似的过程进行本地编译,以便更快地测试更改?

问题3 有谁知道这里出了什么问题?

3 个答案:

答案 0 :(得分:0)

问题1/3: 如果在powershell中创建类并在其中使用其他类,请确保在加载包含新类的脚本文件之前存在这些类。

即: Loader.ps1:

  @Html.ListBoxFor(model => model.parameterName,
  ViewBag.ParameterValueList as MultiSelectList,
   new{
       data_placeholder = "Select Options ",
       @class = "chosen-select form-control"
   })

Powershell检查在解释脚本时是否找到您引用的所有类型,因此必须在发生之前加载所有类型。您可以通过创建首先加载所有依赖项的脚本文件并在此之后加载脚本来完成此操作。

答案 1 :(得分:0)

对于问题2,如果您将计算机注册为混合工作者,您将能够更快地运行脚本并在本地编译。 (有关混合工人的更多详情,https://azure.microsoft.com/en-us/documentation/articles/automation-hybrid-runbook-worker/)。

如果您想要一种简单的方法来注册混合工作者,您可以在本地计算机上运行此脚本(https://github.com/azureautomation/runbooks/blob/master/Utility/ARM/New-OnPremiseHybridWorker.ps1)。只需确保事先在您的机器上安装了WMF 5.

答案 2 :(得分:0)

为了在本地编写DSC配置和测试,我将查看https://www.powershellgallery.com/packages/AzureAutomationAuthoringToolkit/0.2.3.6上提供的Azure自动化ISE加载项。您可以通过从Administrator PowerShell ISE窗口运行以下命令来安装它。 安装模块AzureAutomationAuthoringToolkit -Scope CurrentUser

为了加载库,我还注意到我需要调用import-module才能调用方法。我需要做一些研究来确定对此的要求。您可以使用https://github.com/azureautomation/modules/tree/master/cAzureStorage

上的存储密钥查看我编写的用于从Azure存储复制文件的示例

由于您可能不希望在所有节点上部署存储库,因此我在上面的示例模块中包含了存储库,以便自动化服务将其自动分发到所有节点。

希望这有帮助, 埃蒙